Wireguard and Pi-Hole

Wireguard

Когда использовал mullvad , подключался с использованием Wireguard, очень нравилось быстрое подключение, высокие скорости соединения и низкая латантность подключения. Пытался неоднократно организовать подключение на своем сервере, но каждый раз возникали какие-то сложности.

И вот, нашел довольно простой способ организации wireguard-сервера с использованием docker-контейнеров. Гарантировано работает только на серверах debian/ubuntu, размещено на dockerhub: linuxserver/wireguard .

Запускать можно как прямым вызовом docker через командную строку, так и через docker-compose. Последний мне нравится куда больше ввиду того, что конфигурацию легко переносить.

Создаем файл docker-compose.yaml со следующим содержимым:

---
version: "3"
services:
  wireguard:
    image: linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1001
      - PGID=1001
      - TZ=Europe/Moscow
      - SERVERURL=auto
      - SERVERPORT=51820 #optional
      - PEERS=5 #optional
      - PEERDNS=auto
      - INTERNAL_SUBNET=10.13.13.0 #optional
    volumes:
      - /home/user/wireguard/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Подробное описание всех опций размещается на странице контейнера.

Я размещал docker-compose.yaml в директории на сервере /home/user/wireguard. И для хранения конфигурационных файлов создаем в ней же поддиректорию config. Именно в ней затем будут создаваться файлы для подключения пиров.

Текущая директория должна быть /home/user/wireguard, используем команду запуска контейнера:

docker-compose up -d

Примерно в течение минуты wireguard запускается, долго ввиду того, что проводиться обновление модулей kernel. Текущий процесс можно наблюдать с помощью команды:

docker logs -f wireguard

После того, как контейнер запуститься, в директории с конфигурацией будут созданы новые поддиректории с конфигурациями подключения для новых пиров, пример:

~/wireguard/config $ ls -1
coredns
peer1
peer2
peer3
peer4
peer5
server
templates
wg0.conf

В этих директориях будут так же размещаться png-файлы с qr-кодами для быстрой передачи конфигурации на клиентов.

Обращаю внимание на то, необходимо внести изменения в конфигурацию клиента, а именно в параметре Allowed IP удалить ipv6 адрес, в противном случае будут возникать проблемы с подключением.

Pi-Hole

Много слышал про pi-hole , и давно хотел использовать его на своем собственном сервере. Но не удавалось ввиду того, что используемая конфигурация доступна всем, в том числе и админка, от которой отказываться очень не хотелось.

И вот теперь, после того, как удалось завести в работу wireguard, стало возможным использовать и pi-hole. Причем очень безопасно и прозрачно. Достаточно было только запустить два контейнера, и wireguard и pi-hole в одной сети. Для этого меняем docker-compose.yaml файл следующим образом:

---
version: "3"
services:
  wireguard:
    image: linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1001
      - PGID=1001
      - TZ=Europe/Moscow
      - SERVERURL=auto
      - SERVERPORT=51820 #optional
      - PEERS=5 #optional
      - PEERDNS=auto
      - INTERNAL_SUBNET=10.13.13.0 #optional
    volumes:
      - /home/evsyukov/wireguard/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped
    networks:
      wireguard:
          ipv4_address: 172.24.0.2
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    environment:
      TZ: 'Europe/Moscow'
      WEBPASSWORD: 'versy secret password'
      DNS1: '1.1.1.1'
      DNS2: '1.0.0.1'
    # Volumes store your data between container upgrades
    volumes:
       - './etc-pihole/:/etc/pihole/'
       - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    dns:
      - 127.0.0.1
      - 1.1.1.1
    # Recommended but not required (DHCP needs NET_ADMIN)
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    cap_add:
      - NET_ADMIN
    restart: unless-stopped
    networks:
      wireguard:
          ipv4_address: 172.24.0.3
networks:
  wireguard:
    ipam:
        driver: default
        config:
            - subnet: 172.24.0.0/16

Создаем отдельную сеть wireguard, в ней жестко задаем определенные ip, которые будут использоваться при инициализации контейнеров. В противном случае ip будем меняться при каждом запуске, и определять конфигурацию будет проблематично.

Необходимо будет создать ряд поддиректорий для конфигурации pi-hole:

mkdir /home/user/wireguard/{etc-dnsmasq.d,etc-pihole}

После инициализации контейнеров необходимо будет внести изменение в конфигурацию coredns, который используется для управления dns в wireguard. Для этого меняем файл /home/user/wireguard/config/coredns/Corefile, приведя его к виду:

. {
    forward . 172.24.0.3
}

После чего все dns-запросы будет адресоваться в pi-hole.

Более того, после подключения к своему vpn, можно в веб-браузере открыть админку pi-hole: http://172.24.0.3/admin, где будет доступна как статистика, так и управление сервером:

Таким образом, создав подключения для каждого из своих устройств, можно уже не беспокоиться не только о безопасности своего подключения, но и о безопасности веб-серфинга. Необходимо только корректно определить список блокировок.

Список блокировок

По умолчанию в pi-hole используется следующий список блок-листов:

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
http://sysctl.org/cameleon/hosts
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt

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

Я решил использовать конфигурацию, что использовал в Nextdns . Доступные списки можно найти в репозитории nextdns/metadata . Ранее я использовал список по умолчанию и добавлял списки от Adguard, получился следующий набор блокировок:

https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://raw.githubusercontent.com/jdlingyu/ad-wars/master/hosts
https://raw.githubusercontent.com/vokins/yhosts/master/hosts
https://raw.githubusercontent.com/tiuxo/hosts/master/ads
https://filters.adtidy.org/extension/chromium/filters/1.txt
https://filters.adtidy.org/extension/chromium/filters/2.txt
https://filters.adtidy.org/extension/chromium/filters/3.txt
https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt

И пока он меня устраивает. Единственно, сформировал определенный список для whitelist:

alluremedia.com.au
api.ipify.org
bit.ly
clients2.google.com
clients3.google.com
clients4.google.com
clients5.google.com
dl.dropbox.com
goo.gl
gravatar.com
imgs.xkcd.com
j.mp
netflix.com
ocsp.apple.com
ow.ly
rover.ebay.com
s.shopify.com
s3.amazonaws.com
tinyurl.com
tomshardware.com
www.bit.ly
yandex.ru

Это домены, которые не являются опасными, и которые не должны блокироваться.

Таким простым образом удалось организовать как безопасное подключение, так и управляемый dns-сервер, позволяющий блокировать рекламу и жучки на страницах сайта.