Мы разработали устройство, которое будет использоваться как одно устройство, но с использованием Ethernet ipv4 внутри для связи с внутренними периферийными устройствами, не использующими Linux, поддерживающими ipv4, как, например, с помощью pci или usb. Теперь возникает проблема, заключающаяся в том, что внешний сетевой интерфейс должен иметь возможность принимать любой адрес ipv4. Как мы должны приписывать IP-адреса внутреннему интерфейсу и периферийным устройствам? Есть один процесс, который должен иметь возможность общаться как с внутренними периферийными устройствами, так и с внешним миром, таким образом обращаясь к обеим сетям.
Мы уже пытались привязать сокет к нашим периферийным устройствам к определенному интерфейсу с помощью SO_BINDTODEVICE, используя диапазон 169.254.0.0 для внутренних периферийных устройств, но как только наш внешний интерфейс также имеет адрес в этом диапазоне (с протоколом zeroconf), мы больше не получаем пакеты от наших периферийных устройств.
Я уже думал об альтернативных методах, используя сетевые пространства имен linux или ограничивая диапазон адресов интерфейса обратной связи, чтобы иметь возможность использовать часть сети 127.0.0.0 для наших внутренних периферийных устройств, но я озадачен. Есть ли подводные камни с теми методами, которые мы еще не пробовали.
Вы можете рассмотреть возможность использования IPv6. IPv6 имеет локальные адреса ссылок которые идеально подходят для вашего случая использования. Они привязаны к заданной ссылке, поэтому нет проблем, если два хоста на разных ссылках используют один и тот же локальный адрес IPv6.
Похоже, что диапазон адресов 100.64.0.0/10 зарезервирован для использования, которое мне нужно (если мой продукт не используется в сценариях NAT операторского уровня). Из википедия : «Этот блок адресов [100.64.0.0/10] не должен использоваться ни в частных сетях, ни в общедоступном Интернете: он предназначен только для использования во внутренних операциях сетей оператора связи».