SSH隧道也可以叫SSH端口转发,这两者并没有什么太大的区别,SSH端口转发竟然实现了正向代理、反向代理和内网穿透三种常用的网络功能,更佩服其功能的强大和使用中的便利。
本地端口转发(Local Port Forwarding),是将本地主机某个端口流量转发到远程主机的指定端口。
其命令行语法是:
ssh -L [bind_address]:<local port>:[remote host]:<remote port> <SSH hostname>
”-L”即“local”的首字母,类似的远程转发的”-R”是“remote”的首字母,动态转发的“-D”是“dynamic”的首字母,很好记。
示例1:
ssh -L 5901:5901 username@host
该命令中将本地的5901端口通过ssh隧道转发到远程主机的5901端口,远程连接时输入localhost或者127.0.0.1和5901端口便连到了远程主机的5901端口。通过iptables和ssh的本地转发,实现了他人无法连接,只有自己才能访问的目的。
问:本地端口转发命令中的 remote host和 SSH hostname 可以是不同的机器么?
答:需要注意的是“-L”选项中的“远程主机”并不特指连接过去的机器(默认是连接上的机器),可以是任何一主机。例如,可以将本机的8080端口流量转发到fujieace.com的80端口:
ssh -L 8080:fujieace.com:80 username@host
示例2(实战):
假设Server-A的IP为:192.168.58.101,Server-B的IP是:192.168.58.103
在Server-B上执行如下命令:
ssh -f -N -L 9906:192.168.58.101:3306 192.168.58.101
上面的这条命令,就建立了本地端口转发(SSH隧道),本地服务器Server-B发送到9906端口的所有数据都会被转发到远程服务器192.168.58.101的3306端口。
SSH隧道已经建立,可以往隧道发送数据,会自动转发到目的服务器和端口。
在本地服务器Server-B(192.168.58.103)上执行如下命令就可以建立到远程服务器Server-A(192.168.58.101:3306)的MySQL连接:
mysql -h127.0.0.1 -P9906 -uroot -p
相关的项目命令:
ssh -p 11658 -N -L :8091:159.226.49.132:18092 root@121.46.19.2
通过本地的localhost:8091端口经过跳板root@121.46.19.2的11658端口跳转到159.226.49.132的18092端口(这个必须是开放的,可由跳板ip跳转过来)。
修改159.226.49.132d的server.xml中原本的8080端口改为18092,可通过该端口来监听本地发送来的请求。这样就可在本地,通过http://localhost:8091/gclust/index.jsp访问到原本访问不到的界面。