采用systemd-networkd管理網卡
-
主網卡eth0的配置文件/etc/systemd/network/20-eth0.network,靜態配置時內容示例如下:
[Match] Name=eth0 [Network] Address=192.168.10.111/24 DNS=8.8.8.8 DNS=8.8.4.4 [Route] Gateway=192.168.10.1 Metric=100
動態配置時內容為:
[Match] Name=eth0 [Network] DHCP=yes [DHCP] RouteMetric=100
-
無線網卡的配置文件/etc/systemd/network/21-wireless.network,一般設置為動態IP即可,即該文件內容保持不變。
[Match] Name=wlan0 [Network] DHCP=yes [DHCP] RouteMetric=120
無線網卡的應用服務程序為wpa_supplicant,其systemd配置文件為/lib/systemd/system/wpa_supplicant.service,內容如下,保持不變。
[Unit] Description=WPA supplicant Before=network.target [Service] Type=simple ExecStart=/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf ExecReload=/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf RestartSec=120 Restart=on-failure [Install] WantedBy=multi-user.target Alias=dbus-fi.epitest.hostap.WPASupplicant.service
無線網卡上網方式的配置文件為/etc/wpa_supplicant.conf,樣例如下:
ctrl_interface=/var/run/wpa_supplicant update_config=1 network={ scan_ssid=1 ssid="test" psk="123456" key_mgmt=WPA-PSK pairwise=CCMP }
-
pppoe集成到systemd中,需配置文件/etc/ppp/pppoe.conf和/etc/ppp/chap-secrets、/etc/ppp/pap-secrets。
# cat /etc/ppp/pppoe.conf DEMAND=no DNSTYPE=SERVER PEERDNS=yes DEFAULTROUTE=yes CONNECT_TIMEOUT=30 CONNECT_POLL=2 PING="." CF_BASE=`basename $CONFIG` PIDFILE="/var/run/$CF_BASE-pppoe.pid" SYNCHRONOUS=no CLAMPMSS=1412 LCP_INTERVAL=20 LCP_FAILURE=3 PPPOE_TIMEOUT=80 FIREWALL=NONE LINUX_PLUGIN= PPPOE_EXTRA="" PPPD_EXTRA="" ETH="eth0" USER="test" # cat /etc/ppp/chap-secrets "test" * "123456" # cat /etc/ppp/pap-secrets "test" * "123456"
systemd服務配置文件/lib/systemd/system/pppoe.service內容如下(保持不變)。
# cat /lib/systemd/system/pppoe.service [Unit] Description=PPP over ethernet After=network-online.target systemd-networkd.service Wants=network-online.target systemd-networkd.service [Service] Type=forking ExecStart=/usr/sbin/pppoe-start ExecReload=/usr/sbin/pppoe-stop;/usr/sbin/pppoe-start ExecStop=-/usr/sbin/pppoe-stop ExecStopPost=-ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf Restart=on-failure [Install] WantedBy=multi-user.target
-
static、dhcp、wifi、pppoe方式的切換操作步驟如下:
-
網絡部分使用前部署
需安裝wpa_supplicant應用程序,並設置該應用開機啟動。
apt-get install wpasupplicant systemctl enable wpa_supplicant
修改wpa_supplicant的systemd配置文件/lib/systemd/system/wpa_supplicant.service內容如下(內容保持不變):
[Unit] Description=WPA supplicant Before=network.target [Service] Type=simple ExecStart=/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf ExecReload=/sbin/wpa_supplicant -Dnl80211 -iwlan0 -c /etc/wpa_supplicant.conf RestartSec=120 Restart=on-failure [Install] WantedBy=multi-user.target Alias=dbus-fi.epitest.hostap.WPASupplicant.service
增加無線網卡的配置文件/etc/systemd/network/21-wireless.network。
[Match] Name=wlan0 [Network] DHCP=yes [DHCP] RouteMetric=120
pppoe部分需要額外配置內核及安裝pppoe且增加pppoe服務配置文件。
Device Drivers ->
Network device support ->
<M> ppp(point-to-point protocol) support
<M> PPP BSD-Compress compression
<M> PPP Deflate compression
[*] PPP filtering
<M> PPP MPPE compression (encryption)
[*] PPP multilink support
<M> PPP over Ethernet
<M> PPP support async serial ports
<M> PPP support for sync tty ports
pppoe安裝及服務配置文件:
# apt install pppoe # cat /lib/systemd/system/pppoe.service [Unit] Description=PPP over ethernet After=network-online.target systemd-networkd.service Wants=network-online.target systemd-networkd.service [Service] Type=forking ExecStart=/usr/sbin/pppoe-start ExecReload=/usr/sbin/pppoe-stop;/usr/sbin/pppoe-start ExecStop=-/usr/sbin/pppoe-stop ExecStopPost=-ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf Restart=on-failure [Install] WantedBy=multi-user.target
2) eth0動態上網:
修改/etc/systemd/network/20-eth0.network內容為:
[Match] Name=eth0 [Network] DHCP=yes [DHCP] RouteMetric=100
之后執行如下命令:
systemctl stop pppoe systemctl restart systemd-networkd ifconfig wlan0 down systemctl restart systemd-resolved ls -al /etc/resolv.conf | grep systmed >/dev/null || ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
3) eth0靜態上網:
根據配置的IP、netmask、Gateway、DNS適當修改/etc/systemd/network/20-eth0.network內容。
[Match] Name=eth0 [Network] Address=192.168.10.111/24 DNS=8.8.8.8 DNS=8.8.4.4 [Route] Gateway=192.168.10.1 Metric=100
之后執行如下命令:
systemctl stop pppoe systemctl restart systemd-networkd ifconfig wlan0 down systemctl restart systemd-resolved ls -al /etc/resolv.conf | grep systmed >/dev/null || ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
4) 無線上網:
根據ssid、psk、key_mgmt、pairwise合理修改/etc/wpa_supplicant.conf。
ctrl_interface=/var/run/wpa_supplicant update_config=1 network={ scan_ssid=1 ssid="test" psk="123456" key_mgmt=WPA-PSK pairwise=CCMP }
之后執行如下命令:
systemctl stop pppoe systemctl restart systemd-networkd systemctl restart wpa_supplicant ifconfig eth0 down systemctl restart systemd-resolved ls -al /etc/resolv.conf | grep systmed >/dev/null || ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
5)pppoe上網:
根據用戶名和密碼合理修改/etc/ppp/pppoe.conf和/etc/ppp/chap-secrets、/etc/ppp/pap-secrets,其中/etc/ppp/pppoe.conf只需要修改用戶名及USER。
# cat /etc/ppp/pppoe.conf DEMAND=no DNSTYPE=SERVER PEERDNS=yes DEFAULTROUTE=yes CONNECT_TIMEOUT=30 CONNECT_POLL=2 PING="." CF_BASE=`basename $CONFIG` PIDFILE="/var/run/$CF_BASE-pppoe.pid" SYNCHRONOUS=no CLAMPMSS=1412 LCP_INTERVAL=20 LCP_FAILURE=3 PPPOE_TIMEOUT=80 FIREWALL=NONE LINUX_PLUGIN= PPPOE_EXTRA="" PPPD_EXTRA="" ETH="eth0" USER="test" # cat /etc/ppp/chap-secrets "test" * "123456" # cat /etc/ppp/pap-secrets "test" * "123456"
之后運行如下命令:
systemctl restart systemd-networkd ifconfig wlan0 down systemctl restart pppoe ifconfig eth0 0.0.0.0 && route del default; route add default dev ppp0
-
上網方式切換時間統計
-
切換方式
切換后成功連通時間
static -> wifi
約8s
dhcp -> wifi
約18s
others
5s內
注:不同網絡環境或測試條件下,時間可能有差距。上述測試環境基於北京網絡。
-
上網方式切換后網絡連通的測試方法
上網方式
切換后連通測試方法
static
Ping網關
dhcp
可正確獲取到動態分配的IP
wifi
可正確獲取到動態分配的IP
pppoe
有虛擬網卡ppp0且可獲取IP
-
開機啟動時網絡設計
斷電重啟或reboot后,不同上網方式網卡配置和路由不同,需要根據上網方式來正確配置系統。
在/etc/wan_way下保存當前上網方式,可取值:static、dhcp、wifi、pppoe,在/etc/rc.local中增加網絡初始化腳本/usr/local/bin/init_networking后台執行,以配置不同上網方式的網絡。
#!/bin/sh
wan_way=$(cat /etc/certusnet_conf/wan_way) case $wan_way in "dhcp" | "static" ) ifconfig wlan0 down ls -al /etc/resolv.conf | grep systmed >/dev/null || ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf echo "dhcp or static" ;; "wifi") ifconfig eth0 down ls -al /etc/resolv.conf | grep systmed >/dev/null || ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf echo "wifi" ;; "pppoe") ifconfig wlan0 down systemctl restart pppoe echo "pppoe" ifconfig eth0 0.0.0.0 num=0 while [ $num -lt 10 ] do num=$(($num+1)) pppoe-status | grep -w inet >/dev/null && { echo "pppoe success after $num *10s" num=100 } done sleep 10 route del default ; route add default dev ppp0 ;; *) echo "not dhcp, static, pppoe or wifi" ;; esac exit 0
-
目前測試發現問題
采用DHCP方式上網,插拔網線時配置其他設備該網關動態IP,此網關不能獲取新的IP。
參考: