![了解并查看 ssh 隧道如何分配端口?](https://linux22.com/image/82717/%E4%BA%86%E8%A7%A3%E5%B9%B6%E6%9F%A5%E7%9C%8B%20ssh%20%E9%9A%A7%E9%81%93%E5%A6%82%E4%BD%95%E5%88%86%E9%85%8D%E7%AB%AF%E5%8F%A3%EF%BC%9F.png)
今天我试图解决通过 SSH 隧道连接到 vnc 的一个小问题,其中可能的问题之一是其他人已经通过隧道连接到该端口。在不深入讨论该问题的具体细节的情况下,它让我意识到我不太了解如何 ssh 隧道分配资源以及如何查看它们。
所以我有两个问题。首先,如果我创建了一个 SSH 隧道,但当前没有使用该隧道(即,我的本地系统上没有任何内容连接到隧道端口),哪些端口当前被阻止并且无法供其他人使用?我很确定我的源端口将由我的隧道拥有,因此不能被其他应用程序绑定,但是目标端口呢?该端口是否已经绑定到隧道,或者仅当我尝试连接到本地端口并且连接通过 SSH 隧道连接到我的目标端口时才会绑定?
其次,如何查看我的系统上存在哪些 ssh 隧道?如果我在本地创建隧道,我可以为适当的程序执行 ps 和 grep 操作,但是如果我有一个客户端创建到我的服务器端口的本地隧道,有没有一种方法可以从我的服务器看到该隧道存在;即使客户端尚未通过隧道连接到程序?
答案1
netstat
和lsof
或fuser
是典型的程序,用于查看哪些端口被什么打开(尽管可能需要root
或此类访问,具体取决于 Unix 的风格并有所不同)。共享目标端口就可以了。通过 Beej 的网络指南来理解所涉及的系统调用可能会有所帮助。
如果客户端尚未连接,则它所建立的任何端口都不会被绑定,因为该步骤仅在建立连接时才会发生。 (例外:可能存在因现已关闭的连接而延迟的端口TIME_WAIT
等。)
答案2
在Linux客户端上,您可以使用 来查看监听端口netstat -lnp |less
。
在 ssh 会话中,您可以按 Enter 两次,然后键入~#
。这将列出该会话当前转发的端口。
答案3
有隧道和端口转发。你说的是第二个。只是不要混淆术语,好吗?
(1) 对于本地端口转发本地计算机上转发的组合host:port
被阻止(接受连接)。另一侧remote_host:remote_port
可用于不同的连接。数据在本地端启动连接后发送。
为了远程端口转发事实恰恰相反。
(2) 正如其他答案中提出的,您可以使用netstat
查看本地侦听端口,并且当使用多路复用连接/从内部连接时,有~#
,它会打印活动会话和 TCP 转发。