Сервер - Linux Debian 4
Есть 3 интерфейса inp0, out0, out1.
Интерфейс out0 имеет внутренний ip $IP0.
За интерфейсом out0 есть шлюз $GIP0 и это шлюз по умолчанию.
Интерфейс out1 имеет реальный ip $IP1.
За интерфейсом out1 есть шлюз $GIP1. Хочу, чтобы UDP пакеты из локальной сети натились на сервере через сетевой интерфейс out1. Шлюз $GIP0 настроен натить все, но перед этим почти все (udp в том числе) фильтрует.
Локальная сеть имеет внутренний адрес $LIP и доступна через интерфейс inp0.
Делаю так:
1.iptables -t mangle -A PREROUTING -s $LIP -p udp -j MARK --set-mark 0x1
2.iptables -t nat -A POSTROUTING -s $LIP -p udp -j SNAT --to-source $IP1
3.iptables -t mangle -A OUTPUT -s $IP1 -j MARK --set-mark 0x1
4.echo 0 >/proc/sys/net/ipv4/conf/out1/rp_filter
5.ip route add default via $IP1 table 1
6.ip rule add fwmark 0x1 lookup 1
После этого udp пакеты совсем никуда из сервера не уходят.
Если п.1 отменить, пакеты появляются на интерфейсе out0 от адреса $IP1. То есть SNAT работает.
На сервере работает squid и он в зависимости от запрошенного контента, выбирает себе выходной IP ($IP0 или $IP1). Чтобы пакеты перенаправлялись в другой интерфейс добавлен п.3. Пакеты от sauid-а ходят правильно, через нужные интерфейсы и с нужными адресами. То есть маршрутизация по условию тоже работает.
Почему UDP совсем никуда не уходят?
Что надо сделать чтобы работала маршрутизация для UDP из локальной сети?
Доки читал.
Остался вопрос - после каких цепочек в iptables принимается решение о отправке пакета через требуемый интерфейс (то есть когда выполняется правило п.6)?
Правильно-ли я понимаю, что сейчас такие задачи надо решать через -j ROUTE?
Я использовать -j ROUTE похоже пока что не смогу. В Debian даже в експериментальных версиях поддержки этого нет.