Однажды мне потребовалось сотворить нечто невероятное с одной 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 и более традиционные способы извращения.