内网穿透(SSH 反向隧道)+ AWS EC2 中转实验

0 阅读6分钟

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

image.png 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文件把GatewayPortsAllowTcpForwarding修改为yes

image.png

修改完后重启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 不能重叠。

image.png

image.png

image.png

6.2 创建子网

在VPC里勾选刚才创建的VPC image.png

子网设置 image.png

如果遇到创建子网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

image.png

子网设置

image.png

6.3 创建互联网网关

image.png

把网关附加到 VPC,以使 VPC 可以与互联网通信 image.png

6.4 创建路由表

image.png

编辑路由

image.png

编辑子网关联

image.png

image.png

6.5 创建EC2

在AWS创建EC2,系统选择Ubuntu或者Amazon Linux,选择免费的套餐即可

image.png

设置密钥对,并给密钥对设置合适的名称

密钥对名称不能重复

image.png

image.png

编辑网络设置,绑定创建的VPC和子网,并启用自动分配公有IP,安全组开发9000端口用来对外提供服务

image.png

其他的配置不用管,按照默认即可,然后启动C2实例

image.png

等待EC2实例初始化完成

image.png

可以看到为该实例配置了公有 IPv4 地址 image.png

使用SSH连接EC2

image.png

目前还没有开发22端口,需要在安全组开发对应端口

image.png

ssh连接EC2

ssh -i "*.pem" ubuntu@公网IP

同理修改EC2的/etc/ssh/sshd_config文件把GatewayPortsAllowTcpForwarding修改为yes

不是ssh_config(客户端配置文件),而是sshd_config(服服务端配置文件)

image.png

重启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服务存在就能实现在外面控制家里的电脑

image.png