SSH 双重隧道代理,访问内网域名

场景描述

假如有三台电脑,具体情况如下:

电脑 描述 特点
电脑 A 内网 PC 支持公网访问,且只有它可以访问内网域名 https://a.com
电脑 B 公网 ubuntu 服务器 IP 地址为 100.100.100.100
电脑 C 普通 PC 可以访问外网

目标:在电脑 C 上访问 https://a.com

核心思路

graph LR
    C[电脑 C] -->|正向隧道| B[电脑 B]
    B -->|反向隧道| A[电脑 A]
    A -->|访问| Web[https://a.com]

1. 从 A 到 B:反向隧道

https://a.com 的流量通过 B 转发到 A。

2. 从 C 到 B:正向隧道

将流量从 C 转发到 B,再经由 B 转发到 A ,最终访问https://a.com

详细步骤

步骤 1:在 A 上创建反向隧道

在 A 上运行以下命令,将 B 的一个端口 12345 的流量通过 SSH 转发到 A :

ssh -CNfgR 12345:a.com:443 user@100.100.100.100

参数解释

  • -C - 启用压缩
  • -N - 不执行远程命令
  • -f - 后台运行
  • -g - 允许远程主机连接本地转发的端口
  • -R - 反向隧道

转发说明

  • 12345:a.com:443 - B 的端口 12345 流量会转发到 A 的内网域名 https://a.com
  • user@100.100.100.100 - B 的公网 SSH 用户和 IP

此步骤完成后,电脑 B 可以通过 localhost:12345 访问 https://a.com

步骤 2:在 C 上创建正向隧道

在 C 上运行以下命令,将本地流量通过 SSH 转发到 B :

ssh -CNfgL 443:localhost:12345 user@100.100.100.100

参数解释

  • -L - 本地转发(正向隧道)

转发说明

  • 443:localhost:12345 - 在 C 的本地端口 443,将流量转发到 B 的 localhost:12345
  • user@100.100.100.100 - B 的公网 SSH 用户和 IP

此步骤完成后,电脑 C 的 localhost:443 会通过 B 的 localhost:12345 转发到 A 内网的 https://a.com

步骤 3:在 C 上访问内网域名

1.打开浏览器,在地址栏输入:

https://localhost:443

即可访问https://a.com的服务。

2.如果域名验证失败(如 HTTPS 证书错误),可以在浏览器中忽略证书警告,或者修改/etc/hosts文件,将a.com解析为127.0.0.1

echo "127.0.0.1 a.com" | sudo tee -a /etc/hosts

然后直接访问:

https://a.com

注意事项

1. 防火墙配置

确保 B 和 A 的防火墙允许 SSH 连接

2. 隧道稳定性

使用 autossh 工具保持隧道稳定,防止 SSH 会话断开:

autossh -M 0 -CNfgR 12345:a.com:443 user@100.100.100.100

3. HTTPS 证书验证

如果 https://a.com 的证书需要内网 IP 验证,可以:

  • 在浏览器中忽略证书警告(测试环境)
  • 配置 DNS 代理解析

流程总结

阶段 描述 命令/操作
A 到 B 反向隧道,将 A 内网的 https://a.com 暴露到 B 的端口 12345 ssh -CNfgR 12345:a.com:443 user@100.100.100.100
C 到 B 正向隧道,将 B 的 12345 暴露到 C 的本地端口 443 ssh -CNfgL 443:localhost:12345 user@100.100.100.100
C 本地访问 在 C 上通过 https://localhost[:443]https://a.com 访问服务 浏览器访问或修改 hosts 文件

如需转载,请注明出处: https://chadou.me/p/262

最新发布