IPTables 根据连接字符串重新路由 SSH?

IPTables 根据连接字符串重新路由 SSH?

我们正在使用云服务器 (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 machineAssh machineBssh machineC就可以到达正确的机器。

相关内容