DockerでNordVPNを使った二重VPN(マルチホッピング)をしたい

こんにちは、Phone>VPS>NordVPN のようにNordVPNを使った二重VPNをやりたいです。

すでに接続は完了しています。

自宅のVPS>PhoneVPS>NASの構成です。

現在はVPS経由でNASに接続できますが、VPSのグローバルIPの代わりにNordVPN経由でインターネットに接続したいです。

今のVPNネットワークはDocker-composeで作成しました。

version: "3.8"
services:
  adguardhome:
    image: adguard/adguardhome
    container_name: adguardhome
    restart: unless-stopped
    ports:
# adguardhomeが必要とするポートを開ける
    networks:
      proxy:
      wg-net:
        ipv4_address: 10.2.0.100

    environment:
      - PUID=xxxx
      - PGID=xxxx
    labels:
      # adguardダッシュボード
      - "traefik.enable=true"
      - "traefik.http.routers.adguard.rule=Host(`xxx.xxxx.xxx`)"
      - "traefik.http.routers.adguard.entrypoints=websecure"
      - "traefik.http.routers.adguard.tls=true"
      - "traefik.http.routers.adguard.tls.certresolver=myresolver"
      - "traefik.http.services.adguard.loadbalancer.server.port=80"
      # Watchtowerのアップデート
      - "com.centurylinklabs.watchtower.enable=true"
    volumes:
      - ./workdir:/opt/adguardhome/work
      - ./confdir:/opt/adguardhome/conf

  wg-easy:
    image: weejewel/wg-easy
    container_name: wg-easy
    restart: unless-stopped
    volumes:
      - .:/etc/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      # ?? 必須:
      # ホストのパブリックアドレスに変更
      - WG_HOST=xxx.xxxx.xxx
      # オプション:
      - PASSWORD=xxxxxxxxxx
      - WG_PORT=${EXTERNAL_WG_PORT}
      - WG_DEFAULT_DNS=	10.2.0.100
    labels:
      # Watchtowerのアップデート
      - "com.centurylinklabs.watchtower.enable=true"
    ports:
      - "${EXTERNAL_WG_PORT}:51820/udp"
      - "51821:51821/tcp"
    dns:
      - 10.2.0.100 # AGHを指す
    networks:
      wg-net:
        ipv4_address: 10.2.0.3
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

networks:
      wg-net:
        ipam:
          config:
            - subnet: 10.2.0.0/24
      proxy:
        external: true

次にNordVPNのコンテナを追加します。

version: "3.8"
services:
  adguardhome:
    image: adguard/adguardhome
    container_name: adguardhome
    restart: unless-stopped
    ports:
# 前述の通り
    networks:
      proxy:
      wg-net:
        ipv4_address: 10.2.0.100

    environment:
      - PUID=xxxx
      - PGID=xxxx
    labels:
      # adguardダッシュボード
      - "traefik.enable=true"
      - "traefik.http.routers.adguard.rule=Host(`xxxx.xxxx.xxx`)"
      - "traefik.http.routers.adguard.entrypoints=websecure"
      - "traefik.http.routers.adguard.tls=true"
      - "traefik.http.routers.adguard.tls.certresolver=myresolver"
      - "traefik.http.services.adguard.loadbalancer.server.port=80"
      # Watchtowerのアップデート
      - "com.centurylinklabs.watchtower.enable=true"
    volumes:
      - ./workdir:/opt/adguardhome/work
      - ./confdir:/opt/adguardhome/conf

  nordvpn:
    image: ghcr.io/bubuntux/nordvpn
    container_name: nordvpn
    cap_add:
      - NET_ADMIN               # 必須
      - SYS_MODULE
    ports:
      - ${EXTERNAL_WG_PORT}:51820/udp
      - 51821:51821/tcp
    environment:                # https://github.com/bubuntux/nordvpnの環境変数を確認
      - USER=${NORDUSR}          # 必須
      - PASS=${NORDPW}            # 必須
      - CONNECT=${COUNTRY}
      - TECHNOLOGY=NordLynx
      - NETWORK=10.2.0.0/24  # ローカルネットワーク内アクセス用
      - PORTS=${EXTERNAL_WG_PORT};${EXTERNAL_SOCKS5_PORT};51820;51821
      - FIREWALL=Disable
      - KILLSWITCH=Disable
      - CYBER_SEC=Disable
      - DNS=${NV_DNS}
    sysctls:
      - net.ipv4.conf.eth0.rp_filter=2
    devices:
      - /dev/net/tun
    restart: unless-stopped
    networks:
        wg-net:
          ipv4_address: 10.2.0.2
          
  wg-easy:
    image: weejewel/wg-easy
    container_name: wg-easy
    restart: unless-stopped
    volumes:
      - .:/etc/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      # ?? 必須:
      # ホストのパブリックアドレスに変更
      - WG_HOST=xxx.xxxx.xxxx
      # オプション:
      - PASSWORD=1DifW6C4yeLxN1gi
      - WG_PORT=${EXTERNAL_WG_PORT}
      - WG_DEFAULT_DNS=	10.2.0.100
      - WG_POST_UP=ip rule add from 10.2.0.2 table 128; ip route add table 128 to 10.2.0.0/24 dev eth0; ip route add table 128 default via 10.2.0.1; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;

      - WG_POST_DOWN=ip rule del from 10.2.0.2 table 128; ip route del table 128 to 10.2.0.0/24 dev eth0; ip route del table 128 default via 10.2.0.1
    labels:
      # Watchtowerのアップデート
      - "com.centurylinklabs.watchtower.enable=true"
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    network_mode: service:nordvpn
    depends_on:
      - nordvpn

networks:
      wg-net:
        ipam:
          config:
            - subnet: 10.2.0.0/24
      proxy:
        external: true

しかしほとんど動作しません。(なぜ2回動作したのか分かりませんが、docker compose down && docker compose up -d にすると接続が切れます。)NASからVPSやPhoneへのpingもできません。おそらくWG_POST_UPWG_POST_DOWNのパラメータを変更する必要があるかもしれませんが、確信はありません。どうすればいいですか?

追記:NordVPN経由でインターネットに接続できることは確認しました。- NETWORK=10.2.0.0/24- NETWORK=自宅のグローバルIPアドレスに変更すると接続できるようになったのです。なぜ動くのか理解できません。携帯ネットワークからも接続できるし、家のグローバルIPが変わったときのために心配です。

“What should I do?”

Start by finding the last interface the packet is captured on. source/destination ips and ports of said packets are also important.

Finding the last interface tells you where it gets drop/rejected rather than NATted onwards, the ips/port tells you if the packets are NATted properly. This all narrows down the point of failure so that rules can be adjusted accordingly.