为什么 ssh -R 允许端口“0”但 ssh -L 需要端口号?

为什么 ssh -R 允许端口“0”但 ssh -L 需要端口号?

为什么ssh -R通过指定“0”就可以分配一个空闲端口,而使用时却ssh -L需要指定一个有效的空闲端口?

我希望 ssh 使用本地空闲端口转发远程流量,而无需依赖免费端口黑客

手册页

-R [bind_address:]端口:主机:主机端口

如果端口参数为“0”,则监听端口将在服务器上动态分配,并在运行时报告给客户端。

但是 -L 不提供这种可能性 :(

-L [绑定地址:]端口:主机:主机端口

指定将本地(客户端)主机上的给定端口转发到远程端的给定主机和端口.....

答案1

因为 OpenSSH 尚未决定实现这一点。也许是时候提出功能请求了。不过,不确定它如何使端口号可供其他程序访问……也许写入某个文件?

但是,只需编写一些代码,您就可以轻松完成此操作。

伪代码:

  1. 选择随机数[1000-65535]:export LOCAL=$(( $RANDOM + 1000 )) (够好了)
  2. 尝试连接ssh some.host -L $LOCAL:dest.host:1234
  3. 如果失败,则重复。
  4. 用于$LOCAL获取所使用的随机端口。

不幸的是,这在 bash 中很难很好地实现,否则我会在这里给出一个更完整的例子。

答案2

SSH 将绑定到 L 指定的端口并在其上侦听任意客户端发起的连接(以及已经建立的连接上的数据包,将它们转发到远程服务器,但这与这个问题的上下文无关)。

为了发起连接,客户端必须指定服务器监听此类请求的端口号。如果随意选择此类端口,则客户端不知道该端口,因此无法发起连接。

因为-R这不是问题,因为远程服务器不会接受该端口上除本地服务器(从参数中知道端口号-R)之外的任何连接。

建立初始连接之后,客户端和服务器都可以针对实际流量协商(从而了解)额外的动态分配端口。

相关内容