Я написал инструмент, работающий в системе (Win7) с двумя сетевыми интерфейсами, каждый из которых связан с отдельной подсетью, каждый со своим собственным шлюзом, который затем связан с двумя отдельными удаленными сетями (после каждого шлюза есть исходящие брандмауэры). Я инициирую исходящие TCP-соединения через оба сетевых адаптера, используя Socket.Bind
(перед выполнением Connect
) для каждого соответствующего IP-адреса сетевого адаптера. Первый сетевой адаптер работает нормально, но для второго сетевого адаптера я получаю SocketException
: «Была предпринята попытка операции с сокетом в недоступной сети» .
Мое первоначальное понимание заключалось в том, что, поскольку сокеты привязаны к локальной конечной точке конкретного сетевого адаптера, для которой определен шлюз, соединение должно быть направлено на этот шлюз и, следовательно, должно работать. Однако кажется, что исходный IP-адрес игнорируется, и маршрутизация работает в соответствии с локальной таблицей маршрутизации (т. Е. Второй запрос подключения сетевого адаптера переходит к первому, по умолчанию, к сети и отклоняется из-за неправильной подсети).
Настройка таблиц локальной маршрутизации помогает, но заставляет задуматься о том, как сокет связывается с конкретным локальным IP-адресом.
Проделав дополнительное чтение, я обнаружил, что действительно существует такая вещь, как «маршрутизация по IP-адресу источника», но она по умолчанию отключена в Windows (через параметр реестра DisableIPSourceRouting
) из-за соображений безопасности, как описано, например здесь:
Вопросы:
- Если мое первоначальное понимание было верным (то есть
Socket.Bind
должно быть достаточно) - почему оно не работает без изменения таблиц маршрутизации?
- Если мое понимание было НЕ верным (т.е.
Socket.Bind
игнорируется и используется маршрутизация) - какой смысл иметь Socket.Bind? Зачем вообще это делать?
- Кроме того, я хотел бы лучше понять, каков реальный риск включения IP-маршрутизации от источника (предпочтительно с примером возможного эксплойта)?
- Будем весьма благодарны за любые идеи решения требования без изменения вручную таблицы локальной маршрутизации.
Большое спасибо.