两者在功能上有什么区别?我有点困惑。
本地转发使远程端口在本地可用。
远程转发使本地端口可远程使用。
但这种“可用性”在两个方向上都是有效的……或者真的有效吗?
例如以下内容(从主机“home”发出)
ssh -R 1234:localhost:2345 user@work
这将在工作::1234 和家庭::2345 之间建立一个安全隧道,对吗?
如果我在一端放入任何东西,它就会从另一端出来。
但是,我可以通过来自主机“工作”的以下调用来实现相同的目的:
ssh -L 1234:localhost:2345 user@home
那么,唯一的区别就是我从哪里调用它,对吗?
答案1
主要的实际区别是,如果连接两台计算机 A 和 B,并且 B 位于您无法控制的防火墙或 NAT 路由器后面,并且它阻止传入...您坐在 A 处。您无法让 A 连接到 B。但 B 不会阻止传出...所以你让 B 连接到 A。
--补充说明--
上述内容,提问者理解为……意味着本地和远程转发之间的主要实际差异。ssh -L 和 ssh -R 分别用于什么。我没有评论他给出的具体示例命令,他切换 -L 和 -R 的位置,以及他连接到哪个 sshd 服务器。但现在我将尝试对此进行评论。对于他给出的 ssh 命令,从常规客户端和常规服务器的角度来看,似乎没有区别,因为它没有说“啊,这是一个 ssh 客户端,这是一个 ssh 服务器……”它不知道 ssh ,并且 ssh 的客户端/服务器方面是无关紧要的,对于常规客户端和常规服务器来说也是未知的。他们只关心谁在听,从他们的角度来看,它看起来是一样的。工作计算机正在监听 1234。他们没有注意到在一种情况下它是一个 sshd.exe ssh 服务器,而在另一种情况下它是一个 ssh.exe,ssh 客户端。顺便说一下,ssh 客户端所在的地方被视为本地。
答案2
是的,如果我理解正确的话,从 a 到 b 的本地端口转发应该与从 b 到 a 的远程端口转发相同(反之亦然)。从 a 到 b 的传出隧道(从 a 来看)应该等于从 a 到 b 的传入隧道(从 b 来看)。
本地端口转发创建一个传出隧道可用于将公共互联网计算机连接到本地计算机。本地用户可以访问本地主机上的远程主机:端口组合,因为本地(客户端)主机上的给定端口被转发到远程端的给定主机和端口:
ssh -L local_port:remote_host:remote_port user@hostname
远程端口转发创建一个传入隧道可用于将本地计算机接入公共互联网。互联网用户可以访问远程主机上的某个本地主机:端口组合。远程(服务器)主机上的给定端口将转发到本地端的给定主机和端口:
ssh -R local_port:remote_host:remote_port user@hostname
答案3
使用本地端口转发,您(客户端)在计算机上打开一个侦听套接字,并将应用程序级协议客户端连接到此套接字。现在,连接通过 SSH 转发到服务器。服务器连接到远程主机,并将数据从协议客户端隧道传输到最终目的地。
使用远程端口转发,服务器会在服务器主机上打开一个监听套接字。一些远程应用程序连接到此主机并发送信息,这些信息会传输到您的客户端计算机。在此,会建立与最终目的地(在您的计算机或网络上运行的某些应用程序级协议服务器)的连接,并将数据从远程应用程序传输到最终目的地。
答案4
socat 的手册页很好地阐明了这一点。是的,我知道 ssh 和 socat 是两个完全不同的东西 - 但 socat 的文档非常好。