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
开关。
除此之外,还有几个常用的开关:
-C
:压缩数据传输-f
:SSH客户端在后台运行-q
:安静模式,忽略一切对话和错误提示
反向代理
说完了正向代理,现在来看反向代理。示意图如下:
客户端 => 代理服务器 <= 远程主机
反向代理的一个应用场景是,代理服务器有公网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”呢?如果按照“左”、“右”理解的话,正向代理是从左向右的,反向代理是从右向左的,两个理解方式都能说通。