Простой VPN-сервер

Рассмотрим установку и настройку WireGuard в качестве простого VPN-сервера на Debian 10.

Будем исходить из задачи настроить VPN c топологией «звезда», сервер - на VPS. C клиентов настроим доступ к домашней сети и к компьютеру в офисе (с которого так же будем иметь доступ к домашней сети). Кроме того, через VPN будет маршрутизироваться трафик в Yggdrasil, т.е., на клиентах Yggdrasil устанавливать необходимости не будет для того, чтобы получить доступ сеть. Для разрешения доменных имен ALFIS через туннель, будем использовать один из публичных серверов.

Примечание: этот пример предполагает наличие в домашней сети роутера с возможностью установки в него WireGuard.

Установка

Для Debian 10 WireGuard находится в репозитории backports. Добавляем его:

sh -c "echo 'deb http://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/buster-backports.list"

Обновляем информацию о пакетах и устанавливаем WireGuard:

apt update && apt-get --yes install wireguard-dkms wireguard-tools

Настройка сервера

Активируем режим роутера, включив форвардинг пакетов между сетевыми интерфейсами:

sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1

Для того, чтобы форвардинг работал после перезагрузки системы вносим изменение в конфигурационный файл /etc/sysctl.conf – в строках #net.ipv4.ip_forward=1 и #net.ipv6.conf.all.forwarding=1 удаляем признак комментария (#). Должно получиться так:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Создаем каталог для конфигурационного файла WireGuard и переходим в него:

mkdir -p /etc/wireguard && cd /etc/wireguard

Генерируем ключи сервера:

wg genkey | tee privatekey-server | wg pubkey > publickey-server

И сразу можем сгенерировать ключи для клиентов (например, для: домашнего роутера, смартфона, ноутбука и рабочей машины в офисе)

wg genkey | tee privatekey-client-router | wg pubkey > publickey-client-router
wg genkey | tee privatekey-client-smartph | wg pubkey > publickey-client-smartph
wg genkey | tee privatekey-client-wrkPC | wg pubkey > publickey-client-wrkPC
wg genkey | tee privatekey-client-ntb | wg pubkey > publickey-client-ntb

Создаем конфигурационный файл сервера WireGuard (используем редактор vi, nano или любой другой):

vi wg0.cfg

Содержимое файла:

[Interface]
Address = 10.0.0.1/24, fd00::1/124 # адреса сервера в туннеле и их подсети
PrivateKey = 7Ewkr05HDT/DdmYSM8rGv554OoF3mk9vfC3DdlYW/nc= # приватный ключ сервера
ListenPort = 51820 # порт, на котором будет ожидать подключений сервер (можно изменить, если будут ограничения по используемым портам)
# правила iptables будут добавляться и удаляться автоматически при включении и отключении виртуального сетевого интерфейса WireGuard:
# (эти правила реализуют NAT для клиентов)
#IPv4
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#IPv6
PostUp = ip6tables -A FORWARD -i %i -j ACCEPT
PostUp = ip6tables -A FORWARD -o %i -j ACCEPT
PostUp = ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#Yggdrasil
PostUp = ip6tables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#########################
#IPv4
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
#IPv6
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT
PostDown = ip6tables -D FORWARD -o %i -j ACCEPT
PostDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
#Yggdrasil
PostDown = ip6tables -t nat -D POSTROUTING -o tun0 -j MASQUERADE
#eth0 - имя интерфейса на сервере (у вас может отличаться)
#tun0 - интерфейс Yggdrasil на сервере
#вместо %i WireGuard автоматически подставит имя своего интерфеса (wg0)

#Ниже в конфигурационном файле сервера перечислены клиенты, которым разрешено подключение к серверу
[Peer]
#Роутер
PublicKey = keP1jP+XvTp84kUxct6MGXx8rR1xFCMoBniN8m+WLxE= # соответствующий публичный ключ клиента
AllowedIPs = 10.0.0.2/32, 192.168.1.0/24 # адреса и подсети, которые будут маршрутизироваться сервером, через туннель до клиента (иными словами, то, к чему сервер будет иметь доступ через туннель)
# 192.168.1.0/24 - адрес домашней сети, роутер в этой сети имеет адрес 192.168.1.1
# 10.0.0.2/32 - адрес клиента в туннеле (/32 - означает один хост в подсети)

[Peer]
#Смартфон
PublicKey = ho2zZ01goTnlZ03pjl8cJcvRVzsnAivkKRjHaXa50Q0= 
AllowedIPs = 10.0.0.3/32, fd00::3/128 #/128 - один хост

[Peer]
#ноутбук
PublicKey = trrzZ01goTnlZ03pjl8cJcvRVzsnAivkKRjHaXaamd= 
AllowedIPs = 10.0.0.4/32, fd00::4/128

[Peer]
#Рабочая машина в офисе
PublicKey = 0Kn68QK84Nb5wkxbzpnLiPPgj15KXpEvRk+ATlxFvHw= 
AllowedIPs = 10.0.0.5/32, fd00::5/128

#В секции [Interface] указывается приватный ключ сервера (генерировали ранее), в секциях [Peer] указываются публичные ключи клиентов.

Примечание: fd00::/8 – аналог частных IPv4 адресов. Подробнее: Основы IPv6, Частный IP-адрес.

Включаем автоматический запуск сервера WireGuard при загрузке системы:

systemctl enable wg-quick@wg0

На этом настройку сервера можно завершить…

Запускаем сервер WireGuard:

wg-quick up wg0

Файлы конфигурации и ключи можно сохранить на локальной машине для того, чтобы проще было настраивать клиенты. Если вы подключаетесь из под Windows можно использовать программу WinSCP, под Linux - scp.

Настройка клиентов

Подробно рассмотрим настройку клиента на Linux.

