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

一直以来对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 搭建 RabbitMq 消息中间件

    前言 当系统中出现"生产"和"消费"的速度或稳定性等因素不一致的时候,就需要消息队列. 名词 exchange: 交换机 routingkey: 路由key q ...

  2. 判断app是否安装

    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromPar ...

  3. 清除浏览器默认样式的reset.css(转载于reset.css的官方)

    /* http://meyerweb.com/eric/tools/css/reset/ v2.0-modified | 20110126 License: none (public domain) ...

  4. ISC BIND9 - 最详细、最认真的从零开始的BIND 9 服务讲解

    DNS and BIND 服务的搭建说明 目录 目录 DNS and BIND 服务的搭建说明 1. 背景 1.1 DNS 1.2 FQDN 1.3 BIND 1.4 本文中搭建模拟DNS服务网络虚拟 ...

  5. 别再恐惧 IP 协议(万字长文 | 多图预警)

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  6. Hexo的详细搭建过程——小白的血泪经历QAQ

    Hexo的详细搭建过程 环境要求: node.js git 这里提供Centos8.2下的安装过程: dnf module list nodejs dnf module install nodejs: ...

  7. java基础知识 + 常见面试题

    准备校招面试之Java篇 一. Java SE 部分 1.1 Java基础 1. 请你解释Object若不重写hashCode()的话,hashCode()如何计算出来的? Object 的 hash ...

  8. [数据结构与算法-15]单源最短路径(Dijkstra+SPFA)

    单源最短路径 问题描述 分别求出从起点到其他所有点的最短路径,这次主要介绍两种算法,Dijkstra和SPFA.若无负权优先Dijkstra算法,存在负权选择SPFA算法. Dijkstra算法 非负 ...

  9. ORM思想解析

    ORM思想解析 qq_16055765 2019-01-10 11:29:08 1688 收藏 1 分类专栏: # hibernate 最后发布:2019-01-10 11:29:08首次发布:201 ...

  10. 反射的常用API

    反射的常用API 加载程序集 Assembly assembly = Assembly.Load("程序集名称"); // 从前目录加载程序集,提供程序集名称,无后缀 Assemb ...