Я пытаюсь перенаправить все локальные соединения с портом 22 назначения, соответствующим указанному туннелю, с помощью iptables MARK, но что-то идет не так.
1.1.1.1 my public address
2.2.2.2 tunnel public address
1.2.3.4 my local tunnel address
Вот конфиги:
# ip rule show
1: from all fwmark 0x14 lookup 20
# ip route show table 20
default via 1.2.3.4 dev tun0
И я создал следующие правила для iptables:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 20
iptables -t mangle -A OUTPUT -s 1.2.3.4 -j MARK --set-mark 20
И когда я пытаюсь установить ssh на какой-то сервер (в данном случае dreamhost), я получаю:
tcp 6 299 ESTABLISHED src=1.1.1.1 dst=69.163.202.189 sport=37152 dport=22 packets=4 bytes=221 src=69.163.202.189 dst=1.1.1.1 sport=22 dport=37152 packets=2 bytes=133 [ASSURED] mark=0 secmark=0 use=2
Пакет не маркируется и отправляется по маршруту по умолчанию, который равен 1.1.1.1.
Не знаю, что делаю не так ..
У кого-нибудь есть идеи ??
калечить ПЕРЕДАЧА для изменения входящие пакеты перед маршрутизацией и ВЫВОД для изменения локально сгенерированные пакеты перед маршрутизацией. Следовательно ПЕРЕДАЧА бесполезен (для локальных подключений). Но OUTPUT
хотя должен был работать. Обычно вам не нужно указывать исходный адрес в правилах брандмауэра, поскольку в любом случае это будут «локально сгенерированные пакеты».
И еще что нужно помнить никто не изменит исходный IP-адрес только из-за того, что вы пометили пакет, и он будет маршрутизирован с другой таблицей маршрутов - для этого вам нужно будет явно использовать NAT. Что касается iptables Linux, это должно быть SNAT. И «Эта цель действительна только в таблице nat, в цепочке POSTROUTING», как говорит этот человек. Хотя лично я предпочитаю его подвиды MASQUERADE
что более удобно для этого, потому что вам не нужно беспокоиться о жестком кодировании IP-адресов.