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

假如有三台电脑,具体情况如下:
电脑 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 代理解析。

流程总结

  1. A 到 B:通过反向隧道将 A 内网的 https://a.com 暴露到 B 的端口 12345。
  2. C 到 B:通过正向隧道将 B 的 12345 暴露到 C 的本地端口 443。
  3. C 本地访问:在 C 上通过 https://localhost[:443]https://a.com 访问服务。

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

最新发布