利用SSH port forwarding充分利用SSH创建安全网络通道,穿越防火墙

大致内容是这些: 
local port forward -- 在本地创建端口,用ssh转发 
ssh -L 8888:localhost:8888 username@codemonkey1 
这条命令在客户端机器上执行。 
我们需要访问codemonkey1这台机器的8888端口,这个端口上跑的是一个web应用,但是这个应用只允许localhost访问(出于安全考虑),现在我们人在外地,需要访问这个网页,由于不能直接访问,所以我们可以用ssh来中转(这台机器上的SSH Server是开放的)。 
所以,这台命令的解释是:首先在本机创建一个8888端口,然后,所以尝试连接本地机器的8888端口的数据会被封装成ssh协议的格式,然后传输到codemonkey1这台机器的ssh端口,然后,这些数据会被解开,变成访问codemonkey1这台机器的8888端口。这条命令运行后,我们打开浏览器,直接访问http://localhost:8888即可看到codemonkey1机器上8888端口上的网页了。 
第一个8888表示在本机(客户端)创建一个8888端口,第二个参数localhost指的是要访问机器(服务器端)的hostname,第三个参数是要访问机器的端口。所以,第二个参数localhost和第三个参数8888连起来,就好像是人坐在codemonkey1机器前,访问localhost:8888的效果一样。 
remote port forward -- 在远程机器上创建端口,用ssh转发 
ssh -R 5900:localhost:5900 friend@fedora1.mydomain.com 
这条命令要在服务器端执行(远端机器上执行)。fedora1.mydomain.com是客户端机器的主机名。 
背景是这样的:我们的机器叫fedora1.mydomain.com,我们有个朋友需要我们远程协助他(5900端口是vino这个远程桌面服务监听的端口),但是我们这个朋友的机器,我们无法访问(用vino和ssh都无法直接访问!),幸好的是我们的这个朋友能用ssh的方式访问到我们的机器,即fedora1.mydomain.com。 
于是,让我们的这个朋友在他的机器上执行上面的命令,有这样的效果:这个命令执行后,我们朋友的这个机器发出ssh请求,连接到我们的机器fedora1.mydomain.com,然后在我们的机器的5900号端口上创建一个监听,同时把这个监听端口和自己的机器的5900的端口绑定。由于这个连接是我们的朋友发起的,所以能穿过防火墙。 
现在,我们就可以通过命令vncviewer localhost来看到我们这个朋友的电脑桌面了!因为是这样的,vncviewer localhost这个命令会尝试连接本地的5900端口,但是这个端口刚才被我们的朋友绑定到了他自己机器的5900端口了,所以,我们就能看到他机器上的桌面了。 
三个参数中,第一个参数5900表示的要在fedora1.mydomain.com上监听的端口号;第二个参数和第三个参数表示的是fedora1.mydomain.com的5900端口要和哪个host的哪个port绑定
文章中别人的reply中还提到了可以使用ssh作为一个socks代理服务器。如: 
ssh aaa.domain.com -D 8080 
首先要保证我们能ssh上aaa.domain.com这台机器。登上这台机器后,此时,我们本机的8080端口ssh程序就在监听。由于socks代理是一个无视应用和协议的代理协议,他是底层电路层的代理,只是呆板的转发数据,所以性能更高,适用性也更广。现在,如果我们要看网页,那么,开IE,配置IE中的socks代理为localhost:8080,这样,所有,从IE发出的请求,都会来到本机的8080端口,被ssh收到,然后变成ssh的格式发送到aaa.domain.com,然后再由aaa.domain.com继续发出http请求,取回网页,最后传回我们的机器上来。 
同理,FTP也可以这样做。 
有了socks代理,ssh太强大了。唯一的缺点就是应用程序本身要支持socks代理的配置。
这个原理明白了之后,在windows上也可以这样做。windows上我们安装的ssh secure shell client中有个Tunnel的配置,在里面添加outgoing tunnel,就等于配置了一个local port forwarding,配置一个incoming tunnel,就等于配置了一个remote port forwarding,配置完成后,选择登录一个主机,然后针对该主机的port forward就生效了。 
但是ssh secure shell client不支持socks服务器,也就是不支持ssh -D这个option,我查了一下,只有Putty是支持的,所以,以后还是用Putty了。Putty唯一的不方便就是用sftp上传下载文件的时候,不太方便。没有GUI界面,要用命令操作。
原文地址:https://www.cnblogs.com/super119/p/1902895.html