我们通过在 Ethernet-Gadget/usb0 上设置一个静态 IP 地址(169.254.0.1/16=LLA)同时在 Ethernet/eth0(192.168./16)上使用 DHCP 来在嵌入式 Linux 系统上配置网络。
令我们惊讶的是,嵌入式系统在 eth0 上响应静态 ip 地址。嵌入式 Linux 设备上的 ifconfig 显示:
eth0 Link encap:Ethernet HWaddr <snip>
inet addr:192.168.51.156 Bcast:192.168.55.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
<snip>
usb0 Link encap:Ethernet HWaddr <snip>
inet addr:169.254.0.1 Bcast:169.254.255.255 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
<snip>
嵌入式Linux设备上的路由表:
root@my_embedded_system01:~# ip route
default via 192.168.50.30 dev eth0 proto dhcp src 192.168.51.156 metric 1024
169.254.0.0/16 dev usb0 proto kernel scope link src 169.254.0.1 linkdown
192.168.48.0/21 dev eth0 proto kernel scope link src 192.168.51.156
192.168.50.30 dev eth0 proto dhcp scope link src 192.168.51.156 metric 1024
嵌入式设备上是否有可以改变这种情况的设置?
答案1
使用防火墙。一个简单的 iptables 规则将阻止所有发往 usb0 地址的数据包,除非它们确实通过 usb0 进入:
-d 169.254.0.0/16 ! -i usb0 -j REJECT
一般来说,这里有两个独立的问题:
- 响应属于另一个接口的 IP 地址的 ARP 查询。
- 接受发往属于另一个接口的 IP 地址的 IP 数据包。
第一部分可以通过改变net.ipv4.conf.all.arp_ignoresysctl 为 1。据我所知,它默认为 0,因为在某些操作系统上,在 IPv4 中,地址被认为属于整个主机而不是特定接口(弱主机模型),尽管这有点奇怪。
第二部分(通过任何接口接受 IP 数据包)对于多网络(多宿主)主机来说是正常的。要防止这种情况,请使用防火墙规则。iptables 和 nft 都支持检查入站接口。