Linux

在 eth0 上的 DHCP 伺服器和客戶端之間切換

  • June 17, 2019

我正在使用手臂微控制器。目前,控制器在 eth0(乙太網插孔)上配置為 dhcp 客戶端,在 eth1 上配置為 dhcp 伺服器。我想將它配置為也在 eth0 上提供 dhcp,這樣當它連接到路由器時它將成為客戶端,或者在連接到筆記型電腦/集線器時成為伺服器。我希望能夠從前端告訴控制器是伺服器還是客戶端。我不完全確定如何去做,因為我對 linux dev 還很陌生。

我查看了 /etc/udhcpd.conf 文件,但我不確定是否應該在那裡添加介面 eth0。還查看了 /etc/networking/interfaces 文件和 udhcpd.service 文件,但我不確定要修改什麼。您能否就如何將控制器配置為 eth0 上的伺服器或客戶端提供一些指導?

以下是文件內容的內容以獲取更多資訊:

/etc/udhcpd.config:

start       10.77.0.2
end         10.77.255.200
interface   eth1
opt dns 8.8.8.8 8.8.4.4 #public google dns servers
option  subnet  255.255.0.0
opt     router  10.77.0.1

/etc/network/interfaces:

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

pre-up /bin/grep -v -e "ip=[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" /proc/cmdline > 
/dev/null
udhcpc_opts -R -b

iface eth1 inet static
address 10.77.0.1
netmask 255.255.0.0

udhcpd.service:

[Unit]
Description=udhcpd Service
After=startup.service

[Service]
ExecStartPre=/sbin/ifup eth1 
ExecStart=/usr/sbin/udhcpd -f -S /etc/udhcpd.conf
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target

據我所知,一個單一的udhcpd網路介面一次只能服務一個網路介面,所以當你希望它在 eth0 上服務 DHCP 時,你需要使用單獨的配置文件執行它的第二個副本。那可能叫/etc/udhcpd-eth0.conf.

/etc/network/interfaces您可能還需要在不同位置複製兩份副本,一份用於“DHCP 客戶端”配置eth0,另一份用於“DHCP 伺服器”配置。讓我們打電話給他們/etc/network/interfaces.eth0client/etc/network/interfaces.eth0server例如。

下一個問題是,您是否想將“eth0 上的 DHCP 伺服器”視為一種持久狀態,在重新啟動後仍將繼續存在,直到明確切換回“eth0 上的 DHCP 客戶端”,或者您是否想將“eth0 上的 DHCP 伺服器”視為將按需啟用並且僅持續到下一次重新啟動的瞬態狀態?

您還需要定義一個單獨的udhcpd-eth0.service,如果您要使用瞬態模式,應該禁用它(= 從不自動啟動)。如果你想要持久模式,它應該在切換到伺服器模式時啟用和啟動,在切換到客戶端模式時停止和禁用。

持久切換模式的腳本需要執行以下操作(作為虛擬碼):

  1. systemctl stop udhcpd-eth0; systemctl disable udhcpd-eth0. 忽略這裡的錯誤。
  2. 執行ifdown eth0
  3. /etc/network/interfaces使用/etc/network/interfaces.eth0client/etc/network/interfaces.eth0server根據您要切換到的狀態覆蓋目前。
  4. 執行ifup eth0
  5. 如果在 eth0 上切換到 DHCP 伺服器模式,則systemctl enable udhcpd-eth0.service && systemctl start udhcpd-eth0.service
  6. 完畢!

如果您希望它作為一種臨時狀態,您可能根本不需要該/etc/network/interfaces文件的兩個副本。在這種情況下,您的腳本將如下所示:

  1. systemctl stop udhcpd-eth0.service. 它可能已經停止,也可能尚未停止;忽略這裡的錯誤。
  2. 執行ifdown eth0ip link set eth0 down(或者ifconfig eth0 down如果使用舊工具)。這些命令中的一個或另一個將報告錯誤;這是意料之中的。
  3. 如果切換到 DHCP 客戶端模式,執行即可ifup eth0。否則,首先使用ipifconfig命令為DHCP伺服器模式配置靜態IP地址eth0,然後執行systemctl start udhcpd-eth0
  4. 完畢!

“從前端呼叫切換腳本留給讀者作為練習。”

引用自:https://unix.stackexchange.com/questions/525327