1

Мы настраиваем сеть во встроенной системе Linux, устанавливая один статический IP-адрес (169.254.0.1/16=LLA) на Ethernet-гаджет /usb0, используя DHCP на Ethernet /eth0 (192.168./16).

К нашему удивлению, встроенная система отвечает на eth0 на статический IP-адрес. ifconfig на встроенном устройстве Linux показывает:

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 ответ1

0

Используйте брандмауэр. Одно простое правило iptables блокирует все пакеты по адресу usb0, если они фактически не входят через usb0:

-d 169.254.0.0/16 ! -i usb0 -j REJECT

Как правило, здесь есть два отдельных вопроса:

  1. Ответ на запросы ARP для IP-адреса, который принадлежит другому интерфейсу.
  2. Прием IP-пакетов, предназначенных для IP-адресов, принадлежащих другому интерфейсу.

Первую часть можно легко избежать, изменив sysctl net.ipv4.conf.all.arp_ignore на 1. Afaik, по умолчанию это 0, потому что в некоторых операционных системах в IPv4 адреса считаются принадлежащими всему хосту, а не определенным интерфейсам (модель слабого хоста), хотя это немного странно.

Вторая часть (прием IP-пакетов через любой интерфейс) является нормальной для многосетевых (многосетевых) хостов. Чтобы предотвратить это, используйте правила брандмауэра. И iptables, и nft поддерживают проверку входящего интерфейса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .