Как настроить Wireguard в Docker с доступом к локальной сети

Вопрос или проблема

Я пытаюсь настроить VPN-сервер с использованием wireguard.

У меня есть следующая конфигурация в docker compose:

version: "3.1"

services:
  wireguard:
    image: linuxserver/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Berlin
      - SERVERURL=someoffice.com
      - SERVERPORT=51820
      - PEERS=6
      - PEERDNS=10.0.10.1
      - INTERNAL_SUBNET=10.13.13.0
    volumes:
      - /home/fredrik/Servers/wireguard:/config
      - /lib/modules:/lib/modules
    #ports:
    #  - 51800:51820/udp # наш маршрутизатор выполняет эту часть, так как мы используем macvlan
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    restart: unless-stopped
    networks:
      wireguard_vlan:
        ipv4_address: 10.0.10.16

networks:
  wireguard_vlan:
    external: true

Сеть wireguard_vlan была создана следующим образом:

docker network create -d macvlan --subnet 10.0.10.0/24 --gateway 10.0.10.1 --ip-range 10.0.10.15/32 -o parent=eth0 wireguard_vlan

Я в основном пытался дать wireguard доступ к сети, вдохновившись этим видео: Docker Networking Tutorial // Все типы сетей объяснены!

Вот конфигурация пира:

$ cat ~/Desktop/peer1.conf
[Interface]
Address = 10.13.13.2
PrivateKey = <ключ>
ListenPort = 51820
DNS = 10.0.10.1

[Peer]
PublicKey = <ключ>
PresharedKey = <ключ>
Endpoint = someoffice.com:51800
AllowedIPs = 0.0.0.0/0, ::/0

Похоже, что это работает, так как я могу пинговать сервер wireguard по 10.0.10.16 из нашей локальной сети. Я также могу пинговать другие машины в локальной сети из контейнера wireguard. Однако я не могу пинговать 10.0.10.16 с хоста docker (хотя это и не важно).

Когда я подключаюсь с клиентом wireguard ui на Windows, я могу пинговать серверы в интернете, но если я пытаюсь пинговать что-либо в сети 10.0.10.0/24, я получаю следующее:

$ ping 10.0.10.1

Pinging 10.0.10.1 with 32 bytes of data:
Общая ошибка.
Общая ошибка.
Общая ошибка.

Статистика ping для 10.0.10.1:
    Пакеты: Отправлено = 3, Получено = 0, Потеряно = 3 (100% потерь),

Вот wg0.conf

[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <ключ>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE

[Peer]
# peer1
PublicKey = <ключ>
PresharedKey = <ключ>
AllowedIPs = 10.13.13.2/32

В контейнере я вижу следующие интерфейсы:

root@16328831e502:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.13.13.1/32 scope global wg0
       valid_lft forever preferred_lft forever
98: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:22:01:01:0a:10 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.10.16/24 brd 10.0.10.255 scope global eth0
       valid_lft forever preferred_lft forever

Элемент eth+ в PostUp вызывает у меня подозрения, так как интерфейс называется eth0@if2, но я пробовал написать eth0@if2 в wg0.conf, и это, похоже, не имело значения.

Я думаю, что именно PostUp и/или PostDown должны делать что-то, что позволит клиентам VPN получить доступ, но я не совсем понимаю эту строку.

Так что, в целом, я не могу найти способ предоставить внешний доступ к 10.0.10.0/24.
Любая помощь и/или советы будут очень признательны 🙂

Похоже, я наконец-то наткнулся на ошибку, которую я допустил.

Эти конфигурации, похоже, работают:

peer1.conf

[Interface]
PrivateKey = <ключ>
ListenPort = 51820
Address = 10.0.10.17/32
DNS = 10.0.10.1

[Peer]
PublicKey = <ключ>
PresharedKey = <ключ>
AllowedIPs = 10.0.10.0/24, 10.13.13.0/24
Endpoint = someoffice.com:51800

wg0.conf

[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <ключ>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE

[Peer]
# peer1
PublicKey = <ключ>
PresharedKey = <ключ>
AllowedIPs = 10.0.10.17/32

Конфигурации, которые я использовал изначально, были все установлены в диапазоне 10.13.13.0/24. Wireguard не меняет IP полученных пакетов после их получения на серверной стороне. Наш маршрутизатор и/или wireguard не хотели или не позволяли трафику из диапазона 10.13.13.0/24 передаваться на адаптер eth0@if2.

Таким образом, как на стороне сервера, так и на стороне пира, IP пира будет установлен на IP в диапазоне 10.0.10.0/24. Трафик в сети 10.13.13.0/24 также будет маршрутизироваться через wireguard, вероятно, не приведет к чему-либо полезному.

Я наткнулся на этот старый вопрос, так как он был актуален для меня сейчас.
Правило iptables должно было решить проблему в wg0.conf:

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Мое решение может быть полезным и кому-то другому.

Мои полные конфигурации (используя ipvlan вместо macvlan)

docker-compose.yml

version: "2.1"

networks:
    docker_ext:
        external: true

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Vienna
      - SERVERURL=dyn.leidinger.xyz
      - SERVERPORT=51820 #опционально
      - PEERS=<peer_1>,<peer_2>,<peer_x>
      - PEERDNS=8.8.8.8 #опционально
      - ALLOWEDIPS=192.168.0.0/24,192.168.1.0/24 #опционально
    volumes:
      - /opt/wireguard/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    networks:
      docker_ext:
        ipv4_address: 192.168.1.100
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.proxy_arp=1
    restart: unless-stopped

wg0.conf

[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <ключ>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# peer_wienIPhoneLukas
PublicKey = <ключ>
PresharedKey = <ключ>
AllowedIPs = 10.13.13.5/32

Ответ или решение

Установка WireGuard в Docker с доступом к локальной сети

В данной инструкции мы рассмотрим, как настроить WireGuard в Docker-контейнере с возможностью доступа к локальной сети. Мы разберёмся с конфигурацией docker-compose, основными параметрами и правилами iptables, чтобы обеспечить корректное функционирование вашего VPN-сервера.

Шаг 1: Подготовка окружения

Для начала, убедитесь, что у вас установлены Docker и Docker Compose. Это можно сделать следующими командами:

sudo apt update
sudo apt install docker.io docker-compose

Шаг 2: Конфигурация Docker Compose

Создайте файл docker-compose.yml и добавьте в него следующую конфигурацию:

version: "3.1"

services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Berlin
      - SERVERURL=someoffice.com
      - SERVERPORT=51820
      - PEERS=6
      - PEERDNS=10.0.10.1
      - ALLOWEDIPS=10.0.10.0/24
    volumes:
      - /home/username/wireguard-config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp # Открываем порт UDP
    networks:
      wireguard_vlan:
        ipv4_address: 10.0.10.16
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    restart: unless-stopped

networks:
  wireguard_vlan:
    external: true

Здесь мы создаём сервис wireguard, который будет работать в Docker-контейнере с необходимыми правами для управления сетью и модулями.

Шаг 3: Создание Docker сети

Как вы уже сделали, создайте внешнюю сеть Docker с помощью следующих параметров:

docker network create -d macvlan --subnet=10.0.10.0/24 --gateway=10.0.10.1 --ip-range=10.0.10.16/32 -o parent=eth0 wireguard_vlan

Эта команда создаёт сетевую подсеть для вашего WireGuard сервера, позволяя ему получать адреса в диапазоне 10.0.10.*.

Шаг 4: Настройка правил iptables

В файле конфигурации WireGuard /config/wg0.conf должны быть прописаны правила для PostUp и PostDown для того, чтобы обеспечить корректную маршрутизацию трафика. Пример конфигурации будет следующим:

[Interface]
Address = 10.13.13.1
ListenPort = 51820
PrivateKey = <ваш_private_key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# peer1
PublicKey = <ваш_public_key>
PresharedKey = <ваш_preshared_key>
AllowedIPs = 10.0.10.17/32  # IP клиента VPN

Обратите внимание, что в PostUp и PostDown правила NAT используются для скрытия клиента VPN за локальным IP-адресом вашей сети.

Шаг 5: Конфигурация клиента

Настройте конфигурацию вашего клиента (например, peer1.conf) следующим образом:

[Interface]
PrivateKey = <ваш_private_key>
Address = 10.0.10.17/32
DNS = 10.0.10.1

[Peer]
PublicKey = <ваш_wireguard_public_key>
PresharedKey = <ваш_preshared_key>
Endpoint = someoffice.com:51820
AllowedIPs = 10.0.10.0/24, 10.13.13.0/24

Обратите внимание на параметры AllowedIPs, которые теперь включают всю локальную сетевую подсеть.

Шаг 6: Запуск и тестирование

После завершения всех настроек, запустите сервисы с помощью команды:

docker-compose up -d

Теперь вы можете подключиться к вашему WireGuard VPN и попытаться отправить пинг к устройствам в локальной сети.

ping 10.0.10.1

Если маршрут настроен правильно, вы должны получить ответ от вашего шлюза.

Заключение

Вы успешно настроили WireGuard VPN-сервер в Docker с доступом к вашей локальной сети. Обязательно проверьте параметры конфигурации и правила iptables, чтобы избежать проблем с маршрутизацией. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...