systemd管理網絡應用


采用systemd-networkd管理網卡

  1. 主網卡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
  1. 無線網卡的配置文件/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
}
  1. 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
  1. staticdhcpwifipppoe方式的切換操作步驟如下:

  1. 網絡部分使用前部署

需安裝wpa_supplicant應用程序,並設置該應用開機啟動。

apt-get install wpasupplicant
systemctl enable wpa_supplicant

修改wpa_supplicantsystemd配置文件/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靜態上網:

根據配置的IPnetmaskGatewayDNS適當修改/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) 無線上網:

根據ssidpskkey_mgmtpairwise合理修改/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

5pppoe上網:

根據用戶名和密碼合理修改/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
  1. 上網方式切換時間統計

切換方式

切換后成功連通時間

static -> wifi

8s

dhcp -> wifi

18s

others

5s

注:不同網絡環境或測試條件下,時間可能有差距。上述測試環境基於北京網絡。

  1. 上網方式切換后網絡連通的測試方法

    上網方式

    切換后連通測試方法

    static

    Ping網關

    dhcp

    可正確獲取到動態分配的IP

    wifi

    可正確獲取到動態分配的IP

    pppoe

    有虛擬網卡ppp0且可獲取IP

  2. 開機啟動時網絡設計

斷電重啟或reboot后,不同上網方式網卡配置和路由不同,需要根據上網方式來正確配置系統。

/etc/wan_way下保存當前上網方式,可取值:staticdhcpwifipppoe,在/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
  1. 目前測試發現問題

采用DHCP方式上網,插拔網線時配置其他設備該網關動態IP,此網關不能獲取新的IP


參考:

  1. systemd 的網絡管理

  2. 樹莓派+1USB有線網卡+1USB無線網卡做路由器

  3. Linux From Scratch - Version 7.7-systemd 通用網絡配置

  4. systemd-networkd (Archlinux wiki)

  5. Network configuration (Archlinux wiki)

  6. 5章 網絡設置(debian manuals

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM