Wireguard для внутренней сети

Введение

Wireguard – это быстрый, современный и безопасный VPN туннель. С его помощью можно создать VPN туннель между несоклькими компьютерами, которые будут передавать друг другу данные.

В этой статье мы поговорим о:

О чём не будем говорить:

Вам потребуются знания:

Задачи

Глобально задача одна: иметь свой собственный маленький интранет. Внутри которого будут:

Почему Wireguard?

Это самое простое и производительное selfhosted решение. У него есть:

Как это работает

Когда я начал прорабатывать эту идею, я понял что я хочу иметь 1 точку входа внутрь некого изолированного пространства.

В качестве физической точки входа я выбрал VPS, который развёрнут в Яндекс.Облаке. Давно пользуюсь их сервисами и очень доволен. Но это не обязательно должен быть Яндекс.Облако, можно использовать любого провайдера.

А в качестве изолированного пространства выбрал Docker-Compose. Compose позволяет описать в одном файле все необходимые сервисы, их зависимости и сети между ними. Это свойство для нас особенно важно т.к. нам потребуется сделать сеть Wireguard, но мы не можем к ней привязать все необходимые сервисы, т.к. они должны быть изолированы друг от друга и могут конфликтовать за одни и те же порты.

Конфигурация

Это скопированная и изменённая конфигурация из моего репозитория. Вы можете взять её за основу и доработать под свои нужды. Ниже, после конфигурации, будет объяснение каждого блока.

version: "3"

services:
  # удобный интерфейс для управления Wireguard
  wg-easy:
    image: weejewel/wg-easy
    environment:
      - WG_HOST=vpn.example.com
      - PASSWORD=strongpassword
      - WG_PORT=51820
      - WG_DEFAULT_DNS=10.10.1.3
      - WG_DEFAULT_ADDRESS=10.10.0.x
      - WG_ALLOWED_IPS=10.10.0.0/24, 10.10.1.0/24
    volumes:
      - ./.wg-easy:/etc/wireguard
    ports:
      - "51820:51820/udp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      wg-intranet:
        ipv4_address: 10.10.1.2

  # dns сервер для внутренних доменов и блокировки рекламы
  pihole:
    image: pihole/pihole:2022.09.3
    environment:
      - WEBPASSWORD=strongpassword
      - AUTHORIZED_HOSTNAMES=dns.example.com
      - VIRTUAL_HOST=dns.example.com
    volumes:
      - './.pihole/etc-pihole:/etc/pihole'
      - './.pihole/etc-dnsmasq.d:/etc/dnsmasq.d'
    restart: unless-stopped
    networks:
      wg-intranet:
        ipv4_address: 10.10.1.3

networks:
  wg-intranet:
    ipam:
      config:
        - subnet: 10.10.1.0/24

Объяснение конфигурации

Одно из самых важных (помимо самого wireguard) - это то, как мы настраиваем сети внутри compose-файла.

Вот так выглядит сеть wg-intranet, которая будет использоваться для всех сервисов, которые будут внутри неё. Мы выделяем под нужды сервисов 253 адреса от 10.10.1.2 до 10.10.1.254 (.1 это программный роутер, .255 это широковещательный адрес, адреса, которые невозможно использовать).

networks:
  wg-intranet::
    ipam:
      config:
        - subnet: 10.10.1.0/24

Связываем сеть wireguard (10.10.0.0/24) и нашу внутреннюю сеть wg-intranet (10.10.1.0/24). Так наш контейнер wg-easy будет иметь доступ к обоим сетям и трафик сможет ходит как внутрь, так и наружу.

  wg-easy:
    image: weejewel/wg-easy
    -- // --
    networks:
      wg-intranet:
        ipv4_address: 10.10.1.2

Весь остальной код в рамках данной статьи не очень важен. Т.к. это поднятие pihole как dns сервера и специфичные для wg-easy и pihole конфигурации.

Начало эксплуатации

После запуска контейнеров через docker-compose up нам потребуется настроить первого клиента wireguard. Делается это сложнее чем хотелось бы, но делается это только один раз.

Нам потребуется открыть порт 51821 для доступа к нему из интернета. Или создать ssh-туннель, чтобы иметь доступ к порту 51821 со своего компьютера до localhost’а сервера. Я рассмотрю вариант с ssh-туннелем, т.к. он безопаснее и проще.

Нам потребуется пробросить порт из docker-compose контейнера wg-easy, на 127.0.0.1 (не на 0.0.0.0).

    ports:
      - "127.0.0.1:51821:51821/tcp"

Создаем ssh-туннель на порт 51821.

ssh -L 51821:localhost:51821 user@<ip-адрес-сервера>

После этого открываем в браузере http://localhost:51821 и видим страницу с настройками wireguard. На этой странице мы можем сгенерировать конфигурацию для первого клиента (лучше компьютера) нашей сети wireguard. Подключиться с него к нашей сети wireguard и получить доступ к внутренним сервисам. И после этого удалить недавно открытый ssh туннель, и закрыть порт 51821 в docker-compose.

Поздравляю, вы успешно настроили wireguard и свой маленький интернет.

Что теперь можно сделать

Создать соединение с сервером дома:

Запускать полезные сервисы внутри сети wireguard:

Заключение

Сегодня мы научились создавать свою локальную приватную сеть. Надеюсь, что это статья вам поможет быть более мобильным, продуктивным и защищенным. Поможет вам быстрее и проще создавать персональные системы и сервисы, которые будут доступны только вам.