Итак, у меня есть VPN на ppp0, и я настроил его так, чтобы я мог использовать либо ppp0, либо eth1 для подключения с маршрутом по умолчанию eth1.
Оба отвечают на запросы «ping google.com» (использует eth1) и «ping -I ppp0 google.com» (использует VPN)
Цель: Если я подключаюсь к eth1 через порт 12345, он перенаправляет ppp0 на определенный IP-адрес (123.123.123.123).
eth1: локальная сеть
ppp0: служба vpn
локальная сеть: 10.10.1.0/24
переадресация ip: 123.123.123.123
порт: 12345
порты могут быть разные, неважно, работает ли :)
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 10.10.1.0/24 --dport 12345 -j DNAT --to-destination 123.123.123.123:12345
iptables -A FORWARD -p tcp -o ppp0 -d 123.123.123.123 --dport 12345 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
После поиска это то, что говорит большинство людей. Используйте PREROUTE, чтобы установить новое место назначения. Затем отправьте ppp0. Но он не работает, и я не знаю, как на самом деле увидеть, что он делает.
Вы можете попробовать пометить свои пакеты с помощью iptables с помощью MARK, что-то вроде этого после или до вашего dnat:
iptables -t mangle -A PREROUTING -p tcp -d 123.123.123.123 --dport 12345 -j MARK --set-mark 111
После вы можете установить для этого конкретный маршрут:
ip rule add fwmark 111 lookup 100
ip route add local 0.0.0.0/0 dev ppp0 table 100
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 10.10.1.0/24 \
--dport 12345 -j DNAT --to-destination 123.123.123.123:12345
Локально сгенерированный трафик никогда не будет проходить через цепочку PREROUTING. В этом можно убедиться, добавив такое правило:
iptables -t nat -A PREROUTING -j log -m limit --limit 1/s
Если вы не знакомы с iptables, приведенное выше правило означает:
Следите за своими лог-файлами, пока вы устанавливаете исходящие соединения, и вы увидите, что через эту цепочку ничего не проходит. Цепочка PREROUTING используется только для трафика, поступающего в вашу систему из внешнего источника.
Вы могли подумать, что можете сделать это в цепочке OUTPUT:
iptables -t nat -A OUTPUT ... -j DNAT ...
Но к тому времени, когда пакет попадает в OUTPUT
цепочка решение о маршрутизации уже принято. Вы, вероятно, можете получить то, что хотите, используя REDIRECT
править в OUTPUT
chain, а затем запускает tcp-прокси на локальном порту, который перенаправляет соединения к месту назначения. То есть вы можете добавить такое правило:
iptables -t nat -A OUTPUT -p tcp -d 10.10.1.0/24 --dport 12345 \
-j REDIRECT --to-ports 12345
Затем запустите TCP-прокси локально на порту 12345.
Вероятно, это связано с тем, что правило NAT просто дает ему новый IP-адрес назначения, который затем маршрутизируется через eth1. Тогда правило фильтрации не применяется.
Вам нужно будет либо создать маршрут для этого конкретного пункта назначения, проходящего через ppp0 (если все трафик, связанный с этим пунктом назначения, может проходить через vpn), либо использовать таблицу mangle, чтобы вручную выбрать пункт назначения для этого трафика .