1. 直接转发
如果执行命令的机器为192.168.1.99
ssh -D 8972 192.168.1.100
建立连接之后,回环地址的8972端口会被监听,如果通过这个代理发送请求
curl --socks5 localhost:8972 http://www.baidu.com
或者配置浏览器使用socks5代理:localhost:8972。信道如下,即192.168.1.99会以本地一个高于32768的端口和192.168.1.100建立连接
localhost:48321<--->localhost:8972 192.168.1.99:48333<---->192.168.1.100:22 192.168.1.100:48999<----->baidu
这种方式常用作代理上网
2. 本地端口转发
假定执行命令的机器是192.168.1.99,这台机器不能访问外网,但是192.168.1.100是一台代理服务器,可以访问外网
ssh -L 8972:www.baidu.com:80 user@192.168.1.100
通过这个命令,当访问本机的8972端口时
telnet localhost 8972
将建立以下链路:
localhost:48500 <--->localhost:8972 192.168.1.99:48512<--->192.168.1.100:22 192.168.1.100:48515<--->www.baidu.com:80
如果其中的192.168.1.100和www.baidu.com都换成localhost,则这会将本地端口8972的请求全部转发到80端口
一般如果不指定-g参数,建立的是本地端口监听;指定-g参数,则将该端口对其他ip地址开放。
3. 远程端口转发(反向代理)
假定执行命令的机器是192.168.1.99,这台机器不能被外网访问,但是可以访问局域网的mysql,但是192.168.1.100是一台代理服务器,可以被外网访问,但是不能访问mysql服务器。
在192.168.1.99上执行
ssh -R 8972:mysql:3306 192.168.1.100
这样,可以再192.168.1.100上访问localhost:8972端口就可以访问到mysql。
访问过程中,通信链路:
192.168.1.100:48500 <---> 192.168.1.100:8972 192.168.1.100:22 <---> 192.168.1.99:48634 <---> mysql:3306
这种方式可以用于从公网访问内网机器