Предположил что у нас есть 2 сетевых карты, а следовательно и два сетевых интерфейса:
— eth0 ip 192.168.10.1
— eth1 ip 192.168.10.2
Для начала, я попробовал решить эту задачу самым простым(и первым) способом пришедшим мне в голову. Создать сокет и привязать его к сетевому интерфейсу eth0(192.168.10.1) и посылать пакеты на 192.168.10.2. Но как оказалось так просто ядро Linux не провести, показания ifconfig говорили что пакету идут через сетевую петлю lo.
После продолжительного поиска я наткнулся на патч для ядра от Julian Anastasov(не стал пытаться переводить на русский, вдруг ошибусь) Send-To-Self interface flag. Который позволял отправлять самому себе пакеты через внешнюю сеть. Автор постоянно обновляет этот патч. Основными преимуществами заявленными автором являются:
— данная фича может быть использована любыми приложениями без изменения кода
— фича не ограничивается 2 интерфейсами
— фичу можно использовать с несколькими IP адресами
— фича не зависит от состояний rp_filter’a и arp_filter’a
— подробней и остальное тут
Что удобно в пропатченном ядре функция такой маршрутизации включается и отключается на лету из userspace’a. Вот так:
# Включаем
echo 1 > /proc/sys/net/ipv4/conf/eth0/loop
# Выключаем
echo 0 > /proc/sys/net/ipv4/conf/eth0/loop
Автор: Dmitriy Falko
Дата публикации: 2013-03-29T10:27:00.001+04:00