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

一直以来对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. Java 8 中Sort排序原理:

    总的来说,java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序.Collections.sort方法底层就是调用的Arrays.sort方法. 快速排序主要是对那些基本类型数据 ...

  2. Java RPC 框架 Solon 1.3.7 发布,增强Cloud接口能力范围

    Solon 是一个微型的Java RPC开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC. ...

  3. deepin-terminal改造之路

    目录 1. 背景介绍 2. 下载源码 3. 依赖检查及安装 4. 改造之路 4.1 终端透明度快捷键 4.1.1 设置面板增加选项内容 4.1.2 添加配置解析内容 4.1.3 功能实现 4.1.4 ...

  4. Linux添加普通权限账号并授予root权限

    命令创建账号和密码 adduser Mysticbinary #添加一个Mysticbinary用户 passwd Mysticbinary # 输入密码 授予可以切换root的权限 修改/etc/s ...

  5. WEB容器开启、关闭OPTIONS方法

    发现 请求包随意,响应包信息如下: HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Vary ...

  6. 001-深度学习Pytorch环境搭建(Anaconda , PyCharm导入)

    001-深度学习Pytorch环境搭建(Anaconda , PyCharm导入) 在开始搭建之前我们先说一下本次主要安装的东西有哪些. anaconda 3:第三方包管理软件. 这个玩意可以看作是一 ...

  7. Java变量-常量-作用域

    public class Demo05 { /* 变量的命名规范:见名知意 1.类变量/实例变量/局部变量使用驼峰原则命名 2.类名使用Pascal命名法 3.常量名使用大写字母和下划线 4.驼峰原则 ...

  8. JavaScript初级学习

    1. JavaScript的介绍 前身是LiveScript+JavaScript JavaScript(js)是一个脚本语言 基于浏览器的脚本语言 基于对象,面向对象的一个编程语言 2. EcmaS ...

  9. 如何在 C# 8 中使用 Channels

    在面对 生产者-消费者 的场景下, netcore 提供了一个新的命名空间 System.Threading.Channels 来帮助我们更高效的处理此类问题,有了这个 Channels 存在, 生产 ...

  10. 推荐一个能让谷歌浏览器变暗色的插件(darkreader)

    下载 https://codechina.csdn.net/mirrors/darkreader/darkreader?utm_source=csdn_github_accelerator 安装教程 ...