SSH正向与反向代理

Posted by Codeboy on November 12, 2015

日常中经常遇到需要代理的问题,例如需要访问google,但是直接访问不了,那我们可以通过另外一台服务器来进行访问,这个称为正向代理,当然与之相对的就是反向代理,反向代理的用途也很多,例如在家不能直接登录公司里自己的电脑,那么可以使用反向代理将一台远程主机的端口映射到公司电脑的22端口(ssh)或3389端口(远程桌面),下面具体总结一下正向代理反向代理的使用与配置。

准备工作

开启ssh的转发功能,以ubuntu server12.04为例,服务器默认是安装了openssh-server的,在/etc/ssh/sshd_config末尾追加一下命令:

GatewayPorts yes

重启ssh

service ssh restart

正向代理

正向代理的典型例子是主机(A)通过一台可以访问的主机(B)来访问主机(C)提供的服务。 主机A不能直接访问主机C提供的服务,但是主机A可以访问主机B,主机B可以访问到主机C的服务,那我们可以在主机A上使用以下命令

ssh -CNfL a_port:c_ip:c_port b_user@b_ip

其中CNf都不是必须参数,C是对数据进行压缩,N代表不执行远程命令(尽量带上),f代表后台执行。 主机A可以通过访问自己的a_port端口来访问主机C的c_port端口,例如主机A要通过自己的6666端口访问主机C的80端口,则需要执行一下命令

ssh -CNfL 6666:c_ip:80 b_user@b_ip

我们可以将问题简化一些,假设主机B的某个端口不对外提供服务,只能够主机B自己访问,那么上述命令中的主机C和主机B将是一样的,命令将变为

ssh -CNfL a_port:b_ip:b_port b_user@b_ip
ssh -CNfL a_port:localhost:b_port b_user@b_ip

以上两条命令是等价的,因为在第一个端口(a_port)后面的地址(b_ip)与端口(b_port)是相对于命令最末端的主机(b_ip)来说的,如果主机A是要用主机B来代理主机B的某项服务,那么第一个端口后写的主机地址为主机B的ip或者是localhost(127.0.0.1)是没有区别的。

反向代理

反向代理正向代理的原理差不多,都是用过ssh进行数据的传输,只是使用场景不同.反向代理的作用可以认为是把内网中的主机(A)暴露出来,以便于所有的主机都可以访问到主机A的服务。假定我们使用一台公网可以访问的主机(B)来给主机A做反向代理,那么命令如下

ssh -CNfR b_port:127.0.0.1:a_port b_user@b_ip

CNf与正向代理相同,也不是必须的,在主机A上使用以上命令,即可以把主机B的b_port端口映射到主机A的a_port端口,举个简单的例子,主机A处于内网中,公网不能访问,在主机A上有一个http服务器,现在想让异地的朋友能够看到这个服务器上的内容,那我们就可以使用一下命令:

ssh -CNfR b_port:127.0.0.1:80 b_user@b_ip

b_port自己定义,不要冲突就行,之后我们通过b_ip:b_port就可以访问到主机A的http服务了。

动态转发

说完了ssh的两种代理,我们再来说一下ssh的动态转发,动态转发类似与正向代理,但是还是有些区别,我们经常想在国内访问google,但是各种原因要求我们必须需要经过代理才能访问,之前的正向代理仅仅代理到了某台主机的一个端口,并不能满足我们的要求,如果我们要对整个浏览器的请求做代理呢?这时就可以使用动态转发来操作了,我们仅仅需要设置本地主机(A)的一个端口就行了,之后将浏览器代理到本机A(127.0.0.1)的这个端口,这些操作的前提是远程主机(B)可以访问google和facebook。在主机A上执行命令

ssh -CNfD a_port b_user@b_ip

CNf参数同上,a_port即本地的端口,成功动态转发后,只需将浏览器的sock代理设置到本机的a_port即可访问各种服务。

小结

不过上面的哪一种方式,都是通过ssh隧道进行数据的传输完成的。ssh是一个非常的棒的命令,包括使用X11图形界面的-X命令,文件传输的scp命令等,都很好用。

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。