Keuin's

SSH的正向代理/反向代理

正向代理

正向代理的连接示意图如下:


客户端 => 代理服务器 => 远程主机

可见,正向代理即为客户端主动连接代理服务器,然后代理服务器再将请求转发到真正的目的主机——远程主机。常见的一个正向代理的例子是HTTP代理服务器。

为了创建一个SSH的正向代理,需要使用-L开关:-L X:host:Y意思是将host(远程主机)Y端口映射到客户端回环地址X端口。

举个例子:我想要通过192.168.1.2的ssh服务访问到192.168.40.1的80端口,只需要执行


ssh -L 8888:192.168.40.1:80 192.168.1.2

即可。ssh会要求你登录,然后会进入到你的shell,此时你就可以通过访问localhost:8888来访问192.168.40.1:80了。

但是这样会弹出一个一般的shell,如果我们不需要shell、只需要代理的话,该怎么做呢?很简单,只需要加上-N开关即可:


ssh -NL 8888:192.168.40.1:80 192.168.1.2

这样,ssh就不会给你打开shell、只会做端口转发了。

这时候,正向代理是监听在localhost上的,也就是说,只有本机可以访问正向代理。如果想要让同网络的其它主机也能通过我们的正向代理访问到192.168.40.1:80,那么该怎么做呢?这时候需要加上-g开关。

除此之外,还有几个常用的开关:

反向代理

说完了正向代理,现在来看反向代理。示意图如下:


客户端 => 代理服务器 <= 远程主机

反向代理的一个应用场景是,代理服务器有公网ip地址,而远程主机没有。如果任意公网客户端要访问远程主机,直接访问是不行的,因为远程主机没有公网ip地址。这时,需要用一个有公网ip地址的主机做中转,这一过程使用的代理方式就叫反向代理。

正向代理与反向代理的区别就在于代理服务器和远程主机(目的主机)谁是客户端谁是服务端。如果规定代理服务器为客户端时的连接方向为正向,那么代理服务器作为服务端时的代理方式就叫反向代理。

SSH的反向代理开关是-R,此时远程主机作为客户端发起ssh请求到代理服务器,参数如下:


-R [bind_address:]port:host:hostport

假设我们依旧想通过192.168.1.2:8888来访问192.168.40.1:80,该怎么做呢?这时,就需要让192.168.40.1事先连接到192.168.1.2这一步如果不能通过远程方式实现的话,说明你应该去物理机上操作,或者使用正向代理。这也是正向代理和反向代理在实践上的一个重要区别。

这时,需要在192.168.1.2上执行命令:


ssh -NR 8888:192.168.40.1:80 192.168.1.2

和正向代理的参数基本相同,其余参数也都是通用的。

A small observation

刚才你可能注意到了,正向代理的开关是-L,而反向代理的开关是-R,这两个开关究竟是“Listen/Reverse”呢,还是“Left/Right”呢?如果按照“左”、“右”理解的话,正向代理是从左向右的,反向代理是从右向左的,两个理解方式都能说通。