我正在尝试 ssh 端口转发,我偶然发现了一件令人困惑的事情。在我看来,以下命令正在做同样的事情:
ssh -NfL 192.168.121.215:2222:vm2.local:22 vm2.local
ssh -NfL 192.168.121.215:2223:localhost:22 vm2.local
ssh -NfL 192.168.121.215:2224:vm2.local:22 localhost
从 PC 连接到盆 2222、2223 和 2224 将我全部带到 vm2.local。
$ ss -antp # on vm1.local (192.168.121.215)
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.121.215:2222 *:* users:(("ssh",10170,4))
LISTEN 0 128 192.168.121.215:2223 *:* users:(("ssh",10178,4))
LISTEN 0 128 192.168.121.215:2224 *:* users:(("ssh",10225,4))
LISTEN 0 128 *:22 *:* users:(("sshd",836,3))
...
上面的命令有什么区别?创建的隧道是否有些不同?根据手册页,第一个命令是正确的,第二个命令来自某个网站,最后一个命令是我犯的错误,结果也有效。
答案1
那里是差异,即使在你的情况下并不重要。我画画不好,所以我尝试用文字来描述一下:
ssh -NfL 192.168.121.215:2222:vm2.local:22 vm2.local
这使得您的主机和
vm2.local
端口之间的连接通过此安全通道进行加密,因为每一端(本地和远程)都绑定其本地 IP 地址。ssh -NfL 192.168.121.215:2223:localhost:22 vm2.local
这与上面相同,但您不绑定公共网络接口的地址,而是绑定本地接口的地址(
127.0.0.1
)。对于 ssh 端口,没有区别(它监听两个端口),但对于仅监听的服务很重要localhost
(例如mysql
)。ssh -NfL 192.168.121.215:2224:vm2.local:22 localhost
这个是安全地连接到本地主机(基本上没有安全效果),然后直接绑定远程主机,因此您写入端口的所有内容
2224
都会直接在机器之间发送未加密的(对于 SSH 连接来说没有问题,但对于不同类型的流量来说这很重要)。
结论
您应该学习使用第二种情况,但是当不需要从外部访问转发的端口时,您应该始终绑定localhost
在本地端,如下所示:
ssh -NfL localhost:2223:localhost:22 vm2.local
其中localhost
是默认值,因此您可以将其归结为
ssh -NfL 2223:localhost:22 vm2.local