我们在工作中经常使用ssh,但大多数人很少用到反向代理的功能,本文介绍反向代理的概念以及使用反向代理来访问内网的服务器,在一些特殊的情况下(例如公司的VPN不能用了)会很有帮助。
我们一般说的代理,都是正向代理,例如内网的服务器通过代理服务器访问公网。而反向代理则相反,可以访问公网的客户端通过反向代理服务器访问内网的服务器。
而在ssh命令中,反向代理是指将远程主机的某个端口转发到本地端指定机器的指定端口,以实现通过远程主机的端口来访问本地端口,这种反向代理的特点是:
以下结合两个具体的实验来说明反向代理的作用,实验1通过远程端口转发实现了ssh连接内网服务器,实验2在实验1的基础上增加动态端口转发以访问内网的网站。
准备三台主机,分别是:
A,A可以访问公网,不能从公网被访问
IP: 172.16.150.24420183cdg_devB
IP: 161.179.121.8922user2key.pemC,可以访问公网,不能访问A所在的内网在A上开启反向代理:
A的环境中登录A,然后执行以下命令ssh -i key.pem -fCNR 1127:localhost:20183 ec2-user@161.179.121.891127是把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/