Назад | Перейти на главную страницу

Использование IPTables для переадресации порта для входящего eth1 (локального) на исходящий ppp0 (vpn) на определенный IP-адрес

Итак, у меня есть 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, приведенное выше правило означает:

  • Регистрируйте (с максимальной скоростью 1 сообщение в секунду) любые пакеты, проходящие по цепочке PREROUTING.

Следите за своими лог-файлами, пока вы устанавливаете исходящие соединения, и вы увидите, что через эту цепочку ничего не проходит. Цепочка 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, чтобы вручную выбрать пункт назначения для этого трафика .