Клиенты под Windows, на смартфоне и роутере настраиваются c помощью графического интерфейса WireGuard (т.е., нужно установить соответствующее приложение), и при понимании принципов, с этим сложностей возникнуть не должно.

Ниже будет еще небольшое замечание по поводу настройки роутера…

На ноутбуке с Linux аналогичным описанному выше способом устанавливаем WireGuard, создаем конфигурационный файл, вносим в него:

[Interface]
Address = 10.0.0.4/24, fd00::4/124
PrivateKey = sdwrd1oaoYAFOg0CPBkXhsvfzPrLj79aIQ0THsffes=
DNS = 94.140.14.14, 94.140.15.15, 302:db60::53 # последним указан публичный адрес DNS-сервера ALFIS (можно указать не публичный, а свой)
#так же, в разделе с DNS можно прописать домашний DNS-сервер (pi.hole, например)

#Трафик через туннель маршрутизируется полностью, за исключением нижеследующего:
PostUp = ip route add zzz.zz.zzz.zz via 192.168.1.1 # сервер в офисе (нужно по работе)
PostUp = ip route add $(dig A myDomain.com +short | tail -n 1) via 192.168.1.1 # и еще один сервер, который требует скоростного доступа

#!Если вместе с туннелем Wireguard на этой же машине будет запускаться Yggdrasil, то тут же имеет смысл перечислить
#публичные пиры, к которым будете подключаться, чтобы соединение с ними не шло через туннель.

################################################################

#то, к чему ходим напрямую
PostDown = ip route del zzz.zz.zzz.zz
PostDown = ip route del $(dig A myDomain.com +short | tail -n 1)

#!Если вместе с туннелем Wireguard на этой же машине будет запускаться Yggdrasil, то тут же имеет смысл перечислить
#публичные пиры, к которым будете подключаться, чтобы соединение с ними не шло через туннель.

[Peer]
PublicKey = asdoSDafr2sNv6cp/FcdlKiuVCi2DtCduU0mmrrte=
Endpoint = xxx.xxx.xxx.xxx:51820 # адрес сервера WireGuard и порт, на котором он ожидает подключений
AllowedIPs = 0.0.0.0/0, ::/0 # адреса / подсети, которые будут маршрутизироваться через туннель (маршрутизируем всё)
#!При такой конфигурации необходимо наличие "настоящего" IPv6 на сервере, иначе сайты по IPv6 (не Yggdrasil) открываться не будут
#!Вместо ::/0 можно использовать 200::/7
PersistentKeepalive = 30 # чтобы соединение не прерывалось

Ничто не мешает создать wg1.conf, wg2.conf и т.д. для подключения из разных мест.

На этом клиенте туннель постоянно поднятым держать необходимости нет, симлинк systemd-юнита создавать не нужно. При необходимости активируем туннель так:

wg-quick up wg0

Информацию о соединениях и на сервере и на клиенте можно смотреть так:

wg show wg0

По поводу роутера

На роутере WireGuard настраивается, в основном, для того, чтобы в любое время из любого места иметь доступ к домашней сети, поэтому туннельный IPv6 ему не нужен. Кроме того, из дома мы в любой момент с любого устройства можем получить доступ к серверу, и это даёт возможность настроить на роутере машрутизацию через туннель к ошибочно заблокированным РКН сайтам. Т.о., все устройства дома проблем из-за этого испытывать не будут и не будут требовать каких-либо дополнительных действий. Весь трафик пускать через туннель на роутере смысла нет, можно прописать там конкретные адреса. Но тут кому как будет удобнее…

Устанавливается WireGuard на роутере, как специальный компонент через панель управления, и настраивается так же – через web-интерфейс, либо через opkg и консоль – в зависимости от модели и аппаратных возможностей роутера…

Заключение

Так можно настроить простую приватную сеть с топологией «звезда». Устройства связаны, как нужно, доступ к Yggdrasil через туннель работает, доменные имена успешно разрешаются указанными серверами, в том числе ALFIS.

Если вам доступ к Yggdrasil через туннель не нужен, можно убрать всё, что касается IPv6 из конфигурационных файлов.

В процессе настройки [маршрутизации] вам, скорее всего, понадобятся средства диагности, чтобы видеть, по какому именно маршруту идут пакеты до заданного узла. Для этих целей можно использовать утилиты traceroute или mtr-tiny (совмещает в себе ping и traceroute).

Чтобы увидеть по какому маршруту идут пакеты просто выполните:

traceroute google.com

или

mtr -b google.com

Флагами -4 -6 можно выбирать, тестируем IPv4 или IPv6.

Примечание: в Windows утилита traceroute переименована в tracert.

Иногда, так же бывает полезно узнать, как ресурсы, к которым вы обращаетесь, определяют ваш IP-адрес. Для этого можно использовать такие сайты, как 2ip.ru или myip.ru. Подобные сайты в Yggdrasil: myip.ygg, http://[301:d060:fb10:ae5b::2]/.

Так, если вы зайдете на myip.ru до подключения к VPN, он покажет адрес, который выдан вам вашим провайдером Интернет (или прокси-сервера, если подключаетесь через прокси), а если после подключения к VPN (при условии, что маршрутизация настроена правильно), покажет адрес вашего VPN-сервера.

И на последок, пара сайтов, которые могут помочь определить «утечку» (если для вас это критично) вашего реального IP или запросов DNS: ipleak.net, dnsleak.com, dnsleaktest.com.

Обсуждение

d4708, 2023/09/02 20:28
Как альтернатива, простая настройка openvpn
https://github.com/angristan/openvpn-install
Только авторизованные участники могут оставлять комментарии.
wireguard/simple_vpn.txt · Последнее изменение: 2023/10/10 18:06 — 127.0.0.1
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki