Научить сокеты SO_DONTROUTE (NDIS)
От: antenne  
Дата: 09.03.11 20:11
Оценка:
Здравствуйте!

В общем, задача стоит так:

машинка прицеплена к IP-сетям через несколько интерфейсов разных типов

езернет,виртуальный езернет,ppp,pppoe,pptp

на каждом интерфейсе назначен свой IP

Есть приложение, которое очень хочет отправлять трафик в конкретный линк, и не может.
Потому что, даже если сделать bind(endpoint) на клиентском сокете, ядро будет использовать таблицу маршрутизации. И отправит пакет с адресом линка 1 в линк с наименьшей метрикой (по сути подключенный последним).

Нужно научить ядро игнорировать таблицу маршутизации для пакетов из нашего приложения. Т.е. пакет с адресом источника 10.10.10.10 всегда должен уходить в интерфейс на котором поднят этот адрес, а пакеты из неприбинденного клиентского сокета обрабатываться обычным образом.

Помечать пакеты можно либо с помощью опции SO_DONTROUTE либо вычислять их по названию процесса приложения, либо брать все прибинденные исходящие.

Насколько я понимаю, реализовать можно драйвером где то на уровне NDIS filter + TDI filter или пропатчив таблицы экспорта tcpip.sys

Сразу оговорюсь что я никогда не писал драйверы

Подскажите, какой способ будет наименее трудоемким и куда копать?

Или же, на коммерческой основе кто может взяться — в ПМ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.