为什么 eth0 会响应分配给以太网小工具 usb0 的 ip 地址?

为什么 eth0 会响应分配给以太网小工具 usb0 的 ip 地址?

我们通过在 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

一般来说,这里有两个独立的问题:

  1. 响应属于另一个接口的 IP 地址的 ARP 查询。
  2. 接受发往属于另一个接口的 IP 地址的 IP 数据包。

第一部分可以通过改变net.ipv4.conf.all.arp_ignoresysctl 为 1。据我所知,它默认为 0,因为在某些操作系统上,在 IPv4 中,地址被认为属于整个主机而不是特定接口(弱主机模型),尽管这有点奇怪。

第二部分(通过任何接口接受 IP 数据包)对于多网络(多宿主)主机来说是正常的。要防止这种情况,请使用防火墙规则。iptables 和 nft 都支持检查入站接口。

相关内容