这篇文章是对官方文档的翻译。详细的讲了网络的各种配置。
原文链接:Configuring networks | Ubuntu
Ubuntu 上的网络配置是通过 Netplan 来处理的,它提供了一种高级的、与发行版无关的方式,通过 YAML 配置文件来定义系统上的网络设置。
虽然 Netplan 是一个配置抽象呈现器,涵盖了网络配置的方方面面,但在此我们将概述 IP 地址、以太网设备、名称解析等底层系统元素。我们会在适当的地方参考相关的 Netplan 设置,但我们还是建议大家学习 Netplan 文档。
以太网接口
系统使用可预测的网络接口名称来识别以太网接口(Ethernet interfaces)。这些名称可以显示为
eno1
或
enp0s25
。但在某些情况下,接口仍可能使用内核
eth#
命名方式。
识别以太网接口
要快速识别所有可用的以太网接口,可以使用
ip 命令
,如下所示。
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00 brd 00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:e2:52:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.102.66.200/24 brd 10.102.66.255 scope global dynamic eth0
valid_lft 3257sec preferred_lft 3257sec
inet6 fe80::216:3eff:fee2:5242/64 scope link
valid_lft forever preferred_lft forever
lshw 命令
是另一个可以帮助识别系统所有可用网络接口的应用程序。该命令可提供有关特定适配器硬件功能的更多详细信息。在下面的示例中,lshw 显示了一个逻辑名称为 eth4 的以太网接口,以及总线信息、驱动程序详细信息和所有支持的功能。
sudo lshw -class network
*-network
description: Ethernet interface
product: MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s]
vendor: Mellanox Technologies
physical id: 0
bus info: pci@0004:01:00.0
logical name: eth4
version: b0
serial: e4:1d:2d:67:83:56
slot: U78CB.001.WZS09KB-P1-C6-T1
size: 10Gbit/s
capacity: 10Gbit/s
width: 64 bits
clock: 33MHz
capabilities: pm vpd msix pciexpress bus_master cap_list ethernet physical fibre 10000bt-fd
configuration: autonegotiation=off broadcast=yes driver=mlx4_en driverversion=4.0-0 duplex=full firmware=2.9.1326 ip=192.168.1.1 latency=0 link=yes multicast=yes port=fibre speed=10Gbit/s
resources: iomemory:24000-23fff irq:481 memory:3fe200000000-3fe2000fffff memory:240000000000-240007ffffff
以太网接口名称
以太网接口名称也可通过 Netplan 配置进行配置。如果要控制哪个接口接收特定的逻辑名称,可使用
match
和
set-name
字段。
match
字段用于根据 MAC 地址、驱动程序等标准查找适配器。
set-name
字段可用于将设备更改为所需的逻辑名称。
network:
version: 2
renderer: networkd
ethernets:
eth_lan0:
dhcp4: true
match:
macaddress: 00:11:22:33:44:55
set-name: eth_lan0
以太网接口设置
ethtool
是一个显示和更改以太网卡设置(如自动协商、端口速度、双工模式和网络唤醒)的程序。下面举例说明如何查看以太网接口的支持功能和配置设置。
sudo ethtool eth4
Settings for eth4:
Supported ports: [ FIBRE ]
Supported link modes: 10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: No
Supported FEC modes: Not reported
Advertised link modes: 10000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: No
Advertised FEC modes: Not reported
Speed: 10000Mb/s
Duplex: Full
Port: FIBRE
PHYAD: 0
Transceiver: internal
Auto-negotiation: off
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000014 (20)
link ifdown
Link detected: yes
IP 寻址
下面将介绍配置系统 IP 地址和默认网关的过程,以便在局域网和互联网上进行通信。
临时分配 IP 地址
对于临时网络配置,可以使用 ip 命令,该命令在大多数其他 GNU/Linux 操作系统中也能找到。使用 ip 命令进行的配置会立即生效,但这些设置并不持久,重启后会丢失。
要临时配置 IP 地址,可以按以下方式使用 ip 命令。修改 IP 地址和子网掩码,使其符合网络要求。
sudo ip addr add 10.102.66.200/24 dev enp0s25
然后就可以使用 ip 命令来设置链接的启动或关闭。
ip link set dev enp0s25 up
ip link set dev enp0s25 down
要验证 enp0s25 的 IP 地址配置,可以按以下方式使用 ip 命令:
ip address show dev enp0s25
10: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:e2:52:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.102.66.200/24 brd 10.102.66.255 scope global dynamic eth0
valid_lft 2857sec preferred_lft 2857sec
inet6 fe80::216:3eff:fee2:5242/64 scope link
valid_lft forever preferred_lft forever6
要配置默认网关,可按以下方式使用 ip 命令。修改默认网关地址,使其符合网络要求。
sudo ip route add default via 10.102.66.1
您还可以使用 ip 命令验证默认网关配置,如下所示:
ip route show
default via 10.102.66.1 dev eth0 proto dhcp src 10.102.66.200 metric 100
10.102.66.0/24 dev eth0 proto kernel scope link src 10.102.66.200
10.102.66.1 dev eth0 proto dhcp scope link src 10.102.66.200 metric 100
如果临时网络配置需要 DNS,可在
/etc/resolv.conf
文件中添加 DNS 服务器 IP 地址。一般来说, 不建议直接编辑 /etc/resolv.conf,但这是一个临时和非持久的配置。下面的示例显示了如何在 /etc/resolv.conf 中输入两个 DNS 服务器,应将其更改为适合自己网络的服务器。下一节将详细介绍 DNS 客户端配置的正确(持久)方法。
nameserver 8.8.8.8
nameserver 8.8.4.4
如果不再需要这些配置,并希望清除接口上的所有 IP 配置,可以使用带有 flush 选项的 ip 命令:
ip addr flush eth0
注意
使用 ip 命令刷新 IP 配置不会清除 /etc/resolv.conf 中的内容。您必须手动删除或修改这些条目(或重新启动),这也会导致重新编写 /etc/resolv.conf(它是 /run/systemd/resolve/stub-resolv.conf 的符号链接)。
动态分配 IP 地址(DHCP 客户端)
要配置服务器使用 DHCP 进行动态分配地址,请在 /etc/netplan/99_config.yaml 文件中创建 Netplan 配置。以下示例假定您配置的第一个以太网接口为 enp3s0。
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
然后可以使用 netplan 命令应用配置:
sudo netplan apply
静态 IP 地址分配
要配置系统使用静态地址分配,请在 /etc/netplan/99_config.yaml 文件中创建 netplan 配置。下面的示例假定您正在配置第一个以太网接口 eth0。更改地址、路由和名称服务器值,以满足网络要求。
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 10.10.10.2/24
routes:
- to: default
via: 10.10.10.1
nameservers:
search: [mydomain, otherdomain]
addresses: [10.10.10.1, 1.1.1.1]
然后可以使用 netplan 命令应用配置。
sudo netplan apply
注意
Ubuntu Bionic 18.04 LTS 中的 netplan 无法用to: default
语法去指定默认路由,应使用较旧的
gateway4: 10.10.10.1
字段去替代整个 routes: 块。
系统将环回接口(loopback interface)识别为 lo,默认 IP 地址为 127.0.0.1。可以使用 ip 命令查看。
ip address show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00 brd 00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
名称解析
名称解析(与 IP 网络有关)是将主机名映射到 IP 地址的过程,反之亦然,这样可以更容易地识别网络上的资源。下文将介绍如何使用 DNS 和静态主机名去正确配置系统,以此进行名称解析。
DNS 客户端配置
传统上,/etc/resolv.conf 文件是一个静态配置文件,很少需要更改,或者通过 DHCP 客户端钩子自动更改。
systemd-resolved
负责处理名称服务器配置,应通过 systemd-resolve 命令与之交互。Netplan 对 systemd-resolved 进行配置,以生成一份名称服务器和域的列表,并将其放入 /etc/resolv.conf,这是一个符号链接:
/etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
要配置解析器,请在 netplan 配置文件中添加适当的网络名称服务器 IP 地址。还可以添加可选的 DNS 后缀搜索列表,以匹配网络域名。生成的文件可能如下所示:
network:
version: 2
renderer: networkd
ethernets:
enp0s25:
addresses:
- 192.168.0.100/24
routes:
- to: default
via: 192.168.0.1
nameservers:
search: [mydomain, otherdomain]
addresses: [1.1.1.1, 8.8.8.8, 4.4.4.4]
搜索选项也可与多个域名一起使用,这样 DNS 查询将按输入顺序添加。例如,您的网络可能有多个要搜索的子域名;一个父域名
example.com
,以及两个子域名
sales.example.com
和
dev.example.com
。
如果您希望搜索多个域,您的配置可能如下:
network:
version: 2
renderer: networkd
ethernets:
enp0s25:
addresses:
- 192.168.0.100/24
routes:
- to: default
via: 192.168.0.1
nameservers:
search: [example.com, sales.example.com, dev.example.com]
addresses: [1.1.1.1, 8.8.8.8, 4.4.4.4]
如果您尝试 ping 名为
server1
的主机,系统会按以下顺序自动查询 DNS 的完全合格域名 (FQDN):
- server1.example.com
- server1.sales.example.com
- server1.dev.example.com
如果没有找到匹配项,DNS 服务器将提供 notfound 的结果,DNS 查询将失败。
静态主机名
静态主机名是本地定义的 主机名-IP 映射,位于
/etc/hosts
文件中。 默认情况下,hosts 文件中的条目优先于 DNS。这意味着,如果系统尝试解析一个主机名,但该主机名与 /etc/hosts 文件中的条目相匹配,系统将不会尝试在 DNS 中查找该记录。在某些配置中,尤其是不需要访问互联网时,可以方便地将与有限资源通信的服务器设置为使用静态主机名而不是 DNS。
下面是一个主机文件示例,其中一些本地服务器是通过简单的主机名、别名及其等效的完全合格域名(FQDN)来标识的:
127.0.0.1 localhost
127.0.1.1 ubuntu-server
10.0.0.11 server1 server1.example.com vpn
10.0.0.12 server2 server2.example.com mail
10.0.0.13 server3 server3.example.com www
10.0.0.14 server4 server4.example.com file
注意
在本例中,除了服务器正确名字和 FQDN 外,还为每台服务器提供了别名。server 1 被映射为 vpn,server 2 被映射为 mail,server 3 被映射为 www,server 4 被映射为 file。
名称服务交换机(NSS)配置
系统选择将主机名解析为 IP 地址的方法的顺序由 Name Service Switch(NSS)配置文件
/etc/nsswitch.conf
控制。如上一节所述,通常系统 /etc/hosts 文件中定义的静态主机名优先于 DNS 解析的名称。下面是 /etc/nsswitch.conf 文件中负责主机名查找顺序的一行示例。
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
files
首先尝试解析位于 /etc/hosts 中的静态主机名。mdns4_minimal
尝试使用Multicast DNS
(多播DNS)解析名称。[NOTFOUND=return]
表示前面的 mdns4_minimal 进程的任何not found
响应都应被视为权威响应,系统不应继续寻找回答。dns
表示传统的单播 DNS 查询。mdns4
表示多播 DNS 查询。
要修改这些名称解析方法的顺序,只需将 hosts: 字符串更改为自己选择的值即可。例如,如果您更喜欢使用传统的单播 DNS 而不是多播 DNS,可以如下所示更改 /etc/nsswitch.conf 中的字符串:
hosts: files dns [NOTFOUND=return] mdns4_minimal mdns4
桥接多个接口
桥接是一种更高级的配置,但在多种情况下都非常有用。一种情况是使用多个网络接口设置网桥,然后使用防火墙过滤两个网段之间的流量。另一种情况是在有一个接口的系统上使用网桥,允许虚拟机直接访问外部网络。 下面的示例涵盖了后一种情况:
通过编辑 /etc/netplan/ 中的 netplan 配置来配置网桥,为物理接口和网络输入适当的值:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: no
bridges:
br0:
dhcp4: yes
interfaces:
- enp3s0
现在应用配置启用网桥:
sudo netplan apply
新的网桥接口现在应该已启动并运行。
brctl
提供有关网桥状态的有用信息,控制哪些接口是网桥的一部分等。更多信息请参阅
man brctl
。
用于钩子脚本的 networkd-dispatcher
曾经使用过
ifupdown
的用户可能更熟悉如何在接口文件中使用钩子脚本(如 pre-up、post-up)。Netplan 目前不支持在配置定义中使用钩子脚本。
作为替代,用户可以通过 networkdd 中的
networkd-dispatcher
来实现这一功能。当达到特定网络状态时,该软件包会为用户和软件包提供挂钩点,以帮助对网络状态做出反应。
注意
如果您使用的是台式机(而非 Ubuntu 服务器),则网络由Network Manager
驱动–在这种情况下,需要使用
NM Dispatcher 脚本
。
Netplan FAQ 有一个很好的表格,比较了 ifupdown/systemd-networkd/network-manager 之间的事件时序。
需要注意的是,这些钩子是异步运行的;也就是说,它们不会阻止过渡到另一种状态。
Netplan 常见问题中还有一个将旧的 ifupdown 挂钩转换为 networkd-dispatcher 的示例。
版权归原作者 _VitaT 所有, 如有侵权,请联系我们删除。