OpenSSH 通过其加密的数据通道可以创建三种类型的端口转发,分别是本地(Local)、远程(Remote)和动态(Dynamic)。那么这三种类型的端口转发具体是如何工作的呢?下面就分别说一下,只是说一下大致的工作过程,不是详细的实现。

本地(Local)

ssh-N-L bind_address:bind_port:host_name:host_port username@server_address

当上面的命令被执行后,运行在客户端的 ssh 进程先连接运行在服务器端(server_address) sshd 进程,并进行身份验证。如果验证成功了,ssh 和 sshd 之间会建立一个 TCP/IP 连接,用于传输数据,这个连接上面传输的数据是加密的。

接着 ssh 会在 bind_address:bind_port 上创建一个 TCP/IP 协议的 socket 并进行侦听,当收到数据后直接通过之前建立的连接传输给服务器上的 sshd 进程, sshd 收到数据后会新建一个 socket 连接 host_name:host_port 并向其发送之前收到的数据。

相反,当 sshd 收到数据后也会按类似的方式通道加密通道传输给 ssh 进程。这样通过加密通道的本地端口转发就工作起来了。

远程(Remote)

ssh-N-R bind_address:bind_port:host_name:host_port username@server_address

远程类型的端口转发和本地类型的原来是一样的,只是侦听的端口刚好相反。这种类型的端口转发是 sshd 进程创建一个 TCP/IP 协议的 socket 在 bind_address:bind_port 上侦听,而 ssh 则是在第一次收到数据后创建 socket 连接 host_name:host_port。

动态(Dynamic)

ssh-N-D bind_address:bind_port username@server_address

动态类型的转发是 ssh 创建一个 socks v5 的服务并在 bind_address:bind_port 上侦听,当收到数据后,解析出需要连接的主机和端口并通道加密通道发送给 sshd,sshd 转发数据后并返回结果数据。

特别的地方就在被连接的主机是通过 socks v5 进行动态确定的。这样的端口转发功能用作加密代理是不错的选择。

http://www.ibm.com/developerworks/cn/linux/

https://www.fdb713.com/whats-the-meaning-of-l-r-option-in-ssh-man-page/