假如有三台电脑,具体情况如下:
电脑 A 是一台内网 PC,支持公网访问,且只有它可以访问内网域名 https://a.com;
电脑 B 是一台公网 ubuntu 服务器,ip 地址为 100.100.100.100;
电脑 C 是一台普通 PC,可以访问外网。
现在想在电脑 C 上访问 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
解释:
• -CNfgR 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
解释:
• -CNfgL 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。
- C 到 B:通过正向隧道将 B 的 12345 暴露到 C 的本地端口 443。
- C 本地访问:在 C 上通过 https://localhost[:443] 或 https://a.com 访问服务。