我正在设置一个家庭服务器(使用 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