我们在工作中经常使用ssh
,但大多数人很少用到反向代理的功能,本文介绍反向代理的概念以及使用反向代理来访问内网的服务器,在一些特殊的情况下(例如公司的VPN
不能用了)会很有帮助。
我们一般说的代理,都是正向代理,例如内网的服务器通过代理服务器访问公网。而反向代理则相反,可以访问公网的客户端通过反向代理服务器访问内网的服务器。
而在ssh
命令中,反向代理是指将远程主机的某个端口转发到本地端指定机器的指定端口,以实现通过远程主机的端口来访问本地端口,这种反向代理的特点是:
以下结合两个具体的实验来说明反向代理的作用,实验1
通过远程端口转发实现了ssh
连接内网服务器,实验2
在实验1
的基础上增加动态端口转发以访问内网的网站。
准备三台主机,分别是:
A
,A
可以访问公网,不能从公网被访问
IP
: 172.16.150.244
20183
cdg_dev
B
IP
: 161.179.121.89
22
user2
key.pem
C
,可以访问公网,不能访问A
所在的内网在A
上开启反向代理:
A
的环境中登录A
,然后执行以下命令ssh -i key.pem -fCNR 1127:localhost:20183 ec2-user@161.179.121.89
1127
是把B
的1127
端口转发到了A
的20183
端口在B
上验证:
执行netstat -antpul | grep 1127
,可以看到1127
端口处于监听状态
[user2@B ~]$ netstat -antpul | grep 1127
tcp 0 0 127.0.0.1:1127 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:1127 :::* LISTEN -
执行ssh -p 1127 cdg_dev@127.0.0.1
可以登录到A
在C
上执行以下命令可以一步登录到A
:
ssh -i key.pem -t user2@161.179.121.89 ssh -p 1127 cdg_dev@127.0.0.1
在完成实验1
步骤3
的基础上,在本地主机C
执行以下命令,开启本地端口转发,将本地12345
端口通过B
转发到127.0.0.1:1127
:
ssh -i key.pem -Nf -C -L 12345:127.0.0.1:1127 user2@161.179.121.89
在C
上验证,输入以下命令可以直接访问A
:
ssh -p12345 cdg_dev@127.0.0.1
在C
上输入以下命令,开启动态端口转发,即在本地起了一个端口是23456
的代理服务器,转发给127.0.0.1:12345
,相当于转发给了A
:
ssh -Nf -C -D localhost:23456 cdg_dev@127.0.0.1 -p 12345
通过代理在C
上访问内网域名,http
响应正常:
curl --socks5 127.0.0.1:23456 172.16.150.244:8088/login/