建立SSH连接时如何指定本地端口?

建立SSH连接时如何指定本地端口?

我有两台服务器托管在IDC。我只能使用端口 20/21/22/23/3389/33101-33109 在两台服务器之间建立连接。 IDC 网络设备将阻止源端口或目标端口不在 20/21/22/23/80/3389/33101-33109 列表/范围内的任何其他数据包。但SSH的源端口是随机的。

使用该命令 可以轻松指定远程端口。ssh username@server -p remote_port

那么是否有ssh命令参数或其他方式来指定本地源端口,以便我可以使用端口 33101 等来建立 SSH 连接?

我的网络拓扑是这样的:
网络拓扑结构

答案1

您不能为 ssh 客户端指定源端口。

但您可以用作nc代理,如下所示:

ssh -p 33101 -o 'ProxyCommand nc -p 33101 %h %p' $SERVER_2

如何在 unbuntu 服务器上设置 SSH 的源端口?(关于服务器故障)

答案2

对于一次性或偶尔的情况,ProxyCommand 方法无疑是一种非常方便的方法。

另一方面,如果您需要多个同时连接,或者当您可能需要在日常工作中频繁使用该命令时,您也可以考虑在服务器上设置网络地址转换 (NAT) 规则。

这需要root服务器上的超级用户(通常)访问权限才能首先应用单个 NAT 规则。请注意,它可能如果您的“服务器”实际上是一个容器(如 Docker 容器)而不是一台机器,则根本不允许(或有效)应用 NAT 规则,即使您具有超级用户访问权限。

说到具有该iptables套件的典型 Linux 系统,针对示例案例在 server1 上应用的 NAT 规则可能如下所示:

iptables -t nat -I POSTROUTING -d <server2-ip-address> -p tcp --dport <server2-port> -j SNAT --to :33101-33109

该命令指示 Linux 内核与端口建立任何连接服务器2端口server2-ip-地址使用当时可用的 33101-33109 范围内选择的源端口出去。

一旦规则到位,您就可以像平常一样连接到 server2:

ssh username@server2 -p remote_port

ssh只要 NAT 规则中指定的范围内有可用端口,您就可以根据需要同时使用同一命令多次。

但请注意,netstat在服务器上运行的(或等效命令)会将连接的本地地址报告为未修改的,随机选择的源端口号,即使传送到您的 server2 的实际流量携带修改的源端口号。

要撤消 NAT 规则,命令相同,只是用一个-D选项代替-I.

启动时自动应用 NAT 规则取决于服务器上的 Linux 发行版,以及它是否已经进行了某些防火墙配置。

我没有使用类似 BSD 的系统的经验,但我相信有一个等效的系统。

相关内容