Как настроить Double VPN с Wireguard?

Я пытаюсь маршрутизировать домашний VPN через NordVPN, но не могу заставить его работать.

По сути, я хочу, чтобы мои интернет-запросы шли: Телефон -> Дом -> NordVPN. Причина в том, что я хочу иметь разделенную VPN, которая может получать доступ к моим домашним устройствам, а также выходить в Интернет без указания моего IP-адреса.

Аппаратное обеспечение

Малина Pi 4

Debian 10

      $ uname -srvmpio
Linux 5.10.0-0.bpo.4-arm64 #1 SMP Debian 5.10.19-1~bpo10+1 (2021-03-13) aarch64 unknown unknown GNU/Linux

Программное обеспечение

Безрунтный докер

linuxserver / Wireguard

bubuntux / nordvpn

docker-compose.yml

      version: "3.8"
services:
  vpn:
    image: bubuntux/nordvpn
    cap_add:
      - NET_ADMIN               # Required
      - SYS_MODULE              # Required for NordLynx
    sysctls:
      - net.ipv4.conf.all.rp_filter=2 # Required for Nordlynx
    devices:
      - /dev/net/tun            # Required
    environment:
      - USER=${NORDVPN_USERNAME}
      - PASS=${NORDVPN_PASSWORD}
      - CONNECT=${NORDVPN_CONNECT}
      - TECHNOLOGY=NordLynx
      - TZ=${TZ}
      - PORTS=64444;51820
      - CYBER_SEC=Enable
    ports:
      - 64444:51820
  
  wireguard:
    image: ghcr.io/linuxserver/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      TZ: ${TZ}
      SERVERURL: ${URL}
      PEERS: peer1,peer2
      # INTERNAL_SUBNET: 10.13.13.0 #optional
    depends_on:
      - vpn
    volumes:
      - ${DOCKERCONFIG}/wireguard:/config
      - /lib/modules:/lib/modules:ro
    network_mode: service:vpn

Он работает без vpn, благодаря переадресации портов.

Кто-нибудь знает, как это сделать?

Большое спасибо :)

1 ответ

https://unix.stackexchange.com/a/365296 - был для меня ответом. Добавив разрешения на маршрутизацию для Wireguard для прохождения через мостовую сеть контейнера NordVPN при ответе на соединение, в отличие от попытки маршрутизации через сервер NordVPN, я смог подключить клиента, который затем перенаправлял трафик через Wireguard, а затем на NordVPN.

Во-первых, я дал определенную частную IP-подсеть 172.18.0.0/24:

      networks:
  private:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/24

Затем прикрепил его к контейнеру NordVPN:

      networks:
    private:
      ipv4_address: 172.18.0.2

Это позволило мне определить маршрут в контейнере Wireguard:

      ip rule add from 172.18.0.2 table 128 # interface IP for container eth0 on the NordVPN network stack we specified in networks -> private -> ipv4_address
ip route add table 128 to 172.18.0.0/24 dev eth0 # the subnet range for NordVPN container eth0 interface
ip route add table 128 default via 172.18.0.1 # the default gateway

Мое довольно неэлегантное и ограниченное по времени решение заключалось в том, чтобы вызывать эти команды через сценарий запуска bash, как показано ниже, однако есть гораздо лучшие и более последовательные способы сделать это, на изучение которых у меня не было времени.

./start-wireguard-nordvpn.sh

      # bring down if up then start
docker-compose down
docker-compose up -d

# run ip route commands, wireguard = container_name in compose
docker exec -it wireguard ip rule add from 172.16.0.2 table 128
docker exec -it wireguard ip route add table 128 to 172.16.0.0/24 dev eth0
docker exec -it wireguard ip route add table 128 default via 172.16.0.1

Отправка файла Compose для потомков:

      ---
version: "3.3"
services:
  vpn:
    image: ghcr.io/bubuntux/nordvpn
    container_name: nordvpn
    cap_add:
      - NET_ADMIN               # Required
      - SYS_MODULE
    ports:
      - $EXTERNAL_WG_PORT:51820/udp
    environment:                # Review https://github.com/bubuntux/nordvpn#environment-variables
      - USER=$NORDUSR          # Required
      - PASS=$NORDPW            # Required
      - CONNECT=$COUNTRY
      - TECHNOLOGY=NordLynx
      - NETWORK=172.18.0.0/24  # So it can be accessed within the local network
      - PORTS=$EXTERNAL_WG_PORT;51820
      - FIREWALL=Enable
      - KILLSWITCH=Enable
      - CYBER_SEC=Enable
      - DNS=$NV_DNS
    sysctls:
      - net.ipv4.conf.eth0.rp_filter=2
    devices:
      - /dev/net/tun
    restart: unless-stopped
    networks:
        private:
          ipv4_address: 172.18.0.2

  wireguard:
    image: ghcr.io/linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=$PUID
      - PGID=$PGID
      - TZ=$TZ
      - SERVERURL=$FQDN #optional
      - SERVERPORT=$EXTERNAL_WG_PORT #optional
      - PEERS=3 #optional
      - PEERDNS=$WG_DNS #optional
      - INTERNAL_SUBNET=172.21.88.0/24 #optional
      - ALLOWEDIPS=$ALLOWEDIPS
    volumes:
      - ./config:/config
      - ./modules:/lib/modules
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    network_mode: service:nordvpn
    restart: unless-stopped
    depends_on:
      - nordvpn

networks:
  private:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.0.0/24
Другие вопросы по тегам