作者 @飞洲人飞舟魂转载请注明出处.

一直以来对linux的网络管理不大明白,今天研究了一下网络的手动配置,现在记录一下.我使用Ubuntu20.04.1来进行演示.


介绍

首先我们先明确一些概念性的东西,剔除掉一下你对linux下网络管理的错误认知.

1.ip配置方式

ip配置方式有两种,一种是静态(static)方式,另一种是DHCP的方式.静态ip就是给网卡分配一个不动的ip;DHCP方式则要复杂些,以平常通过路由器连接互联网为例,路由器上运行有DHCP服务器,负责给各个设备分配ip,而各个设备则有DHCP客户端,用于和路由器通信,然后获取路由器分配给自己的ip地址(获取了ip之后当然要调用底层的工具来配置网卡ip).DHCP方式分配的ip可能是会变化的,而static方式则不会.

2.linux上的底层网络命令

现在最常见的有两组网络命令,net-tools和iproute2(参考archlinux wiki).如下图是这两组工具集中常用命令的对应关系,左边的是net-tools包里的命令集,右边的则是较新的iproute2工具集.中文互联网教程上经常使用的ifconfig命令就是net-tools包里的.现在我们推荐使用iproute2工具集来管理网络,因为net-tools由于不再维护,会逐渐被废弃.我们最好不要混用这两组命令,造成混淆.

我们可以用这些底层命令来配置网络,连接到互联网,具体方法后面再说.



3.linux上的network manager

要知道用底层的网络管理命令来管理网络是要使用一长串的命令行的,对于一个linux普通用户来说十分麻烦,更不用说那些没接触过linux的小白用户了,因此network manager就出现了,它们可以自动配置你的网络,十分方便地连接到互联网.

下面就是一些常见的network manager,用户利用这些管理器提供的命令行界面或者是图形界面能很容易地配置自己ip是静态的还是DHCP的,配置自己的网关,还能配置自定义的dns等,甚至还可以很容易地连接到wifi.

但是我们需要注意的是:network manager是互斥的,即不可以同时利用多个network manager来管理网络连接;同时,在用network manager来管理网络连接的时候我们也不要手动地用底层网络命令来控制网络连接,因为网络管理器已经代替我们做了这些事,如果同时使用网络命令改变了网络的设置可能会造成网络连接的问题.


Ubuntu20.04.1上的网络管理器(network manager)

据我了解,ubuntu的两个网络管理器默认都是运行状态.使用下面两个命令来确认.

#使用下面两个命令查看两种网络管理器的状态.
> systmctl status NetworkManager
...(output)
>systemctl status systemd-networkd
...(output)

你应该能看到都是显示active的,那之前介绍里不是说了网络管理器是互斥的么?其实前面只是通俗地叫你最好不要这样用,只要保证网络配置不冲突即可,而Ubuntu发行版通过开发人员的配置已经避免了这两个管理器的冲突问题,具体如何如何做到,我也没有深入研究.

为了保证强迫症的需求,我们进行一个实验,输入如下命令:

#永久关闭systemd-networkd管理器
>sudo systemctl disable --now systemd-networkd

关闭systemd-networkd网络管理器后重启系统,你可以发现你仍然可以正常使用网络,没有任何变化.

systemd-resolved是networkd管理器的一个组成部分,不过你要是自作聪明地关闭systemd-resolved就会发现重启之后网络不对劲了:

>sudo systemctl disable --now systemd-resolved

这是因为在ubuntu中,NetworkManager的dns管理部分默认使用systemd-resolved提供的dns服务.而systemd-resolved用作域名解析,可以理解为DHCP客户端.若是关闭了systemd-resolved服务,dns解析就会出错,就不能正确访问网页了,但是你可以通过ping 命令发现虽然不可以ping通域名,却可以正常ping通ip,

>ping www.baidu.com //ping 错误
>ping 114.114.114.114 //可以ping通

手动配置网络并连接至互联网

下面就来进行我们本文的主题,不适用网络管理器,手动配置网络让我们的系统能正常上网.

首先你要将你前面所作的更改取消,让系统恢复原状.

第一步:关闭所有的网络管理器

为了避免由于手动配置网络而造成的网络冲突,我们需要关闭网络管理器,在ubuntu上,我们使用如下命令:

> systmctl disable --now NetworkManager
> systmctl disable --now systemd-networkd
>reboot

重启后,网络不可以正常使用,连ping 也ping不通

第二步:给网卡接口分配ip,并开启网卡接口

使用下面的命令给网卡分配ip地址

ip addr add [ip/madk] dev [interface]

我的linux虚拟机和宿主机是桥接的,宿主机与路由器通过通过wifi连接,因此我的宿主机,linux虚拟机,路由器应当处于同一网段.我路由器的ip为192.168.31.1,路由器的DHCP的ip范围是192.168.31.5到192.168.31.254,为了防止和DHCP池里的IP相冲突,我就将linux设为192.168.31.4,而我的网络接口名字为ens33,因此用命令如下来添加ip:

> sudo ip addr add 192.168.31.2/24 dev ens33

这时我的接口ens33还没有开启,你可以使用ip addr来看你的status是否是down状态,如果是,需要类似用下面的命令来开启接口:

>ip link set dev ens33 up

这个时候我们使用ping命令,发现可以通局域网下的主机:

>ping 192.168.31.1
>ping 192.168.31.212 //这是我宿主机的ip

第三步:添加路由条目

我们上一步发现可以ping通同一个局域网内的主机,但若是局域网外的ip就无法通了,如下:

