SSL反向隧道实现外网桥接以及内网跳板机

SSL反向隧道实现外网桥接以及内网跳板机

一、SSH 反向隧道实现 HTTP 代理

问题描述

在网络受限的内网环境中,一般设置的是不能够让服务器连接外网,会将ICMP(ping)给禁用,但是允许内网内的设备通过 SSH 连接,例如工位主机。此时,我们可以借助 SSH 建立反向隧道,让服务器的流量通过工位机走外网。

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
2
export http_proxy=http://127.0.0.1:1080
export https_proxy=$http_proxy

这样,服务器上的所有 HTTP 和 HTTPS 请求都会通过 SSH 隧道转发到工位机的代理服务器,从而实现访问外网的目的。可以进一步测试代理是否生效,例如使用 curl 命令访问一个外网网站:

1
curl -I https://www.google.com

如果成功返回 200 状态码,说明代理配置成功,服务器已经能够通过工位机访问外网了。

如果想永久配置代理,可以将上述的环境变量添加到服务器的 /etc/environment 或者 ~/.bashrc 文件中,然后重启 shell 或 source /etc/environment

1
2
echo 'http_proxy=http://127.0.0.1:1080' >> /etc/environment
echo 'https_proxy=http://127.0.0.1:1080' >> /etc/environment

1.4 释放端口

代理命令会开放一个服务器的端口 1080,在不想用的时候直接回收释放掉这个端口,并取消服务器的网络代理即可。

1
2
3
4
5
6
7
# 查找占用端口的进程
netstat -tlnp | grep :1080
# 假设进程ID是12345,使用kill命令终止进程
kill 12345
# 取消代理环境变量
unset http_proxy
unset https_proxy

二、阿里云服务器实现内网跳板机

问题描述

对于一些内网环境,服务器会被防火墙保护,无法直接通过公网 IP 进行 SSH 连接。此时,可以使用一台位于公网的跳板机(Bastion Host)作为中转,先连接跳板机,再通过跳板机连接内网服务器。但当问题变得更加复杂时,例如服务器实际上无法连接外网,意味着跳板机也无法直接连接内网服务器,这时就需要借助另外一台可以连接外网的内网设备,例如台式主机。


如果配置不能够连外网的内网服务器时,需要首先进行跳板机配置,然后进行上面的反向隧道配置 HTTP 代理。

2.1 云服务器申请

因为内网中的设备都无法被访问,并且自己的笔记本也无法被外网访问,这时就需要有个桥接的服务器,能够提供公网IP,使得两边的设备都能够连接上它。这里选择阿里云服务器,申请一个轻量级的 ECS 实例即可。

轻量级 ECS 实例

2.2 云服务器配置

允许 SSH 远程端口转发并能绑定公网接口,在 /etc/ssh/sshd_config 文件中添加或修改以下配置项:

1
2
3
sudo sed -i -e "s/^#\?GatewayPorts .*/GatewayPorts yes/" -e "s/^#\?AllowTcpForwarding .*/AllowTcpForwarding yes/" /etc/ssh/sshd_config
sudo bash -c 'echo -e "\nGatewayPorts yes\nAllowTcpForwarding yes" >> /etc/ssh/sshd_config'
sudo systemctl restart ssh

选定空闲端口作为转发端口,例如 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 232connected 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
2
ss -ltnp | grep :232
# LISTEN 0 128 *:232 *:* users:(("sshd",pid=1234,fd=3))

进一步地,可以在本机测试转发到内网目标:

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
2
3
4
# 查找命令行里包含 reverse_ssh_key 或包含 0.0.0.0:232 的 ssh 进程
Get-CimInstance Win32_Process |
Where-Object { ($_.CommandLine -match 'reverse_ssh_key') -or ($_.CommandLine -match '0.0.0.0:232') } |
Select-Object ProcessId, CommandLine

然后直接将对应的进程杀掉即可:

1
Stop-Process -Id <PID>

SSL反向隧道实现外网桥接以及内网跳板机

https://lzhms.github.io/blog/SSLConnection/

Author

Zhihao Li

Posted on

2025-10-22

Updated on

2025-10-22

Licensed under


Comments