在 eth0 上的 DHCP 服务器和客户端之间切换

在 eth0 上的 DHCP 服务器和客户端之间切换

我正在使用手臂微控制器。目前,控制器配置为 eth0(以太网插孔)上的 dhcp 客户端和 eth1 上的 dhcp 服务器。我想将其配置为也在 eth0 上提供 dhcp 服务,这样当它连接到路由器时它将成为客户端,或者当连接到笔记本电脑/集线器时它将成为服务器。我希望能够从前端告诉控制器是服务器还是客户端。我不完全确定如何去做,因为我对 Linux 开发相当陌生。

我已经查看了 /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

答案1

据我所知,单个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 eth0and ip link set eth0 down(或者ifconfig eth0 down如果使用旧工具)。这些命令中的一个或另一个将报告错误;这是预期的。

  3. 如果切换到 DHCP 客户端模式,运行ifup eth0即可完成。否则,首先使用ipifconfig命令将 DHCP 服务器模式的静态 IP 地址配置为eth0,然后运行systemctl start udhcpd-eth0​​。

  4. 完毕!

“从前端调用切换脚本留给读者作为练习。”

相关内容