我们正在使用云服务器 (Debian Squeeze),其中公共 IP 上的公共端口将流量路由到内部服务器。我们正在寻找一种使用 IPTables 和 ssh 的方法,其中基于 ssh 连接字符串的某些部分(或类似内容),iptables 将重新路由 ssh 连接到“正确的”内部服务器。这将允许我们使用一个公共端口,然后将 ssh 连接重新路由到各个服务器。
因此,例如我们希望做如下的事情:
- 用户发出 ssh 连接(公钥加密),例如 ssh -X -v -p xxx[电子邮件保护]但也许会在字符串中添加一些内容供 iptables 使用
iptables 使用该字符串的某些部分或某种方式将连接重新路由到内部服务器,例如
iptables -t nat -A PREROUTING ! -s xxx.xxx.xxx.0/24 -m tcp -p tcp --dport $EXTPORT -j DNAT --to-destination $HOST:$INTPORT
....其中
$HOST
是服务器的内部 IP,$EXTPORT
是面向公众的通用端口,$INTPORT
是内部服务器端口。
看起来 iptables 的“字符串”方面并没有实现我们想要的效果。
我们目前可以根据我们正在使用的 IP 表语法进行路由,但依赖于每个服务器都有单独的公共端口,并希望使用一个公共公共端口,然后根据 ssh 连接字符串的某些部分或其他方式重新路由到特定的内部服务器。
有什么建议吗?谢谢!
答案1
这是不可能的。您与 ssh 服务器之间的通信是完全加密的,iptables 无法查看数据包内部,因此只能根据发送方和接收方的 IP/端口进行匹配。
我将在可公开访问的机器上设置不同的端口,并通过 iptables 将它们转发到后台的机器,然后在 ssh 客户端配置(~/.ssh/config)中执行如下操作:
Host machineA
HostName your-public-machine
Port 12341
Host machineB
HostName your-public-machine
Port 12342
Host machineC
HostName your-public-machine
Port 12343
有了这个配置,您只需运行ssh machineA
,ssh machineB
或ssh machineC
就可以到达正确的机器。