docker - VPN 服务器无法从外部访问自身
问题描述
我通过谷歌云 ubuntu 机器在 docker 上使用 softether VPN。当我在我的计算机上连接到它的客户端并获取我的外部 IP 时,我得到了 VPN 的 IP,因此得到了谷歌云机器的 IP。
当我尝试连接被谷歌云防火墙阻止的其他机器时,我可以访问。此外,当我试图在内部访问谷歌云机器上的服务时,它可以工作,但是当我尝试通过 VPN(位于固件白名单中)从外部访问谷歌云机器时,我无法访问。
同样的现象也发生在 AWS 上。我也尝试过打开 vpn,但它也不起作用。
这是我用于 softether VPN 的 docker compose 文件:
version: '3'
services:
softether:
image: siomiz/softethervpn
# with host mode - maybe the services on vpn host is not accessible, like http, etc..
privileged: true
cap_add:
- NET_ADMIN
# network_mode: host
# with normal mode - you cant add any local bridge, but every service on vpn host is accessible
ports:
- '500:500/udp'
- '4500:4500/udp'
- '1701:1701/tcp'
- '5555:5555/tcp'
environment:
- PSK=${PSK}
- USERS=${USERS}
restart: unless-stopped
谷歌防火墙规则:
同样,我可以通过浏览器使用内部 IP 访问机器的服务,但不能使用外部 IP。我确定:
- FW 规则在同一个网络中
- 这是入口规则
- 外部IP正确
- 我可以访问其他机器上的其他服务(通过不同的规则)
- 从我的计算机使用 VPN 时,我的外部 IP 地址正在更改
有任何想法吗?
解决方案
经过一番思考(并与他人讨论),我现在相信这完全是另一回事。
据我所知,您正在尝试的在技术上是不可能的,因此我将完全更改此答案,将旧答案留在底部。
您有一个主机 VM(在 Compute Engine 中)运行您的容器,充当 VPN,但它位于 NAT 后面。您可以使来自 Internet 的机器(至少在您的 VPC 之外)成功连接到您的 VPN。它是按设计进行 NAT 的:
如果网络接口分配有外部 IP 地址,Google Cloud 会自动对来源与接口的主要内部 IP 地址匹配的数据包执行一对一 NAT,因为网络接口满足 Google Cloud 互联网访问要求。接口上是否存在外部 IP 地址始终优先并始终执行一对一 NAT,而不使用 Cloud NAT。
这意味着没有实际的外部 IP 连接到您的 VM 的以太网接口(您可以使用ifconfig
或ip address
命令检查它)。
所以 - 当您尝试连接(如果您的 VPN 服务器所在的 VPC 从内部)到自身(但使用它的外部 nat'ed 地址)时,由于路由问题,您将无法连接。
如果您使用 VPC **,来自外部的所有连接都通过的 GCP 的 NAT 将不会“知道”从内部发送的数据包 ** - 我与在几个路由器上进行此实验的人交谈,结果是相同的 -没有联系(使用简单的词)。
如果您想从 VPC 内部连接到您的 VPN 容器 - 使用它的内部地址。我不知道有什么办法。
如果您想在 GCP 中保护您的 VPN 服务器,请考虑为此使用IAP 。. . .
-.-.-.-.-.-.-.- __ 旧 ______ 答案 __ -.-.-.-.-.-.-.-
您的compose
文件看起来不错,我只建议您尝试将撇号字符更改为引号字符:
ports:
- "500:500/udp"
- "4500:4500/udp"
- "1701:1701/tcp"
- "5555:5555/tcp"
如果这不起作用,请检查与 Jenkins VM 的连接;
- 您可以通过其他机器的公共 IP SSH 进入它吗?
- 检查虚拟机的内部防火墙设置;
- 你的容器能运行吗?(
sudo docker ps
) - 检查内部操作系统防火墙端口是否打开;
您还可以使用实用程序检查打开的端口- 请参阅我关于如何使用 nmapnmap
的其他答案。
如果这没有帮助,请通过此查看如何在容器中运行 SoftEther VPN。
推荐阅读
- javascript - Javascript variable env convert to int variable
- r - get value using rowname and column name in R?
- php - 从 mysql 列参数创建会话变量
- python - 如何使用 tkinter、eyed3 和 python 编辑音频元数据以进行更改?
- pine-script - Pine Script Multi Time Frame - 我的策略是重新粉刷,但我不知道为什么
- firebase - Firestore 安全规则 - 未找到函数存在
- wagtail-admin - 如何禁用 wagtail 主页和侧面菜单上的用户名和电子邮件显示?
- swift - 如何在 SwiftUI 中制作 struct LazyList?
- android - TextView 背景不会正确换行
- javascript - 验证 ReactJS 密码确认