Вот моя топология сети, 101.101.101.101 и 202.202.202.202 являются глобальными IP, в то время как 10.0.1.1 и 10.0.1.251 являются локальными IP. Хост B - мой компьютер.
Я могу SSH к маршрутизатору и затем SSH к хосту A на маршрутизаторе. Теперь я хочу подключить SSH к A напрямую, установив iptables на маршрутизаторе, например: пересылка всех пакетов с целевым хостом 101.101.101.101 и портом 25122 на 10.0.1.251:22.
Следующие три инструкции применяются:
iptables -t nat -A PREROUTING -d 101.101.101.101 -p tcp -m tcp --dport 25122 -j DNAT --to-destination 10.0.1.251:22
iptables -t nat -A POSTROUTING -o br-lan -j SNAT --to-source 10.0.1.1
iptables -t nat -A POSTROUTING -o eth0.2 -j SNAT --to-source 101.101.101.101
После выполнения они отображаются в списке iptables -t nat -v -n -L
. Правила маршрутизации на маршрутизаторе таковы:
#route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 101.101.101.254 0.0.0.0 UG 0 0 0 eth0.2
10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan
Однако после того, как все это сделано, я все еще не могу подключиться по SSH к A с помощью «ssh 101.101.101.101 25122» на B. Он просто не работает с:
Could not connect to '101.101.101.101' (port 25122): Connection failed.
Ситуация такова, что инструменты tcpdump не могут быть установлены на маршрутизаторе, чтобы увидеть состояние пакетов там. Но я могу запустить tcpdump на хосте A и подтвердить, что ни один пакет не пересылается с маршрутизатора.
На роутере
#cat /proc/sys/net/ipv4/ip_forward 1
который показывает, что форвард включен.
iptables -t nat -v -n -L
каждый раз после того, как я сделал ssh на B, я могу видеть пакеты изменений PREROUTING маршрутизатора.Chain PREROUTING (policy ACCEPT 39526 packets, 3345K bytes) pkts bytes target prot opt in out source destination 14 712 DNAT tcp -- * * 0.0.0.0/0 115.156.132.118 tcp dpt:25122 to:10.0.1.251:22
Первое число (14) увеличивается каждый раз, когда я запускаю ssh на порт 25122 на хосте B. Это указывает на то, что пакеты поступили на маршрутизатор, но не были переадресованы?
- Я запускаю
iptables -v -n -L
и нахожу, что политика по умолчанию для цепочки FORWARD - DROP, а цепочки INPUT и OUTPUT - ACCEPT. Затем я устанавливаю цепочку FORWARD для принятия с помощьюiptables --policy FORWARD ACCEPT
. Тем не менее, SSH по-прежнему не работает, как указано выше.
И вот я здесь. Может ли это быть проблемой жесткого ограничения маршрутизатора или неправильными настройками iptables. Если это последнее, как я должен установить его для достижения моей цели?
Большое спасибо за любые подсказки.