iptables перенаправлення портів з внутрішнім SNAT


3

Я хотів би перенаправити зовнішній порт в інший порт на машині в приватній мережі. Тим не менш, мені потрібно SNAT трафік, як видається, від внутрішнього IP шлюзу, оскільки машина призначення має абсолютно інший вихідний маршрут. Я комбіную два питання тут, але я не впевнений, що я можу об'єднати результати запиту їх окремо.

Шлюз = 1.2.3.4/192.168.2.5, внутрішній сервер = 192.168.2.10

  1. Переадресація в інший порт

Я звик робити це, і це, здається, єдина відповідь, яку Google знаходить для мене:

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:12345
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 12345 -j ACCEPT
iptables -A POSTROUTING -t nat -d 192.168.2.10 -s 192.168.2.0/24 -p tcp --dport 12345 -j SNAT --to 1.2.3.4

який буде пересилати порт 12345 з мого зовнішнього IP 1.2.3.4 до 192.168.2.10:12345. Що робити, якщо я хочу переслати порт 54321? Я плутаюся, який порт посилається на яку машину; Я вирішив це методом проб і помилок у минулому, щоб знайти пізніше, що це не спрацювало.

  1. Переадресація з адреси LAN

У цій частині я не впевнений, що це можливо. Що я хотів би мати для трафіку, що надходить до 192.168.2.10:54321, походить з адреси локальної мережі шлюзу, а не з Інтернету. (Я намагаюся перенаправити порт 443 на сервер ssh, але цей сервер вже видно зовні на іншому IP-адресі, тому трафік відповіді міститься іншим маршрутом.)

Вище змінено стандартні правила:

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:12345
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 12345 -j SNAT --to-source 192.168.2.5
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 12345 -j ACCEPT
iptables -A POSTROUTING -t nat -d 192.168.2.10 -s 192.168.2.0/24 -p tcp --dport 12345 -j SNAT --to 1.2.3.4

tcpdump показує мені, що трафік тепер з локальної адреси шлюзу, 192.168.2.5, і сервер відповідає, але він не перенаправляється на зовнішню адресу. Я підозрюю, що це навіть неможливо, щоб трафік відповіді містив адресу клієнта як пункт призначення, але якщо iptables може перенаправляти відповіді правильно, я буду вдячний ключ до того, як.

Плюс, якщо це можливо, включаючи правильний синтаксис для зміни порту призначення, як для частини 1.

Відповіді:


3

Після деяких експериментів, я думаю, що я відповів на моє запитання, тому я повинен розмістити його тут, у випадку, якщо хтось інший вважає це корисним. Так, це можливо, і це досить просто, тільки питання отримання правильної комбінації адрес і портів.

Коментарі з мого сценарію:

# summary:
# allow forwarding *to* destination ip:port
# allow forwarding *from* destination ip:port
# nat packets identified by arrival at external IP / port to have
#  *destination* internal ip:port
# nat packets identified by arrival at internal IP / port to have
#  *source* internal network IP of gateway machine

Для прикладу питання:

# allow inbound and outbound forwarding
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 54321 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.10 --sport 54321 -j ACCEPT

# route packets arriving at external IP/port to LAN machine
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:54321
# rewrite packets going to LAN machine (identified by address/port)
# to originate from gateway's internal address
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 54321 -j SNAT --to-source 192.168.2.5

Справжній сценарій, оскільки його слід застосовувати безпосередньо:

# EXTIP = external IP of gateway (1.2.3.4)
# EPORT = external port (12345)
# DIP   = destination IP in local network (192.168.2.10)
# DPORT = destination port (54321)
# INTIP = internal IP of gateway (192.168.2.5)

iptables -A FORWARD -p tcp -d $DIP --dport $DPORT -j ACCEPT
iptables -A FORWARD -p tcp -s $DIP --sport $DPORT -j ACCEPT

iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport $EPORT -j DNAT --to-destination $DIP:$DPORT
iptables -A POSTROUTING -t nat -p tcp -d $DIP --dport $DPORT -j SNAT --to-source $INTIP

Я сподіваюся, що відповідь буде корисною для когось іншого, і що я не загрожую сайту чимось, що було оброблено багато разів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.