-
本地端口转发
ssh -L 1234:127.0.0.1:4567 user@host这时会在本地也就是执行这条命令的主机,监听1234端口,如果有数据,就转发到远程主机指定的端口,本例子里的远程主机127.0.0.1为ssh连接的主机,也可以是远程主机可以访问到的其他主机, 例如远程主机的ip为192.168.1.100,在此网络内还有主机192.168.1.101,100可以访问101,这时要将本地发往1234端口的数据转发到远程主机网络内的101机器的4567端口,可以这样写:
ssh -L 1234:192.168.1.101:4567 user@host
验证的话很简单,用nc命令在192.168.1.101监听4567端口 nc -l 4567
在本地 nc localhost 1234,然后发送数据,这时候在101机器上就会收到这些数据, 101发送的数据同样可以在本机侧收到;也就是tcp的socket建立上,就是双向的数据连接;
所以数据流是双向的,由本机侧发起;
-
远程端口转发
ssh -R 1234:127.0.0.1:4567 user@host和上面的命令写法一致,只是选项变成了-R,remote的意思,那角度就变了,1234变成了在对端监听,然后转发到本机的4567端口;
要是这么写:
ssh -R 1234:127.0.0.1:22 user@host
也就是在对端,所有发往1234端口的数据,转发给执行该命令主机的22端口,也就是ssh反向隧道,这时候在对端执行 ssh -p 1234 user@localhost即可登录到本机;这里同样,只要tcp的连接建立起来,数据流就是双向的,只不过由对端发起;
不管是本地还是远程转发,其实都是依赖当前建立的ssh隧道,然后根据命令选项,监听端口,收到数据,根据命令里指定的目标地址,进行转发;