【问题标题】:VPN server can't access itself externallyVPN 服务器无法从外部访问自身
【发布时间】:2021-06-22 10:17:00
【问题描述】:

我通过谷歌云 ubuntu 机器在 docker 上使用 softether VPN。当我在我的计算机上连接到它的客户端并获取我的外部 IP 时,我得到了 VPN 的 IP,因此得到了谷歌云机器的 IP。

当我尝试连接被谷歌云防火墙阻止的其他机器时,我可以访问。此外,当我尝试在内部访问 Google Cloud 机器上的服务时,它可以工作,但是当我尝试通过 VPN(位于 FW 白名单中)从外部访问 Google Cloud 机器时,我无法访问。

同样的现象也发生在 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。我确定:

  1. FW 规则在同一个网络中
  2. 这是入口规则
  3. 外部 IP 正确
  4. 我可以访问其他机器上的其他服务(通过不同的规则)
  5. 在我的计算机上使用 VPN 时,我的外部 IP 地址发生变化

有什么想法吗?

【问题讨论】:

    标签: docker networking google-cloud-platform vpn firewall


    【解决方案1】:

    经过一番思考(以及与他人的讨论),我现在认为这完全是另外一回事。

    据我所知,您正在尝试的在技术上是不可能的,因此我将完全更改此答案,将旧答案留在底部。

    您有一个主机虚拟机(在 Compute Engine 中)运行充当 VPN 的容器,但它是 behind NAT。您可以使来自 Internet 的机器(至少在您的 VPC 之外)成功连接到您的 VPN。 It's NAT'ed by design:

    如果网络接口分配有外部 IP 地址,Google Cloud 会自动对来源与接口的主要内部 IP 地址匹配的数据包执行一对一 NAT,因为网络接口满足 Google Cloud 互联网访问要求。接口上是否存在外部 IP 地址始终优先并始终执行一对一 NAT,而不使用 Cloud NAT。

    这意味着没有实际的外部 IP 连接到您的 VM 的以太网接口(您可以使用 ifconfigip address 命令检查它)。

    所以 - 当您尝试(如果您的 VPN 服务器所在的 VPC 从内部)连接到自身(但使用它的外部 nat'ed 地址)时,由于路由问题,您将无法连接。

    如果您使用 VPC **,来自外部的所有连接都通过的 GCP 的 NAT 将不会“知道”从内部发送的数据包** - 我与在几个路由器上进行此实验的人交谈,结果是相同 - 没有联系(使用简单的词)。

    如果您想从 VPC 内部连接到您的 VPN 容器 - 使用它的内部地址。我不知道有什么办法。

    如果您想在 GCP 中保护您的 VPN 服务器,请考虑为此使用 IAP。 . . .

    -.-.-.-.-.-.-.- __ O L D ______ A N S W E R __ -.-.-.-.-.-.-.-

    您的 compose 文件看起来不错,我只建议您尝试将撇号字符更改为引号:

        ports:
          - "500:500/udp"
          - "4500:4500/udp"
          - "1701:1701/tcp"
          - "5555:5555/tcp"
    

    如果这不起作用,请检查与 Jenkins VM 的连接;

    • 你可以通过其他机器的公共 IP SSH 进入它吗?
    • 检查虚拟机的内部防火墙设置;
    • 你的容器能运行吗? (sudo docker ps)
    • 检查internal OS firewall ports are open;

    您还可以使用 nmap 实用程序检查打开的端口 - 请参阅我在 how to use nmap 上的其他答案。

    如果这没有帮助,请查看如何运行SoftEther VPN in a container

    【讨论】:

    • @Idan 有进展吗?这是answer your question吗?
    • 看看我更新的答案,如果这回答了你的问题,请告诉我。
    • 我不确定情况是否如此。当我尝试通过 VPN 从外部连接到 VPC 内的其他 VM 时,我能够连接它。只有当我尝试从外部连接到同一台服务器时才会发生这种情况。
    • 请澄清您的最后一条评论——“外部”部分——您从哪里连接到您的 VPN 服务器?请尽可能具体。
    • 好的,假设我的 VPC 有 2 台服务器,A 和 B。我作为客户端连接到在 A 服务器上运行的 VPN 服务。当我通过外部 IP 地址从我的计算机(通过 A 服务器的 VPN 服务)连接到 B 服务器时,该地址由防火墙配置为仅允许从外部 VPN 服务器地址(A 服务器外部 IP)连接到 http 服务我能够达到它。但是,当我通过外部 IP 地址从我的计算机(再次通过 A 服务器的 VPN)连接到 A 服务器时,我无法从外部访问它,只能在内部访问它。希望这足以澄清我的情况。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-09-16
    • 2019-07-19
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多