Это можно было бы считать продолжением этого более раннего SO вопроса.
В идеале, я хотел бы заключить в тюрьму процесс только с использованием определенного интерфейса, несмотря ни на что. Он будет создавать TCP-соединения, отправлять UDP-дейтаграммы и прослушивать широковещательные передачи UDP. В настоящее время я делаю следующее:
- Определите IP-адрес используемого интерфейса.
- Создайте правило политики IP для маршрутизации всех пакетов, поступающих из интерфейса, на этот IP
- Создать другое правило политики IP для маршрутизации всех пакетов, поступающих с этого IP-адреса на этот интерфейс
- Настройка таблицы маршрутизации по умолчанию для каждого правила
Теперь это работает, в основном, но клиентский процесс также должен быть готов к игре. То есть, он должен привязываться к конкретному IP-интерфейсу, который он хочет использовать, и я думаю, что мне нужно также установить SO_BINDTODEVICE
. (Тем не менее, я продолжаю читать противоречивую информацию о том, работает ли SO_BINDTODEVICE
при использовании TCP или UDP.) К счастью, клиентское приложение - это Python, и я могу расширить класс сокета, чтобы сделать все это прозрачно. Но я не уверен, что это полное решение, особенно в отношении приема трансляций.
Мои вопросы:
-
Делает ли
SO_BINDTODEVICE
то, что я хочу здесь? Или он эффективен только для сырых сокетов? Кто-то отметил, что "SO_BINDTODEVICE
в сокете не гарантирует, что сокет будет принимать только пакеты, которые поступают на этот провод/антенну физического интерфейса". Если это действительно так, то что делаетSO_BINDTODEVICE
? -
Есть ли способ сделать это так, чтобы локальный IP-адрес не был уникальным? Это не было бы проблемой, кроме того, что сервер DHCP на одном интерфейсе может выделять ему IP-адрес, который используется другим интерфейсом, что путает таблицу маршрутизации.
-
Как получать трансляции только с определенного интерфейса? Привязка к определенному IP-видимому, делает его игнорировать трансляции, что имеет смысл, но не совсем то, что я ищу.
Я работаю на Ubuntu 8.04 w/Linux kernel 2.6.26. Возможность одновременного доступа к одной и той же подсети в двух разных сетях через два разных интерфейса является неоспоримым требованием, что делает его (в основном) невосприимчивым к "не делайте этого".:)