1. 实验目的
本实验旨在验证 SSH 反向端口转发(-R)机制的实现原理与实际应用效果,理解其如何将内网服务通过公网服务器进行中转,从而实现内网主机的远程访问能力。
同时通过实际搭建 AWS EC2 中转节点与 Windows 内网服务环境,掌握基础的云上网络穿透与端口映射方法。
应用场景
SSH 反向隧道技术在实际工程中具有广泛应用,主要包括:
-
内网穿透访问
在没有公网 IP 的情况下,远程访问公司或家庭内网设备(如 Windows 服务器、开发机) -
远程开发与运维
开发人员在外网环境访问本地开发服务(如 Web 服务、API 服务) -
临时服务暴露
快速将本地服务临时发布到公网进行测试或演示 -
远程调试与排障
运维人员通过云服务器中转访问内网服务进行问题排查 -
轻量级 C2 / 远程控制模型(安全研究场景)
在授权环境下用于理解反向连接通信模型与控制通道原理
安全风险与潜在滥用场景
SSH 反向隧道在提升网络可达性的同时,如果缺乏访问控制与审计机制,也可能被用于以下安全风险场景:
-
未授权的内网服务暴露
-
内网主机在不受监控的情况下主动连接外部服务器,并将内部服务映射到公网端口
-
导致原本仅限内网访问的服务被外部访问
-
绕过网络边界防护
-
通过出站 SSH 连接建立隐蔽通道,使传统防火墙入站限制失效
-
可能绕过企业 NAT、防火墙或访问控制策略
-
隐蔽远程通信通道
-
利用 SSH 加密通道承载数据转发,使网络流量难以被传统检测设备识别内容
-
横向访问入口扩展风险
-
一旦中转服务器被控制,可能成为访问多个内网节点的跳板
防护建议(重要)
- 禁止不必要的
GatewayPorts yes - 限制
AllowTcpForwarding使用范围 - 对 SSH 连接进行 IP 白名单限制
- 使用审计日志监控
-R/-L转发行为 - 结合 IDS/IPS 或流量分析系统检测异常隧道行为
2. 实验环境
设备说明
-
EC2(Ubuntu,中转服务器 / 公网入口)
- IP:EC2 公网 IP
- 作用:接收 SSH 隧道并提供访问入口
-
Kali(SSH 服务器 / 中转机)
- IP:192.168.3.7
- 作用:对外提供访问入口
-
Windows(内网主机 / 被访问端)
- IP:192.168.3.73
- 运行 HTTP 服务(端口 3000)
3. 服务准备
在 Windows 上启动 Web 服务:
python -m http.server 3000
访问确认:
http://127.0.0.1:3000
4. 建立 SSH 反向隧道
在 Windows 上执行:
ssh -R 9000:localhost:3000 kali@192.168.3.7
Kali 监听 9000,收到连接后,通过 SSH 隧道转发到Windows的3000端口,从而可以访问 Windows 的服务。
访问 kali公网IP:9000 = 实际访问 Windows 的 3000 服务
5. 服务验证
5.1 查看端口监听
用netstat或者ss检查远程服务器是否监听9000端口
netstat -ant | grep 9000
或:
ss -lntp | grep 9000
输出:
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN
tcp6 0 0 :::9000 :::* LISTEN
5.2 访问测试
在远程服务器上输入curl localhost:9000 是否能返回 Windows Web 页面内容
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
说明SSH 隧道已成功建立,Kali 本机可以访问 Windows 服务。但没开放外部访问,只能让这台远程服务器使用。如果想让公网其他电脑也能通过远程服务器访问内网电脑,需要在远程服务器使用sudo vim /etc/ssh/sshd_config修改ssh_config文件把GatewayPorts和AllowTcpForwarding修改为yes
修改完后重启ssh服务sudo systemctl restart shh
在Windows电脑上(内网主机)重新和远程服务器进行连接,在Window上运行
ssh -R 9000:localhost:3000 kali@192.168.3.7
然后在与远程服务器处于同一网络的 Mac电脑上访问192.168.3.7:3000,就能在mac电脑上访问windows内网服务
目前都是在局域网测试的,为了更贴合实际环境,接下来把kali换成EC2(拥有公网ID)实现远程控制Windows电脑
6. 创建 AWS EC2 环境
6.1 创建VPC
- VPC CIDR:10.0.0.0/16
- 子网示例:
- 10.0.0.0/24
- 10.0.1.0/24
注意:同一 VPC 内子网 CIDR 不能重叠。
6.2 创建子网
在VPC里勾选刚才创建的VPC
子网设置
如果遇到创建子网CIDR 地址与现有子网 CIDR 重叠,即 10.0.0.0/24报错,创建的新子网 CIDR(例如 10.0.0.0/24)和 VPC 里已经存在的子网 CIDR 冲突了,AWS VPC 里规则是同一个 VPC 内,所有子网 CIDR 必须完全不重叠,换个子网就行例如10.0.1.0/24或者10.0.2.0/24
子网设置
6.3 创建互联网网关
把网关附加到 VPC,以使 VPC 可以与互联网通信
6.4 创建路由表
编辑路由
编辑子网关联
6.5 创建EC2
在AWS创建EC2,系统选择Ubuntu或者Amazon Linux,选择免费的套餐即可
设置密钥对,并给密钥对设置合适的名称
密钥对名称不能重复
编辑网络设置,绑定创建的VPC和子网,并启用自动分配公有IP,安全组开发9000端口用来对外提供服务
其他的配置不用管,按照默认即可,然后启动C2实例
等待EC2实例初始化完成
可以看到为该实例配置了公有 IPv4 地址
使用SSH连接EC2
目前还没有开发22端口,需要在安全组开发对应端口
用ssh连接EC2
ssh -i "*.pem" ubuntu@公网IP
同理修改EC2的/etc/ssh/sshd_config文件把GatewayPorts和AllowTcpForwarding修改为yes
不是ssh_config(客户端配置文件),而是sshd_config(服服务端配置文件)
重启ssh服务sudo systemctl restart ssh
7. 建立 SSH 反向隧道
完成后关闭连接,重新建立反向SSH隧道并把9000端口的流量转发到Windows的3000端口上
ssh -i "*.pem"-R 9000:localhost:3000 ubuntu@EC2公网IP
查看是否监听9000端口
ubuntu@ip-10-0-1-216:~$ netstat -ant | grep 9000
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN
tcp6 0 0 :::9000 :::* LISTEN
浏览器访问公网IP:9000,只要SSH 反向隧道进程持续运行 + EC2端口开放 + Windows服务存在就能实现在外面控制家里的电脑