У меня есть удаленный компьютер Linux, подключающийся к локальному ssh-серверу, создающий обратный ssh-туннель на порту 5051. На самом ssh-сервере я запускаю следующие две команды, чтобы дать удаленному компьютеру локальный IP-адрес.
ip addr add 192.168.1.51/24 dev eth0
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp --dport 22 -j REDIRECT --to-port 5051
На ssh сервере я также настроил GatewayPorts да в sshd_conf.
С третьего компьютера в моей сети, если я использую ssh на 192.168.1.51, я подключаюсь напрямую к удаленному компьютеру Linux.
Но с сервера ssh, если я использую ssh 192.168.1.51, я снова подключаюсь к серверу ssh. Я не подключаюсь к удаленному компьютеру. Единственный способ подключиться к удаленному компьютеру с ssh-сервера - использовать корень ssh @ localhost -p 5051
Но я не хочу этого делать. Я хочу иметь возможность использовать ssh 192.168.1.51 с ssh-сервера и подключаться к удаленному компьютеру.
Правила цепочки PREROUTING таблицы IPTables применяются только к IP-пакетам, поступающим из других систем через сетевой адаптер, подключенный к сети.
Если вы хотите применить правило к локально сгенерированным пакетам, вам необходимо добавить правило в цепочку OUTPUT.
Итак, вам нужно сделать это:
iptables -t nat -A OUTPUT -d 192.168.1.51 -p tcp --dport 22 -j REDIRECT --to-port 5051