Послать самому себе пакет данных через сеть

В одном из проектов у меня стояла необычная задача, на компьютере с 2-мя сетевыми интерфейса требовалось передавать UDP пакеты с одного сетевого интерфейса на другой через сеть.

Предположил что у нас есть 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