无法从 nordvpn meshnet 访问 Dockerized http 服务

无法从 nordvpn meshnet 访问 Dockerized http 服务

我正在设置一个家庭服务器(使用 ubuntu server 22.04),并在各个端口部署了几个服务。例如,我的主页服务器部署在端口 3000 上。

在本地网络上时:

  • SSH 访问正常
  • 直接在服务器上部署http服务就可以了
  • 通过docker部署的带有bridge网络的http服务是可以的

当我使用 nordvpn meshnet 时:

  • SSH 访问正常
  • 直接在服务器上部署http服务就可以了
  • 通过桥接网络部署的 docker Http 服务无法访问

这是我的主页服务器的 docker compose

version: "3.9"
services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - "3000:3000"
    volumes:
      - /config:/app/config
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      PUID: $PUID
      PGID: $PGID
    networks:
      - homepage_net

networks:
  homepage_net:
    driver: bridge

这是我的主要以太网接口:

enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.XXX  netmask 255.255.255.0  broadcast 192.XXX
        ether XXX  txqueuelen 1000  (Ethernet)
        RX packets 257310280  bytes 326111324526 (326.1 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 157444527  bytes 168981936261 (168.9 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 20  memory 0xf3a00000-f3a20000 

这是 nordlynx 网络接口(Nordvpn 的 meshnet 功能创建了它):

nordlynx: flags=81<UP,POINTOPOINT,RUNNING>  mtu 1420
        inet XXX  netmask 255.255.255.255  destination XXX
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 236544852  bytes 298874606486 (298.8 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 52996561  bytes 13275751612 (13.2 GB)
        TX errors 0  dropped 34313 overruns 0  carrier 0  collisions 0

以下是我的路线:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    0      0        0 enp0s25
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-9066eab87b15
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-e7a37ce3a7bd
172.20.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-e6e5e235ac3b
172.21.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-64f3f670aea1
172.22.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-f624ee4026b8
172.23.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-90ed8d1cb5ca
192.XXX         0.0.0.0         255.255.255.0   U     0      0        0 enp0s25

编辑:

这是我的 nordvpn 白名单:

Allowlisted subnets:
        172.0.0.0/8
        100.0.0.0/8
        192.168.50.0/24

由于它是在本地网络上运行的,我认为这可能是 docker 或路由问题。在系统管理和网络方面,我几乎是个菜鸟。任何帮助都非常感谢。

答案1

TL;WR - 为应该能够访问容器的对等方启用 Docker 机器上的 Meshnet 中的本地网络访问权限。

nordvpn meshnet peer local allow [command options] <peer_hostname>|<peer_nickname>|<peer_ip>|<peer_pubkey>

例如

nordvpn meshnet peer local allow adam.frydrych-everest.nord

我们目前意识到一个问题,如果Docker容器端口已经暴露给主机,仍然需要在Meshnet内为对等点提供本地网络访问权限,才能访问Docker容器内的服务。

这是由于 Docker 通过在 PREROUTING 链中插入 iptables 规则来暴露端口造成的。

此类规则的示例:

-A DOCKER ! -i br-72e949c2a2f0 -p tcp -m tcp --dport 8004 -j DNAT --to-destination 172.24.0.2:80

这意味着当数据包进入 INPUT/FORWARD 链时,它将被视为具有 172.16.0.0/16 子网内 Docker 定义网络的 IP 地址(在本例中为 172.24.0.2)。因此,Meshnet 将根据预设规则丢弃此类数据包,这些规则设置为丢弃发往私有 IP 范围的流量,例如:

169.254.0.0/16
192.168.0.0/16
172.16.0.0/12
10.0.0.0/8

换句话说,Meshnet 将 Docker IP 范围视为本地网络,这就是为什么您需要使用以下命令设置本地网络访问:

nordvpn meshnet peer local allow [command options] <peer_hostname>|<peer_nickname>|<peer_ip>|<peer_pubkey>

笔记:

这是我的 nordvpn 白名单:

    Allowlisted subnets:
    172.0.0.0/8
    100.0.0.0/8
    192.168.50.0/24

此允许列表仅适用于 NordVPN 连接,不会更改 Meshnet 权限。

如果 Docker 或本地子网记录已添加到允许列表中,请务必使用以下命令将其删除:

nordvpn allowlist remove command [command options] [arguments...]

此外,如果已连接 NordVPN,请确保已通过以下方式打开 LAN 发现:

nordvpn set lan-discovery on

相关内容