пятница, 29 марта 2013 г.

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

В одном из проектов у меня стояла необычная задача, на компьютере с 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

Комментариев нет:

Отправить комментарий