SSL反向隧道实现外网桥接以及内网跳板机
一、SSH 反向隧道实现 HTTP 代理
1.1 安装代理服务
在工位电脑上安装一个 HTTP 代理服务,对于 Windows 的话,可以安装 Clash for Windows、Proxifier、或 v2rayN,并且配置代理端口,一般默认在本地 127.0.0.1:7890。
1.2 建立反向隧道
在服务器上执行以下命令,建立反向隧道,将服务器的本地端口 1080 映射到工位机的代理端口 7890 上:
1 | ssh -R 1080:127.0.0.1:7890 server_name@192.158.115.8 -p 20166 |
其中,-R 1080:127.0.0.1:7890 表示在服务器上开一个端口 1080,所有流量会通过 SSH 通道转发到工位机的 127.0.0.1:7890 上。server_name 表示服务器上的用户名,后面是服务器的地址与端口。
1.3 配置服务器代理
在服务器上配置环境变量,让所有的 HTTP 和 HTTPS 流量都通过本地的 1080 端口进行代理:
1 | export http_proxy=http://127.0.0.1:1080 |
这样,服务器上的所有 HTTP 和 HTTPS 请求都会通过 SSH 隧道转发到工位机的代理服务器,从而实现访问外网的目的。可以进一步测试代理是否生效,例如使用 curl 命令访问一个外网网站:
1 | curl -I https://www.google.com |
如果成功返回 200 状态码,说明代理配置成功,服务器已经能够通过工位机访问外网了。
如果想永久配置代理,可以将上述的环境变量添加到服务器的 /etc/environment 或者 ~/.bashrc 文件中,然后重启 shell 或 source /etc/environment:
1 | echo 'http_proxy=http://127.0.0.1:1080' >> /etc/environment |
1.4 释放端口
代理命令会开放一个服务器的端口 1080,在不想用的时候直接回收释放掉这个端口,并取消服务器的网络代理即可。
1 | # 查找占用端口的进程 |
二、阿里云服务器实现内网跳板机
如果配置不能够连外网的内网服务器时,需要首先进行跳板机配置,然后进行上面的反向隧道配置 HTTP 代理。
2.1 云服务器申请
因为内网中的设备都无法被访问,并且自己的笔记本也无法被外网访问,这时就需要有个桥接的服务器,能够提供公网IP,使得两边的设备都能够连接上它。这里选择阿里云服务器,申请一个轻量级的 ECS 实例即可。
2.2 云服务器配置
允许 SSH 远程端口转发并能绑定公网接口,在 /etc/ssh/sshd_config 文件中添加或修改以下配置项:
1 | sudo sed -i -e "s/^#\?GatewayPorts .*/GatewayPorts yes/" -e "s/^#\?AllowTcpForwarding .*/AllowTcpForwarding yes/" /etc/ssh/sshd_config |
选定空闲端口作为转发端口,例如 232,并进一步地确认云服务器上端口 232 空闲,如果端口被占用,需要进一步更换端口:
1 | ss -ltnp | grep :232 || echo "232 is free (or not LISTEN)" |
在云控制台/安全组放行入站 TCP 232,即在云平台控制台添加入站规则允许 TCP 232。
2.3 内网主机建立反向隧道
在 Windows PowerShell(管理员权限 非必需,但为保险可用管理员)执行以下命令,假设 cloud_server_ip 为 120.18.41.24:
1 | ssh -v -R 0.0.0.0:232:192.158.115.8:20166 cloud_server_name@120.18.41.24 |
构建成功时,会登录到阿里云服务器并在 ssh 日志看到 listen 0.0.0.0 port 232 和 connected to 192.158.115.8 port 20166 的信息。前台运行便于调试,确认无误后可后台运行。
调试成功后,可以将这个命令放置在 Windows 主机后台运行,实现后台运行隧道:
1 | Start-Process -FilePath "ssh" -ArgumentList "-N -R 0.0.0.0:232:192.158.115.8:20166 cloud_server_name@120.18.41.24" -WindowStyle Hidden |
2.4 云服务器验证
在云服务器上验证隧道是否生效,可以查看监听端口(执行在云服务器 shell):
1 | ss -ltnp | grep :232 |
进一步地,可以在本机测试转发到内网目标:
1 | ssh -p 232 server_name@120.18.41.24 |
2.5 外网连接
通过外网的设备进行连接,直接连接阿里云服务器,其中 server_name 是内网服务器上的用户名:
1 | ssh -p 232 server_name@120.18.41.24 |
2.6 取消隧道连接
可以在 PowerShell 终端,通过以下命令列出包含隧道命令的 ssh 进程(找出 PID):
1 | # 查找命令行里包含 reverse_ssh_key 或包含 0.0.0.0:232 的 ssh 进程 |
然后直接将对应的进程杀掉即可:
1 | Stop-Process -Id <PID> |
SSL反向隧道实现外网桥接以及内网跳板机