How to Wiki Database (change log) http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
16 KiB

9 months ago
====== Простой VPN-сервер ======
Рассмотрим установку и настройку [[:WireGuard|WireGuard]] в качестве простого VPN-сервера на [[wpru>Debian|Debian 10]].
Будем исходить из задачи настроить VPN c топологией "звезда", сервер - на [[:VPS]]. C клиентов настроим доступ к домашней сети и к компьютеру в офисе (с которого так же будем иметь доступ к домашней сети). Кроме того, через VPN будет маршрутизироваться трафик в [[:yggdrasil:Yggdrasil]], т.е., на клиентах Yggdrasil устанавливать необходимости не будет для того, чтобы получить доступ сеть. Для разрешения доменных имен [[yggdrasil:dns:ALFIS|ALFIS]] через туннель, будем использовать один из [[:yggdrasil:dns:alfis#список_публичных_серверов|публичных серверов]].
//Примечание: этот пример предполагает наличие в домашней сети роутера с возможностью установки в него WireGuard.//
===== Установка =====
Для Debian 10 WireGuard находится в репозитории backports. Добавляем его:
<code>sh -c "echo 'deb http://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/buster-backports.list"</code>
Обновляем информацию о пакетах и устанавливаем WireGuard:
<code>apt update && apt-get --yes install wireguard-dkms wireguard-tools</code>
===== Настройка сервера =====
Активируем режим роутера, включив форвардинг пакетов между сетевыми интерфейсами:
<code>sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1</code>
Для того, чтобы форвардинг работал после перезагрузки системы вносим изменение в конфигурационный файл ''%%/etc/sysctl.conf%%'' -- в строках ''%%#net.ipv4.ip_forward=1%%'' и ''%%#net.ipv6.conf.all.forwarding=1%%'' удаляем признак комментария (''%%#%%''). Должно получиться так:
<code>net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1</code>
Создаем каталог для конфигурационного файла WireGuard и переходим в него:
<code>mkdir -p /etc/wireguard && cd /etc/wireguard</code>
Генерируем ключи сервера:
<code>wg genkey | tee privatekey-server | wg pubkey > publickey-server</code>
И сразу можем сгенерировать ключи для клиентов (например, для: домашнего роутера, смартфона, ноутбука и рабочей машины в офисе)
<code>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</code>
Создаем конфигурационный файл сервера WireGuard (используем редактор vi, nano или любой другой):
<code>vi wg0.cfg</code>
Содержимое файла:
<code>[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] указываются публичные ключи клиентов.</code>
//Примечание: fd00::/8 -- аналог частных IPv4 адресов. Подробнее: [[https://habr.com/ru/post/64592/|Основы IPv6]], [[wpru>Частный_IP-адрес|Частный IP-адрес]].//
Включаем автоматический запуск сервера WireGuard при загрузке системы:
<code>systemctl enable wg-quick@wg0</code>
На этом настройку сервера можно завершить...
Запускаем сервер WireGuard:
<code>wg-quick up wg0</code>
Файлы конфигурации и ключи можно сохранить на локальной машине для того, чтобы проще было настраивать клиенты. Если вы подключаетесь из под Windows можно использовать программу [[https://winscp.net/eng/docs/lang:ru|WinSCP]], под Linux - scp.
===== Настройка клиентов =====
Подробно рассмотрим настройку клиента на Linux.
Клиенты под Windows, на смартфоне и роутере настраиваются c помощью графического интерфейса WireGuard (т.е., нужно установить соответствующее приложение), и при понимании принципов, с этим сложностей возникнуть не должно.
[[:wireguard:simple_vpn#По поводу роутера|Ниже]] будет еще небольшое замечание по поводу настройки роутера...
На ноутбуке с Linux аналогичным описанному выше способом устанавливаем WireGuard, создаем конфигурационный файл, вносим в него:
<code>[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 # чтобы соединение не прерывалось</code>
Ничто не мешает создать wg1.conf, wg2.conf и т.д. для подключения из разных мест.
На этом клиенте туннель постоянно поднятым держать необходимости нет, симлинк systemd-юнита создавать не нужно. При необходимости активируем туннель так:
<code>wg-quick up wg0</code>
Информацию о соединениях и на сервере и на клиенте можно смотреть так:
<code>wg show wg0</code>
==== По поводу роутера ====
На роутере WireGuard настраивается, в основном, для того, чтобы в любое время из любого места иметь доступ к домашней сети, поэтому туннельный IPv6 ему не нужен. Кроме того, из дома мы в любой момент с любого устройства можем получить доступ к серверу, и это даёт возможность настроить на роутере машрутизацию через туннель к ошибочно заблокированным [[wpru>Роскомнадзор|РКН]] сайтам. Т.о., все устройства дома проблем из-за этого испытывать не будут и не будут требовать каких-либо дополнительных действий. Весь трафик пускать через туннель на роутере смысла нет, можно прописать там конкретные адреса. Но тут кому как будет удобнее...
Устанавливается WireGuard на роутере, как специальный компонент через панель управления, и настраивается так же -- через web-интерфейс, либо через [[wp>Opkg|opkg]] и консоль -- в зависимости от модели и аппаратных возможностей роутера...
===== Заключение =====
Так можно настроить простую приватную сеть с топологией "звезда". Устройства связаны, как нужно, доступ к Yggdrasil через туннель работает, доменные имена успешно разрешаются указанными серверами, в том числе ALFIS.
Если вам доступ к Yggdrasil через туннель не нужен, можно убрать всё, что касается IPv6 из конфигурационных файлов.
В процессе настройки [маршрутизации] вам, скорее всего, понадобятся средства диагности, чтобы видеть, по какому именно маршруту идут пакеты до заданного узла. Для этих целей можно использовать утилиты traceroute или mtr-tiny (совмещает в себе ping и traceroute).
Чтобы увидеть по какому маршруту идут пакеты просто выполните: <code>traceroute google.com</code>
или
<code>mtr -b google.com</code>
Флагами ''%%-4%%'' ''%%-6%%'' можно выбирать, тестируем IPv4 или IPv6.
//Примечание: в Windows утилита traceroute переименована в tracert.//
Иногда, так же бывает полезно узнать, как ресурсы, к которым вы обращаетесь, определяют ваш IP-адрес. Для этого можно использовать такие сайты, как [[https://2ip.ru/|2ip.ru]] или [[https://myip.ru/|myip.ru]]. Подобные сайты в Yggdrasil: [[http://[200:6223::d35b:1fd8:be0d:2841]/|myip.ygg]], [[http://[301:d060:fb10:ae5b::2]/|http://[301:d060:fb10:ae5b::2]/]].
Так, если вы зайдете на [[https://myip.ru/|myip.ru]] до подключения к VPN, он покажет адрес, который выдан вам вашим провайдером Интернет (или прокси-сервера, если подключаетесь через прокси), а если после подключения к VPN (при условии, что маршрутизация настроена правильно), покажет адрес вашего VPN-сервера.
И на последок, пара сайтов, которые могут помочь определить "утечку" (если для вас это критично) вашего реального IP или запросов DNS: [[https://ipleak.net/|ipleak.net]], [[https://dnsleak.com/|dnsleak.com]], [[https://www.dnsleaktest.com|dnsleaktest.com]].