Ubuntu20.04网络配置

参考文档:

https://netplan.readthedocs.io/en/latest/netplan-yaml/

https://www.360blogs.top/ubuntu20-04-netplan/

ubuntu新老版本、桌面版和服务器版在网络配置方面主要存在以下三点区别:

  • 老版本的net-tools套件不再默认支持,取而代之的是iproute2套件。
  • 老版本的ifup/down命令和基于/etc/network/interfaces配置文件的ip、网关配置方法不再支持,取而代之的是使用netplan命令和基于/etc/netplan/*.yaml文件的配置方法。
  • 桌面版默认使用图形化的NetworkManager管理网络,服务器版使用systemd-networkd管理网络(桌面版也可更改为此)。

iproute2套件的使用

老版的Linux常用ifconfigroutearpnetstat等命令行工具(统称为net-tools)来配置网络功能。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版已经完全抛弃了net-tools,只支持iproute2。Ubuntu20.04若要使用ifconfig等工具,需要自行安装net-tools套件。 取而代之的是iproute2,其是linux下管理控制TCP/IP网络和流量控制的新一代工具包。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言,net-tools的用法给人的感觉是比较乱,而iproute2的用户接口相对net-tools来说更加直观。比如,各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象。

iproute2 的核心命令是ip:

ip --help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
       ip [ -force ] -batch filename
where  OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
                   tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
                   netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
                   vrf | sr | nexthop }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
                    -h[uman-readable] | -iec | -j[son] | -p[retty] |
                    -f[amily] { inet | inet6 | mpls | bridge | link } |
                    -4 | -6 | -I | -D | -M | -B | -0 |
                    -l[oops] { maximum-addr-flush-attempts } | -br[ief] |
                    -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
                    -rc[vbuf] [size] | -n[etns] name | -N[umeric] | -a[ll] |
                    -c[olor]}

配置网络设备(相当于windows系统中打开网络设备,看到的若干个网卡),可以启用和禁用网卡,修改网卡的mac地址等。

  • ip link show: 显示网络设备列表
  • ip link show ens33: 显示指定网络设备的信息(ens33是我本机网卡的名字,须根据具体情况填写)
  • ip link set ens33 up|down: 启动或关闭ens33网卡

删除网卡: sudo ip link delete enp1s0.1

ip address

管理某个网络设备的IP协议(相当于windows系统打开某个网卡的属性),可以配置IP地址、网关地址等。

  • ip address show: 列出活动网卡的ip地址
  • ip address show ens33: 列出指定网卡的ip地址
  • ip address add|del 192.168.31.2/24 ens33: 为网卡ens33增加或删除ip地址/掩码

其它ip指令

  • ip addrlabel ipv6地址管理
  • ip route 管理路由表
  • ip rule 管理路由策略
  • ip neigh neigh是neighbor的缩写,用于管理局域网内的ARP表
  • ip maddr 多播地址管理
  • ip mroute 多播路由管理

查看套接字指令:ss和lsof -i

net-tools中还有一个查看套接字统计信息的netstat指令也很常用,在iproute2中被ss指令取代。

  • ss -l: 列出已监听端口的TCP连接
  • ss -a: 列出所有连接

还有一个类似功能的常用指令:lsof -i。lsof全称是list openfiles,列出打开的文件。在Linux中(包括网络套接字)都是文件。通过lsof -i则可以获取网络连接信息,还可以通过lsof -i:port反查指定port的进程号。

netplan命令和/etc/netplan/*.yaml配置文件

在老版的Ubuntu中,是通过/etc/network/interfaces文件进行静态IP地址的配置,通过/etc/resolv.conf进行DNS设置。Netplan 网络配置从 Ubuntu 18.04 开始首次引入,在新版的Ubuntu中,通过/etc/netplan/目录下的yaml文件进行IPDNS配置。打开该目录下的配置文件如下:

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
     dhcp4: no
     addresses: [192.168.31.2/24]
     gateway4: 192.168.1.1
     nameservers:
       addresses: [114.114.114.114]

这是ubuntu服务器版本的配置方法,如果是桌面版,可以使用可视化的NetworkManager来接管网络,则该配置文件的renderer字段可设置为:NetworkManager,后面的部分都删除。当然,桌面版也可以按照上文示例设置,而不使用NetworkManager。 该配置文件的书写格式上有几点需要注意:

  • ethernets中的网卡名可以通过ip link指令查看,此处的ens33是本人虚拟机的网卡,替换为你自己的。
  • 使用类似于python代码缩进的方式组织代码块。
  • 缩进一级至少为两个空格,且前后一致。
  • gateway4字段的ip地址不用中括号(只有一个)。
  • 本机addresses字段和域名服务器addresses字段都需要中括号,多个ip之间使用逗号分隔。

配置完成后,需要执行sudo netplan apply使配置生效。

再看另一个示例:

root@Ubuntu20.04:~# cat /etc/netplan/99-eth0.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      match:
        macaddress: 00:16:3e:00:08:54
      addresses: [10.180.43.126/21]
      gateway4: 10.180.47.253
      mtu: 1360
      routes:
        - to: 0.0.0.0/0
          via: 10.180.47.253

YAML格式

YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲。

YAML格式-多行缩进

数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:

house:
  family:
    name: Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

注意:

  1. 字串不一定要用双引号标识;
  2. 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
  3. 允许在文件中加入选择性的空行,以增加可读性;
  4. 在一个档案中,可同时包含多个文件,并用“——”分隔;
  5. 选择性的符号“…”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。

YAML格式-单行缩写

YAML也有用来描述好几行相同结构的数据的缩写语法,数组用’[]‘包括起来,hash用’{}‘来包括。因此,上面的这个YAML能够缩写成这样:

house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

NetworkManager失效的解决办法

桌面版Ubuntu可通过可视化的NetworkManager管理网络,类似于Windows系统的更改适配器选项。 但虚拟机安装的桌面版Ubuntu经常会因为虚拟机的挂起或者非正常关机导致NetworkManager失效。失效时,桌面右上角的设置菜单中可以看到“网络设备未托管”的提示。若出现该问题,可修改/etc/NetworkManager/NetworkManager.conf配置文件,将managed=False修改为True。修改配置文件后,重启NetworkManager服务:sudo service network-manager restart,则可修复问题。若此方法未能解决问题,则使用上一节介绍的netplan配置网络。

Netplan 介绍

参考文档:

https://www.jianshu.com/p/174656635e74

https://github.com/canonical/netplan/tree/main/examples

https://netplan.readthedocs.io/en/latest/netplan-yaml/

Netplan :抽象网络配置生成器 ,是一个用于配置 Linux 网络的简单工具。 通过 Netplan ,你只需用一个 YAML 文件描述每个网络接口需要配置成啥样即可。 根据这个配置描述, Netplan 便可帮你生成所有需要的配置,不管你选用的底层管理工具是啥。

工作原理

Netplan/etc/netplan/*.yaml 读取配置,配置可以是管理员或者系统安装人员配置; 也可以是云镜像或者其他操作系统部署设施自动生成。 在系统启动阶段早期, Netplan/run 目录生成好配置文件并将设备控制权交给相关后台程序。

netplan_1.webp

Netplan 目前支持以下两种 网络管理工具

  • NetworkManager
  • Systemd-networkd

一言以蔽之,从前你需要根据不同的管理工具编写网络配置,现在 Netplan 将管理工具差异性给屏蔽了。 你只需按照 Netplan 规范编写 YAML 配置,不管底层管理工具是啥,一份配置走天下!

使用指引

配置

很显然,没有配置, Netplan 啥都做不了。 最简单有用的配置片段如下:

network:
    version: 2
    renderer: NetworkManager

这个配置让 NetworkManager 管理所有网络设备 (默认,只要检测到以太网设备接线,便以 DHCP 模式启动该设备)。

使用 Systemd-networkd ,则不会自动启动网络设备; 每个需要启用的网卡均需要在 /etc/netplan 配置文件中指定配置。 网络配置示例如下:

network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
            optional: true
        enp0s8:
            addresses: [192.168.56.3/24]
            dhcp4: no
            optional: true
    version: 2

这个配置为 enp0s3 网卡开启 DHCP 自动获取地址; 为 enp0s8 网卡配置了一个静态 IP 192.168.56.3 ,掩码是 24 位。

命令

netplan 操作命令提供两个子命令:

  • netplan generate :以 /etc/netplan 配置为管理工具生成配置;
  • netplan apply :应用配置(以便生效),必要时重启管理工具;

因此,调整 /etc/netplan 配置后,需要执行以下命令方能生效: netplan apply

配置示例

DHCP

network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
    version: 2

静态配置

network:
    ethernets:
        enp0s8:
            addresses: [10.0.0.2/24]
            gateway4: 10.0.0.1
            nameservers:
                addresses: [8.8.8.8,8.8.4.4]
            dhcp4: no
    version: 2