ssh的tunnel隧道打洞
分正向和反向。
假设,本地机器可以ssh连上远程机器。本地机器在下面叫做SSHClient, 远程机器叫做SSHServer.
一、 正向代理(本地转发)
在SSHClient机上执行:
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=20 -NfL 1234:localhost:12300 SSHServer -p22
注意:
1. 蓝色部分就是一个ssh语句。绿色是本地。红色是远程。
2. 这里面的"localhost"指的是SSHServer机上的localhost。而绿色1234才是本地。
3. 这条命令的作用是:在本机(SSHClient机)上打开一个端口1234,这个1234能把接收的数据转发到SSHServer机上的12300端口.
4. 注意SSHClient机上的1234在SSHClient的localhost上。如果希望SSHClient的同内网其他机器(能够直接访问SSHClient的机器)也能访问这个1234,怎开办呢?加-g参数:
ssh -g -NfL 1234:localhost:12300 SSHServer -p22
(加-g参数前后,可以看看 lsof -i :1234 的区别: LISTEN从localhost变为*了~)
也可以这样:
ssh -NfL 0.0.0.0:1234:localhost:12300 SSHServer -p22
5. 如果想转发的是SSHServer机器上可以访问的其他服务,比如www.baidu.com:80,那就把上面命令里的红色换成www.baidu.com:80即可。然后浏览器打开localhost:1234,却发现然并卵——"Empty reply from server"。。。其实已经转发成功了,但是对于http应该这样: curl -H "Host: www.baidu.com" -X GET http://localhost:1234
二、反向代理(远程转发)
在SSHClient机上执行:
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=20 -NfR 2222:localhost:22 SSHServer -p22
注意:
1. 蓝色部分就是一个ssh语句。绿色是本地。红色是远程。
2. 这里面的"localhost"指的就是本机(SSHClient机)上的localhost。而红色是远程机上开了个‘洞’。这时上SSHServer上 lsof -i :2222 就会发现已经打开了端口监听。
3. 这条命令的作用是:在远程机器SSHServer上开了一个端口2222, 这个2222会把接收到的数据转发到SSHClient上的22端口。
(22是ssh,那么登上SSHServer用ssh连SSHClient试试: ssh user@SSHClient -p2222 这里假设SSHClient机上面也安装了ssh服务)