Я пытаюсь настроить конфигурацию, при которой все подключения к порту 161 будут проходить через другой шлюз (через openvpn), а другие — напрямую
[localhost] -> [шлюз] -> [удаленный] — OK
[localhost] <- [шлюз] <- [удаленный] - пакет исчезает после туннеля vpn. Я могу понюхать это на tun0 iface, а потом оно исчезает.
Что я сделал: добавлен gw1 в rt_tables затем использовал эти правила
ip route add default via 10.8.0.1 dev tun0 table gw1
ip rule add fwmark 0x1 table gw1
iptables -A OUTPUT -t mangle -o eth0 -p tcp --dport 443 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o tun0 -p tcp --dport 443 -j SNAT --to 10.8.0.2
iptables -A OUTPUT -t mangle -o eth0 -p udp --dport 161 -j MARK --set-mark 1
iptables -A POSTROUTING -t nat -o tun0 -p udp --dport 161 -j SNAT --to 10.8.0.2
Итак, я тестирую соединения tcp и udp и что я вижу:
Я проверил захват пакетов в wirehark, и все порты указаны правильно, поэтому он использует один и тот же случайный динамический порт во время всей этой передачи: вперед и назад. Я также безуспешно пытался использовать маскарад на локальном хосте вместо SNAT. Пробовал перенаправлять пакеты с DNAT на 127.0.0.1 безуспешно, но я не уверен, может быть, я делаю что-то не так.
Почему этот пакет исчезает после tun0? Моя входная цепочка пока позволяет все. Возможно, мне нужно включить или отключить какие-либо новые «функции» в sysctl.conf, который меня не беспокоит?
Спасибо
Мои правила верны
Решение:
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush
Теперь все работает нормально. Обратите внимание, что вам нужно отключить это на каждом интерфейсе, опция «все» не работает нормально.