null

Заворачиваем IP трафик через третий узел в Linux сети

Однажды мне потребовалось сотворить нечто невероятное с одной IPv4 сетью, представляющей из себя звезду: host3 в центре и три хоста, подключенных к нему point-to-point.

Хосты имеют следующие IP адреса:
 

host1:
- eth0 10.0.1.2/32

host2:
- eth0 10.0.2.2/32

host3:
- eth0 [to host4] 10.0.3.1/32
- eth1 [to host1] 10.0.1.1/32
- eth2 [to host2] 10.0.2.1/32

host4:
- eth0 10.0.3.2/32

Задача состояла в том, чтобы запущенный с host4

`ping 10.0.2.2'
заглядывал по пути на host1. 
Решается задача довольно просто: первым делом, на всех узлах в качестве default gateway укажем host3. 
Далее сконфигурируем следующие правила на host3:
# ip rule add from 10.0.3.2 iif eth0 lookup 42
# ip route add default via 10.0.1.2 table 42
# sysctl -w net.ipv4.ip_forward=1

Казалось бы, всё с точки зрения конфигурации готово. Но запускаем ping и видим, что пакеты не доходят.
Как это отлаживать? Ну, например, так:
 

# tcpdump -pni eth1 # тут мы видим, что пакет уходит на host1 и возвращается
# tcpdump -pni eth2 # тут видно, что пакеты в сеть не уходят

Проблема в маршрутизации. Совпадение?! Не думаю! Дебажим дальше:
 

# ip route get 10.0.2.2 from 10.0.3.2 iif eth2 # тут всё хорошо
# ip route get 10.0.2.2 from 10.0.3.2 iif eth0 # а тут ошибка

Оказывается, наш замечательный linux пытается проверять, что пакет валидный с точки зрения реверс маршутизации. 
Чтобы отключить это чудо везде и всюду можно исполнить такие команды:
 

# sysctl -w net.ipv4.conf.eth0.rp_filter=0
# sysctl -w net.ipv4.conf.eth1.rp_filter=0
# sysctl -w net.ipv4.conf.eth2.rp_filter=0
# sysctl -w net.ipv4.conf.all.rp_filter=0
# sysctl -w net.ipv4.conf.default.rp_filter=0

Всё! Теперь наша коварная схема работает. С точки зрения пакета, то, что он посетил host1 видно только по меньшему TTL. Чтобы сделать путь пакета менее заметным, можно модифицировать TTL:
 

# iptables -t mangle -A PREROUTING -o eth2 -s 10.0.3.2 -j TTL --ttl-set 63

Мораль: не используйте Linux и не пытайтесь делать такую косую маршрутизацию. Если нам необходимо, чтобы "левый" хост "слышал" трафик между двумя другими точками, проще использовать port mirroring и более традиционные способы извращения.

korg

 

Коротко о себе

Работаю в компании Tune-IT, администрирую инфраструктуру компании и вычислительную сеть кафедры Вычислительной ТехникиСПбНИУ ИТМО.

Интересы: администрирование UNIX и UNIX-like систем и активного сетевого оборудования, написание shell- и perl-скриптов, изучение технологий глобальных сетей.
Люблю собирать GNU/Linux и FreeBSD, использовать тайлинговые оконные менеджеры и писать системный софт.

Ничего не найдено. n is 0