>ping 114.114.114.114//ping 不通

这是由于我们没有设置路由导致的,如下图,我们局域网内可通是因为家用路由器并不是常规意义上的路由器(具体可参考:https://www.zhihu.com/question/369737960).局域网在家用路由器下是通过交换机连接的,不需要通过路由器路由.如果需要与外网交流,我们需要给linux加一条通过路由器的路由模块的路由条目.



我们这里使用ip route命令,对我来说是下面这个命令:

>sudo ip route add default via 192.168.31.1 dev ens33

添加完路由表我们会发现我们就可以ping通外网了.

第四步:手动配置dns服务器

ping通了外网还不行,我们这时是不能正常访问网页的,没了网络管理器后,想要正常上网,我们还必须手动配置dns服务器,这里我们使用之前提到过的啊 systemd-resolved提供的cli命令resolvectl来配置dns服务器,类似下面这样:

>resolvectl dns ens33 192.168.31.1

下面验证一下:

>ping www.baidu.com // 返回正常

这时我们就可以正常浏览网页了.

如何在linux上手动连接到互联网的更多相关文章

  1. 如何在 Linux 上安装应用程序

    如何在 Linux 上安装应用程序 编译自:https://opensource.com/article/18/1/how-install-apps-linux作者: Seth Kenlon原创:LC ...

  2. 如何在Linux上使用VIM进行.Net Core开发

    对于在Linux上开发.Net Core的程序员来说, 似乎都缺少一个好的IDE. Windows上有Visual Studio, Mac上有Visual Studio for Mac, 难道Linu ...

  3. [转帖]如何在Linux上使用命令行查看硬件信息

    如何在Linux上使用命令行查看硬件信息 时间:2016-01-13   作者:admin 分类:新手入门 阅读:126次 http://embeddedlinux.org.cn/emb-linux/ ...

  4. 如何在Linux上创建,列出和删除Docker容器

    本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供 ...

  5. 关于如何在Linux上使用Nugix反向代理部署net core3.1项目

    本文意在教大家如何在Linux上部署net core web项目,本人通过实践已经成功可以通过外网访问我部署在阿里云服务器上的站点. 一:需要用到的东西如下: 1:一个基于net core框架下的we ...

  6. 如何在linux 上配置NTP 时间同步?

    故障现象: 有些应用场景,对时间同步的要求严格,需要用到NTP同步,如何在linux上配置NTP时间同步? 解决方案: 在linux 上配置NTP 时间同步,具休操作步骤,整理如下: 1.安装软件包( ...

  7. 如何在Linux上通过grub添加内核参数

    转自Linux中国 我们可以在linux内核启动时为其提供各种各样的参数.这些参数可以自定义内核默认的行为,或者通知内核关于硬件的配置信息.内核参数应在内核启动时通过引导装载程序,如GRUB或LILO ...

  8. 如何在 Linux 上复制文件/文件夹到远程系统?

    从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一. 我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一.有很多办法都能处理这个任务,我们试着加以概括 ...

  9. springboot打成的jar包如何在Linux上持久运行

    一.首先说说在没有springboot的时候,项目是如何部署的? 1.动态web项目 动态web项目部署很方便,基本上上传文件到服务器的tomcat里面的webapps文件夹下即可完成部署.当然了,这 ...

随机推荐

  1. 分布式实时处理系统——C++高性能编程

    [前言]基于通信基础,介绍Hurricane实时处理系统的工程实现,主要使用C++语言. 一.IPC.socket.异步I/O epoll 二.C++11 1.linux内存管理中使用RALL原则,C ...

  2. std和stl的关系

    [前言]在写程序时,虽然一直这么用,有点疑惑为甚么引入了头文件.h还要在加上using namespace std?例如: 1 #include<iostream> 2 using nam ...

  3. JavaScript 模拟 sleep

    用 JS 实现沉睡几秒后再执行,有好几种方式,但都不完美,以下是我感觉比较好的一种方式 function sleep(time) { return new Promise((resolve) => ...

  4. CentOS7系统重置root密码

    https://blog.csdn.net/qq_42969074/article/details/88080821

  5. Hi3559AV100的VI细节处理说明

    因为项目后期涉及到MPP平台下的VI接口,现把有关视频输入VI模块的实现细节总结,也方便大家进一步了解. 1.整体概述 视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVD ...

  6. 653. 两数之和 IV - 输入 BST + HashSet

    653. 两数之和 IV - 输入 BST 题目描述 题解分析 最简单的方法就是遍历整棵树,找出所有可能的组合,判断是否存在和为 kk 的一对节点.现在在此基础上做一些改进. 如果存在两个元素之和为 ...

  7. 使用Groovy构建DSL

    DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言. 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单 ...

  8. JAVA -JSON-XML-MAP转换

      //定义一个MAP对象,将对象传给后端接口接收 Map a = ["api": '11', ZGUID: "1231",BESKZ: "1231& ...

  9. HDFS的上传流程以及windows-idea操作文件上传的注意

    HDFS的上传流程 命令:hdfs dfs -put xxx.wmv /hdfs的文件夹 cd进入到要上传文件的当前目录,再输入hdfs命令上传,注意-put后tab可以自动补全, 最后加上你要上传到 ...

  10. Eric Python IDE 论文数据图片生成

    Python编写,基于跨平台的Qt GUI工具包,集成了高度灵活的Scintilla编辑器控件. 大括号匹配,错误突出显示和可配置语法突出显示. 拼写检查库的集成 内置Python调试器,包括支持调试 ...