场景描述
假如有三台电脑,具体情况如下:
电脑 | 描述 | 特点 |
---|---|---|
电脑 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.comuser@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:12345user@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 文件 |