наверное, это в admin? вам нужно настроить route.
вообще-то, вы (кажется) можете использовать source routing,
передав ip_options в msghdr (IP_RETOPTS), но вряд ли вы это
имели в виду. и не спрашивайте, как конкретно это сделать,
я не разбирался.
ну или raw socket.
> SO_BINDTODEVICE
а вы это пробовали? я - нет, но глядя на
net/ipv4/route.c:ip_route_output_slow()
мне кажется, что это не будет работать.
точнее будет, но только в том случае, если
у нас _нет_ маршрута для этого пакета:
net/ipv4/route.c:ip_route_output_slow()
2480 if (fib_lookup(&fl, &res)) { // нет маршрута
2481 res.fi = NULL;
2482 if (oldflp->oif) { // смотрим на SO_BINDTODEVICE
если ошибаюсь - поправьте.
Проблему решил. Дело в том, что если даже и сделать bind сокета к интерфейсу, они все равно роутятся через какой-нибудь интерфес (что в принципе для меня странно), если пакет попадает под правило роутинга этого интерфейса (т.е. заголовки пакета IP содержать исходный адрес ip ppp0, а шлются через eth0:). Все что нужно было, это подкорректировать таблицы маршрутизации.
Другой вопрос: кто знает как программно изменить таблицу маршрутизации? Т.е. как добавить или удалить из таблицы маршрутизации запись из программы, не обращаясь к утилите route?