ssh的端口转发不仅仅是为ssh服务,因为它可以转发任意端口,所以理论上可以为任意服务提供转发,实现一些不可能的连接。
机器假设
A: 192.168.1.2(Server1) B: 192.168.1.3(Server2) C: 192.168.1.101(client1) D: 192.168.1.102(client2) E: 8.8.8.8(Remote Server)
本地转发(在client机器上执行的命令)
ssh -L <local port>:<remote host>:<remote port> <SSH hostname> 如: ssh -L 8000:localhost:80 user@192.168.1.2
上述转发只能在执行命令的client本机使用,如果想在其它机器上也能使用,需要添加GateWayPorts(即-g)
ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>
如果转发不可用,很可能是执行命令的client机器上没有开启防火墙端口。
不过需要注意的是,该连接并没有完全使用ssh的加密功能,只有执行命令的client和ssh hostname机器之前的连接是加密的。
另外,remote host和ssh hostname可以是不同的机器,如:
ssh -g -L 8000:192.168.1.2:80 user@192.168.1.3
上述转发最终转发的还是192.168.1.2上的80端口,只不过是借助了192.168.1.3机器。当client无法直接ssh连接server 192.168.1.2时,如果可以ssh连接server 192.168.1.3并且192.16.1.2上的服务可以被192.168.1.3访问时就可以这么搞了。不过需要注意的是,该连接并没有完全使用ssh的加密功能,只有执行命令的client和ssh hostname机器之前的连接是加密的。
远程转发(在server机器上执行的命令)
ssh -R <local port>:<remote host>:<remote port> <SSH hostname> 如: ssh -R 8000:localhost:80 user@192.168.1.101
和本地转发的区别就是在server端执行命令,-L变成了-R,ssh登录的机器由server变成了client。转发效果是完全一样的。之所以搞这么两套是因为有时候client和server并不是都能互相ssh连接的。
上述转发同样只在该client机器(192.168.1.101)有效,如果想在其它机器上也能使用,需要开启GateWayPorts。只不过这次不能再用-g参数,而是在/etc/ssh/sshd_config中添加一行
GateWayPorts yes
然后
service sshd reload
因此,执行
ssh -R 8000:localhost:80 user@8.8.8.8
由于8.8.8.8机器在公网,所以可以实现所有机器通过8.8.8.8机器访问在公网不可见的server。并且可同时转发多个端口,如:
ssh -R 8000:localhost:80 -R 8001:localhost:8080 user@8.8.8.8
动态转发(在client机器上执行的命令)
ssh -D <local port> <SSH Server> 如: ssh -D 1080 user@192.168.1.2
在client机器上配置SOCKS v5代理(代理为localhost,端口即为我们指定的1080)。
动态转发就是在client机器上把server机器当作了一个SOCKS v5代理。这样也可以用于实现所有端口的转发,不再需要一一配置。
后台执行
上述转发命令执行完了以后会ssh远程登录到ssh hostname机器,如果我们并不想ssh登录,仅仅是想执行端口转发,可以在ssh之后添加“-fN”(要放在ssh之后紧挨着,不要放在-L、-R、-g等之后)。
其它高级用法
待续。。。
Windows上使用
ssh client
可用的很多,putty, Xsheel等。
sshd server
设置最简单的就是Bitvise(个人使用免费),还有一些开源的可以使用,如:FreeSSHd,Kpym(但都Discontinued了)。功能最强大的就是cygwin,只是设置稍微有点麻烦。
需要注意的是:如果安装多个server软件,同时只能开一个,或者把端口设置成不一样的。不然很可能连上的并不是你想要的那个。