netplan网络配置
本文转自 cloud-atlas 并作补充
Ubuntu发行版默认使用 netplan.io 配置网络接口,例如我在在 树莓派Ubuntu网络设置 中就使用了netplan。netplan支持后端使用
networkd或者network-manager进行管理配置。
netplan简介
激活netplan
Ubuntu在服务器版本默认激活了netplan来配置管理网络,但是在桌面版本,则默认使用NetworkManager管理网络。例如 Jetson Nano快速起步 可以看到Jetson使用Ubuntu的18.04桌面版本,所以我们需要安装并激活netplan。
安装netplan:
1 apt install netplan.io备注
在
Ubuntu 18.04.4 LTS上,提供了2个软件包:
1
2 netplan
netplan.io建议完整安装
netplan.io,这个版本跟随 netplan.io 官方更新,修复了一些问题。当前
Ubuntu 20.04.3 LTS已默认安装netplan.io,不再提供旧版本netplan
使用netplan配置静态IP
对于Kubernetes master等服务器,我期望IP地址是固定的IP地址,所以准备配置static IP。不过,Ubuntu 18系列的静态IP地址配置方法和以前传统配置方法不同,采用了
.yaml配置文件,通过netplan网络配置工具来修改。备注
根据Ubuntu的安装不同,有可能你的安装并没有包含Netplan,则依然可以采用传统的Debian/Ubuntu配置静态IP的方法,即直接修改
/etc/network/interfaces来实现。不过,从Ubuntu 17.10 开始,已经引入了 Netplan 网络配置工具。Netplan允许通过YAML抽象来配置网络接口,在
NetworkManager和systemd-networkd网络服务(引用为renderers)结合共同工作。Netplan会读取
/etc/netplan/*.yaml配置文件来设置所有的网络接口。
列出所有激活的网络接口
使用
ifconfig命令列出所有网络接口:
1 ifconfig -a例如,看到的输出数据(DHCP):
1
2
3
4
5
6
7
8 ens2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.61 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::5054:ff:fe97:c338 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:97:c3:38 txqueuelen 1000 (Ethernet)
RX packets 382 bytes 45170 (45.1 KB)
RX errors 0 dropped 84 overruns 0 frame 0
TX packets 165 bytes 22890 (22.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 默认在
/etc/netplan目录下有一个01-netcfg.yaml内容如下:netplan初始DHCP配置
1
2
3
4
5
6
7
8 # This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
ens2:
dhcp4: yes备注
如果安装操作系统的时候没有自动创建一个
YAML配置文件,可以通过以下命令先生成一个:
1 sudo netplan generate不过,对于Ubuntu的desktop, server, cloud版本,自动生成的配置文件会采用不同的名字,例如
01-network-manager-all.yaml或01-netcfg.yaml。
- 编辑
/etc/netplan/01-netcfg.yaml:netplan 静态IPP配置
1
2
3
4
5
6
7
8
9
10
11 network:
version: 2
renderer: networkd
ethernets:
ens2:
dhcp4: no
dhcp6: no
addresses: [192.168.122.11/24, ]
gateway4: 192.168.122.1
nameservers:
addresses: [192.168.122.1, ]
执行以下命令生效(注意在控制台执行,否则网络会断开):
1 sudo netplan apply验证检查
ifconfig -a可以看到IP地址已经修改成静态配置IP地址
netplan配置一个网卡多个IP
有时候需要在一个网卡上配置多个IP地址,实现单臂网桥路由,netplan也支持 interface alias 。配置方法很简单:
1
2
3
4
5
6
7
8
9 network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 10.100.1.38/24
- 10.100.1.39/24
gateway4: 10.100.1.1或者:
1
2
3 ethernets:
enp3s0:
addresses: [ 10.100.1.38/24, 10.100.1.39/24 ]执行
netplan apply可以看到系统网卡:
1
2 enp3s0
enp3s0:1分配了IP地址
10.100.1.38和10.100.1.39
netplan配置有线802.1x认证
企业网络常常会使用802.1x网络实现认证,不仅无线可以通过这种方式加强安全,有线网络也可以实现。netplan也支持在有线网络上加上认证功能,配置案例有些类似后文
WPA Enterprise无线网络,案例01-eno4-config.yaml如下:netplan 802.1x配置
1
2
3
4
5
6
7
8
9
10
11
12
13 network:
version: 2
renderer: networkd
ethernets:
eno4:
dhcp4: yes
dhcp6: no
macaddress: xx:xx:xx:xx:xx:xx
auth:
key-management: 802.1x
method: peap
identity: "USERNAME"
password: "PASSWD"然后执行
netplan apply即完成网络激活
netplan配置无线
连接开放无线网络
对于没有密码要求的无线网络,只需要定义access point:
1
2
3
4
5
6
7 network:
version: 2
wifis:
wlan0:
access-points:
"open_network_ssid_name": {}
dhcp4: yes
连接WPA Personal无线
对于采用WPA密码保护的无线网络,配置access-point和对应的password就可以。
配置
/etc/netplan/02-homewifi.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14 network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: yes
dhcp6: no
#addresses: [192.168.1.21/24]
#gateway4: 192.168.1.1
#nameservers:
# addresses: [192.168.0.1, 8.8.8.8]
access-points:
"network_ssid_name":
password: "**********"
WPA Enterprise无线网络
在企业网络中,常见的是使用 WPA 或 WPA2 Enterprise加密方式的无线网络,则需要添加认证信息。
以下案例是 WPA-EAP 和 TTLS 加密无线网络连接配置:
1
2
3
4
5
6
7
8
9
10
11
12
13 network:
version: 2
wifis:
wl0:
access-points:
workplace:
auth:
key-management: eap
method: ttls
anonymous-identity: "@internal.example.com"
identity: "joe@internal.example.com"
password: "v3ryS3kr1t"
dhcp4: yes以下案例是 WPA-EAP 和 TLS加密无线网络:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 network:
version: 2
wifis:
wl0:
access-points:
university:
auth:
key-management: eap
method: tls
anonymous-identity: "@cust.example.com"
identity: "cert-joe@cust.example.com"
ca-certificate: /etc/ssl/cust-cacrt.pem
client-certificate: /etc/ssl/cust-crt.pem
client-key: /etc/ssl/cust-key.pem
client-key-password: "d3cryptPr1v4t3K3y"
dhcp4: yes
netplan mac spoof
如果使用
networkd后端,则不支持wifi匹配,只能使用接口名字。以下为举例:
1
2
3
4
5
6
7
8
9 network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: yes
dhcp6: no
macaddress: xx:xx:xx:xx:xx:xx
...如果使用NetworkManager后端,还可以采用
match:方法:
1
2
3
4
5
6
7
8
9
10
11 network:
version: 2
renderer: networkd
wifis:
wlan0:
dhcp4: yes
dhcp6: no
match:
macaddress: yy:yy:yy:yy:yy:yy
macaddress: xx:xx:xx:xx:xx:xx
...
netplan配置bonding
简单active-backup bonding
参考原先安装虚拟机自动生成的
/etc/netplan/50-cloud-init.yaml注释内容,禁用cloud-init网络配置,即创建/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg内容如下:
1 network: {config: disabled}备份原配置:
1
2
3 cp /etc/netplan/50-cloud-init.yaml ~/
cd /etc/netplan
rm -f 50-cloud-init.yaml
编辑
/etc/netplan/01-netcfg.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
dhcp6: no
ens38:
dhcp4: no
dhcp6: no
bonds:
bond0:
interfaces: [ens33, ens38]
parameters:
mode: active-backup
mii-monitor-interval: 1
primary: ens33
addresses: [192.168.161.10/24, ]
gateway4: 192.168.161.1
nameservers:
addresses: [127.0.0.53, ]
bonding上增加VLAN
编辑
/etc/netplan/01-netcfg.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
dhcp6: no
eth1:
dhcp4: no
dhcp6: no
bonds:
bond0:
interfaces: [eth0, eth1]
parameters:
mode: active-backup
mii-monitor-interval: 1
primary: eth0
vlans:
bond0.22:
id: 22
link: bond0
addresses: [ "192.168.1.24/24" ]
gateway4: 192.168.1.1
nameservers:
addresses: [ "192.168.1.1", "192.168.1.17", "192.168.1.33" ]
search: [ "huatai.me", "huatai.net", "huatai.com" ]备注
Red Hat Enterprise Linux 7 Networking Guide Using Channel Bonding 提供了详细的参数设置,通常
miimon=time_in_milliseconds设置 100 表示100ms,也就是 0.1s 。不过这里我参考netplan文档设置为1s。有关 VLAN over bonding配置请参考 Netplan - configuring 2 vlan on same bonding
没有netplan配置systemd-networkd
实际上你可以不使用netplan也不使用NetworkManager就可以配置网络,因为 Systemd进程管理器 实际上提供了完整的系统配置功能。默认启动的
systemd-networkd接管了所有网络配置,所以手工添加配置也可以实现配置。所有的
systemd-networkd配置位于/etc/systemd/network/目录下,例如,enp0s25.network配置内容:
1
2
3
4
5
6
7 [Match]
Name=enp0s25
[Network]
Address=192.168.6.9/24
GATEWAY=192.168.6.10
DNS=192.168.6.10此时只需要重新加载一次
systemd-networkd就可以:
1 systemctl restart systemd-networkd
netplan问题排查
警告
netplan似乎不需要作为服务启动,而仅仅是作为一个前端工具,实际调用的是 networkd 和 NetworkManager来完成配置。我在Jetson Nano的Ubuntu 18.04使用netplan失败,似乎这个版本比较老,和现有netplan文档不能对齐,并且使用也很怪异,所以我还是使用 切换NetworkManager 重新切回NetworkManager进行管理。
以下是一些debug经验记录,仅供参考。
切换NetworkManager 之后,我在 NVIDIA Jetson 上将NetworkManager切换成netplan。但是,我发现
netplan apply之后,网卡上并没有绑定静态配置的IP地址。虽然看上去/etc/netplan/01-netcfg.yaml和原先在树莓派上运行的Ubuntu 20.04没有什么区别:
1
2
3
4
5
6
7
8
9
10 network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
dhcp6: no
addresses: [192.168.6.10/24, ]
nameservers:
addresses: [202.96.209.133, ]既然使用
networkd作为renderer,就应该生成systemd-networkd使用的配置文件,但是在/etc/systemd/network目录下没有生成任何配置文件。参考 networkd not applying config - missing events? 可以看到,需要使用
networkctl list查看一下网卡是否受到管理:
1 networkctl list果然,我输出显示:
1
2
3
4
5
6
7
8 IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 dummy0 ether off unmanaged
3 eth0 ether routable unmanaged
4 wlan0 wlan off unmanaged
5 l4tbr0 ether off unmanaged
6 rndis0 ether no-carrier unmanaged
7 usb0 ether no-carrier unmanaged对比树莓派上
networkctl list显示输出:
1
2
3
4 IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 eth0 ether routable configured
3 wlan0 wlan routable configured
networkctl
参考 networkctl — Query the status of network links
networkctl可以用于检查网络连线的状态是否被systemd-networkd看到。参考 systemd-networkd.service, systemd-networkd — Network manager :
systemd-networkd会管理在[Match]段落找到的.network文件中的任何连接来管理网络地址和路由。- 由于我执行
netplan apply没有生成对应的 networkd 配置文件,所以导致网络没有配置我尝试先创建空的
/etc/netplan目录,然后执行:
1 netplan -d generate显示:
1
2
3
4
5
6
7 netplan: netplan version 2.2 starting at Tue Oct 13 22:54:14 2020
netplan: database directory is /var/lib/plan/netplan.dir
netplan: user "netplan" is uid 63434 gid 63434
netplan: switching from user <root> to <uid 63434 gid 63434>
netplan: running with uid=63434 gid=63434 euid=63434 egid=63434
netplan: reading access list file /var/lib/plan/netplan.dir/.netplan-acl
netplan: netplan/tcp not found in /etc/services, using ports 2983 and 5444
仔细检查了
systemctl status netplan,发现原因了:没有激活netplan daemon:
1
2
3
4
5
6
7
8
9 ● netplan.service - LSB: Netplan calendar service.
Loaded: loaded (/etc/init.d/netplan; generated)
Active: active (exited) since Tue 2020-10-13 21:12:52 CST; 1h 47min ago
Docs: man:systemd-sysv-generator(8)
Process: 4631 ExecStart=/etc/init.d/netplan start (code=exited, status=0/SUCCESS)
10月 13 21:12:51 jetson systemd[1]: Starting LSB: Netplan calendar service....
10月 13 21:12:52 jetson netplan[4631]: Netplan daemon not enabled in /etc/init.d/netplan.
10月 13 21:12:52 jetson systemd[1]: Started LSB: Netplan calendar service..上述日志显示在
/etc/init.d/netplan中没有激活netplan服务,所以实际该服务状态是active(exited),也就是退出状态。编辑
/etc/init.d/netplan文件,将:
1
2 # Set ENABLED=0 to disable, ENABLED=1 to enable.
ENABLED=0修改成:
1
2 # Set ENABLED=0 to disable, ENABLED=1 to enable.
ENABLED=1
然后再次执行启动
netplan
1 systemctl start netplan此时提示:
1 Warning: The unit file, source configuration file or drop-ins of netplan.service changed on disk. Run 'systemctl daemon-reload' to reload units.所以按照提示执行:
1
2 systemctl daemon-reload
systemctl restart netplan启动之后再次检查
systemctl status netplan则可以看到状态:
1
2
3
4
5
6
7
8
9
10
11
12 ● netplan.service - LSB: Netplan calendar service.
Loaded: loaded (/etc/init.d/netplan; generated)
Active: active (running) since Tue 2020-10-13 23:07:44 CST; 1min 8s ago
Docs: man:systemd-sysv-generator(8)
Process: 8386 ExecStop=/etc/init.d/netplan stop (code=exited, status=0/SUCCESS)
Process: 8430 ExecStart=/etc/init.d/netplan start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 4174)
CGroup: /system.slice/netplan.service
└─8464 /usr/sbin/netplan
10月 13 23:07:43 jetson systemd[1]: Starting LSB: Netplan calendar service....
10月 13 23:07:44 jetson systemd[1]: Started LSB: Netplan calendar service..
但是比较奇怪,我执行
netplan -d generate始终不生成配置文件,仅提示:
1
2
3
4
5
6
7 netplan: netplan version 2.2 starting at Tue Oct 13 23:25:29 2020
netplan: database directory is /var/lib/plan/netplan.dir
netplan: user "netplan" is uid 63434 gid 63434
netplan: switching from user <root> to <uid 63434 gid 63434>
netplan: running with uid=63434 gid=63434 euid=63434 egid=63434
netplan: reading access list file /var/lib/plan/netplan.dir/.netplan-acl
netplan: netplan/tcp not found in /etc/services, using ports 2983 and 5444根据 netplan-generate - generate backend configuration from netplan YAML files 说明:
netplan generate是根据 netplan 的 yaml配置来调用networkd后端或者NetworkManager后端来生成对应后端服务的配置文件- 通常不需要独立运行
netplan generate,只需要运行netplan apply就可以,因为netplan apply会自动调用netplan generate,而netplan generate只是为了验证配置生成netplan会一次从以下3个位置读取配置文件,并且按照优先级,仅有一个位置的配置文件生效:
/run/netplan优先级最高/etc/netplan次优先级/lib/netplan最低优先级参考 netplan - Troubleshooting networking issues 当出现配置不能生成,需要将后端服务器启动成debug模式。例如,我使用
systemd-netowrkd则需要启用 DebuggingSystemd
1
2 sudo systemctl stop systemd-networkd
SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd但是我发现我执行
netplan generate和netplan apply都没有任何影响,似乎就没有连接上。虽然手工可以创建一个
/run/systemd/network/10-netplan-eth0.network填写内容:
1
2
3
4
5
6
7 [Match]
Name=eth0
[Network]
LinkLocalAddressing=ipv6
Address=192.168.6.10/24
DNS=202.96.209.133配置创建后,执行
networkctl就可以看到该eth0网卡是configured,似乎状态正常了。但是重启主机则网卡又是unmanaged并且/run/systemd/network目录又空了。发现一个蹊跷,执行
netplan -d -v generate显示输出:
1
2
3 netplan: netplan version 2.2 starting at Wed Oct 14 09:46:03 2020
netplan: database directory is /var/lib/plan/netplan.dir
...为何显示数据库目录是
/var/lib/plan/netplan.dir?我这个版本的netplan默认去读取了空白的
/var/lib/plan/netplan.dir,这个和官方文档不同。我尝试移除这个目录:
1
2 cd /var/lib
mv plan plan.bak再次启动
netplan -d -v generate显示:
1
2
3
4
5
6 netplan: netplan version 2.2 starting at Wed Oct 14 09:49:16 2020
netplan: database directory is /var/lib/plan/netplan.dir
netplan: user "netplan" is uid 63434 gid 63434
netplan: switching from user <root> to <uid 63434 gid 63434>
netplan: running with uid=63434 gid=63434 euid=63434 egid=63434
netplan: no read/write access to /var/lib/plan/netplan.dir/.: No such file or directory这个版本的netplan可能是早期版本( 实践是在 Ubuntu 18 上,安装了
netplan而没有安装更完整的netplan.io根据网友impl1874提供信息( use netplan.io please #10 ),需要通过完整安装netplan.io来修复这个问题。我在上文中补充说明,建议直接安装
netplan.io),只能固定读取/var/lib/plan/netplan.dir/,不使用/etc/netplan目录,导致我配置无效。我还发现在/var/lib/plan/netplan.dir/有一个隐含文件:
1 .netplan-acl -> /etc/plan/netplan-acl警告
上述排查是我早期的记录,当时安装的操作系统是 Ubuntu 18 LTS,安装的
netplan存在bug,请完整安装netplan.io来避免这个问题。最新的 Ubuntu 20.04 LTS 默认即使用
netplan.io没有这个问题。
5G Hz无线网络连接
在树莓派上配置了netplan的无线配置,配置文件
/etc/netplan/02-wifi.yaml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 network:
version: 2
renderer: networkd
wifis:
wlan0:
optional: true
dhcp4: yes
dhcp6: no
access-points:
"SSID-HOME":
password: "home-passwd"
"SSID-OFFICE":
auth:
key-management: eap
identity: "office.id"
password: "office-passwd"但是发现无线始终无法连接,
ip addr显示:
1
2 3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
使用
iwconfig检查:
1
2
3
4
5 wlan0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on使用
networkctl list检查发现:
1
2
3
4
5
6 IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 eth0 ether routable configured
3 wlan0 wlan no-carrier configuring
3 links listed.检查无线网络连接服务配置状态:
1 systemctl status netplan-wpa-wlan0.service显示连接了一个明显错误的
bssid=00:00:00:00:00:00的无线AP,导致认证错误:
1
2
3
4
5
6
7
8
9
10
11
12 ● netplan-wpa-wlan0.service - WPA supplicant for netplan wlan0
Loaded: loaded (/run/systemd/system/netplan-wpa-wlan0.service; enabled-runtime; vendor preset: enabled)
Active: active (running) since Thu 2020-11-05 16:17:34 CST; 2min 7s ago
Main PID: 1932 (wpa_supplicant)
Tasks: 1 (limit: 9257)
CGroup: /system.slice/netplan-wpa-wlan0.service
└─1932 /sbin/wpa_supplicant -c /run/netplan/wpa-wlan0.conf -iwlan0
Nov 05 16:18:51 pi-worker2 wpa_supplicant[1932]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:27 pi-worker2 wpa_supplicant[1849]: wlan0: Trying to associate with SSID 'SSID-OFFICE'
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="SSID-OFFICE" auth_failures=1 duration=23 reason=CONN_FAILED经过一周 排查wpa_supplicant无法连接5GHz无线问题 终于发现对于5G Hz无线网络连接,必须在
wpa_supplicant.conf中指定Country Code。不过,netplan的配置中当前不支持配置
country=,所以可以采用两种方法:
在执行
wpa_supplicant之前,先通过wireless-tools工具包中的iw命令设置regdomain
1 iw reg set CN然后
wpa_supplicant就可以连接5G Hz的无线AP。
为了能够持久化上述
regdomain配置,在Ubuntu中,可以修改/etc/default/crda配置设置如下:
1 REGDOMAIN=CN然后重启就能够正常连接5G Hz无线网络。