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. Переадресация с адреса локальной сети

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

1 ответ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

Я надеюсь, что ответ будет полезен для кого-то другого, и что я не захламляю сайт чем-то, что обрабатывалось много раз.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .