我有一台 GNS3 服务器,我正在尝试添加 iptable 规则,这样当我团队中的某个人连接到端口 1100 时,他们就会被路由到内部 IP,例如 192.168.122.2:22。此内部 IP 属于 GNS3 项目的堡垒主机。最终目标是能够从本地计算机访问内部 IP 地址。
我的 IPTABLE 如下所示(为了举例,使用虚假的公网 IP 1.2.3.4):
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT tcp -- 0.0.0.0/0 1.2.3.4 tcp dpt:1100 to:192.168.122.2:22
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0
Chain DOCKER (0 references)
num target prot opt source destination
Chain LIBVIRT_PRT (0 references)
num target prot opt source destination
我从本地机器执行命令。Ubuntu 是访问 GNS3 项目内部 IP 所需的用户名。ssh [email protected] -p1100
执行此命令后,我在 GNS3 服务器(1.2.3.4)上得到以下输出:
cloud@gns3:~$ connect_to 192.168.122.2 port 1100: failed.
似乎我的 SSH 命令正在到达 GNS3 服务器,并尝试进行端口转发。但是,出于某种原因,它试图转发到端口 1100 而不是 22?有人能找出原因吗?
这是我迄今为止尝试过的:
- 将 ipv4 端口转发设置为 1
- 将 GatewayPorts 和 AllowTcpForwarding 设置为 1
- 在本地机器上运行(我认为这改变了服务器上的一些配置) -
ssh -R 1.2.3.4:1100:192.168.122.2:22 [email protected]
- 使用命令向 IPtables 添加规则
sudo iptables --table nat --append PREROUTING --protocol tcp --destination 1.2.3.4 --dport 1100 --jump DNAT --to-destination 192.168.122.2:22
- 还添加了伪装:
sudo /sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
答案1
根据此来源,不应使用 DNAT,而应使用 REDIRECT:
所以:
sudo iptables --table nat --append PREROUTING --protocol tcp --destination 1.2.3.4 --dport 1100 --jump REDIRECT --to-destination 192.168.122.2:22