Я использую эту команду для установки NAT на моем контейнере виртуальной машины:
iptables -t nat -A PREROUTING -d ${MAIN_IP} -p tcp --dport ${2} -j DNAT --to-destination ${SUBNET}${3}
с
- MAIN_IP — глобальный IP-адрес главного сервера
- SUBNET — это первые три цифры подсети моей виртуальной машины, например, «192.168.1».
- $2 — это порт, который я хочу переслать
- $3 — последний сегмент подсети, например 20
Это отлично работает для прямого NAT.
Но сегодня я хотел объявить DNAT для порта SSH, поэтому я установил $2 на 5022, а $3 на 20:22, в результате чего получилась следующая строка для ясности:
iptables -t nat -A PREROUTING -d ${MAIN_IP} -p tcp --dport 5022 -j DNAT --to-destination 192.168.1.20:22
Но это не работает: соединения истекают по тайм-ауту, когда я пытаюсь подключиться к виртуальной машине по ssh. Обратите внимание, что они не истекают по тайм-ауту, когда я не использую nat, так что все работает отлично. Он не работает только через NAT.ssh [email protected]
UFW не включен на сервере контейнера. Он практически ничего не слушает, так что нет необходимости что-либо закрывать — или я на это надеюсь.
Я предполагаю, что правило DNAT верно, но как мне определить, что именно меня блокирует?
Редактировать: вывод таблицы nat:
#iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere my-server tcp dpt:2113 to:192.168.1.35
DNAT tcp -- anywhere my-server tcp dpt:2115 to:192.168.1.35
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
Редактировать 2: Я временно решаю проблему с помощью VM sshd, прослушивающего несколько портов. Таким образом NAT работает просто отлично.