Настраиваем собственный сервер VPN WireGuard (с IPv4 и IPv6) для настольного компьютера и смартфона Android

Александр Котов Medium
wireguard vpn блокировки технологии

В прошлой статье мы расказали, как обходить блокировки веб-сайтов с помощью Tor в условиях его гипотетической блокировки с помощью системы DPI. Это позволит посетить любой веб-сайт, но у такого способа есть серьёзные минусы. Tor не предназначен для маршрутизации через его тоннель всего трафика с вашего компьютера. Хотя он и может использоваться таким способом, скорость при этом слишком низкая. Вместо этого предполагается использование Tor Browser, который заточен под анонимность, поэтому не сохраняет cookies, что делает повседневное использование крайне неудобным. Также доступ из Tor ко многим ресурсам заблокирован с их стороны или требует частого ввода капчи.

Что такое WireGuard и почему именно он?

Логотип WireGuard.
Логотип WireGuard.

Для маршрутизации всего вашего трафика через шифрованный тоннель мы предлагаем использовать VPN WireGuard. Сейчас это один из самых передовых протоколов. Он реализован для многих платформ, включая Linux, macOS, Windows, Android и iOS, а скоро должен появиться во FreeBSD и в OpenBSD. В качестве транспортного протокола используется UDP, что даёт низкие накладные расходы на передачу данных. В качестве алгоритма симметричного шифрования используется ChaCha20, который эффективно работает на множестве процессоров даже без аппаратного ускорения. Реализация очень компактная (для Linux это 5500 строк кода), включена в официальный код ядра Linux, а значит прошла хорошее рецензирование, поэтому не должна иметь проблем с безопастью.

WireGuard следует философии UNIX: делать что-то одно и делать это хорошо. Поэтому в нём не предусмотрены многие возможности, например использование в качестве транспортного протокола TCP и обфускация трафика. В последнее время в различных источниках стали появляться сообщения о блокировке в России WireGuard с помощью системы DPI (IT и СОРМ, ЗаТелеком, ntc.party, ветка комментариев на Habr). Разве не становится такой минималистичный подход неприменимым в текущей ситуации?

Судя по всему, блокировка пока осуществляется по IP-адресам серверов конкретных известных поставщиков услуг VPN или по протоколу, но далеко не на всех портах. Это нас пока не волнует, поскольку мы будем настраивать собственный сервер и сможем указать альтернативный порт. Данное решение может оказаться временным, но тогда философия WireGuard тоже сыграет нам на руку, потому что мы сможем пробросить трафик в другой, уже более скрытный тоннель, например TCP, Tor или Shadowsocks с опциональной обфускацией. Гибкость такого подхода позволит нам выбрать решение в зависимости от ситуации. Мы постараемся предоставить соответствующие инструкции позже, а пока перейдём к настройке сервера WireGuard.

Настраиваем сервер WireGuard

Для следования инструкциям в данной статье вам понадобится любой сервер за пределами России с операционной системой Ubuntu 21.04 или подобной и статическим внешним IP-адресом. Можно купить виртуальный сервер, например на DigitalOcean (партнёрская ссылка).

Также необходимо владеть навыками работы в консольном текстовом редакторе. Можно использовать Vim или Emacs, но они требуют изучения. Самым простым вариантом для новичков будет Nano. Устанавливается командой sudo apt install nano. Вызывается командой sudo nano, которой можно дополнительно передать имя файла: sudo nano /foo/bar. Далее можно разобраться по подсказкам в нижней части экрана. Они означают сочетания клавиши Ctrl с другими клавишами.

Все дальнейшие команды необходимо исполнять не просто от имени суперпользователя, а в его окружении. Если вы не вошли от его имени по SSH (а мы рекомендуем отключать такую возможность, о чём подробнее будет сказано в конце статьи), то выполните команду sudo su.

Для начала нужно разрешить пересылку пакетов IP. В файле /etc/sysctl.conf раскомментируем следующие строки (удалим символ # в начале строки):

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

Применим новую конфигурацию:

# sysctl -p

Установим WireGuard и другие нужные пакеты:

# apt install wireguard resolvconf --yes

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

# umask 077

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

# wg genkey | tee /etc/wireguard/server-private.key  | wg pubkey > /etc/wireguard/server-public.key
# wg genkey | tee /etc/wireguard/desktop-private.key | wg pubkey > /etc/wireguard/desktop-public.key
# wg genkey | tee /etc/wireguard/mobile-private.key  | wg pubkey > /etc/wireguard/mobile-public.key

Выведем на экран сгенерированные ключи:

# cat /etc/wireguard/server-private.key
wFPFZDlmPY8v2LQUTyFOCwceZVWP8/x3nt3xhuwYVmE=
# cat /etc/wireguard/server-public.key
/Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
# cat /etc/wireguard/desktop-private.key
SALtULoabF1hjIsRryYKf4ZlCPPCGptglNkuUqacoHk=
# cat /etc/wireguard/desktop-public.key
u2etdp5hA1C602w26JYwhx4TfGCscik89B1DjDz4uQs=
# cat /etc/wireguard/mobile-private.key
SI+uObmWkwTXykuGk0E2LdClUvAmwkjRJA/XBo7//m4=
# cat /etc/wireguard/mobile-public.key
QmmAJIv5U5eMynOHz6/b4zqtuEURhhaKxV+QVmHcRWQ=

После окончания настройки сервера и клиентов или сейчас, если вы не собираетесь очищать экран, эти файлы можно удалить:

# rm -v /etc/wireguard/*.key

Теперь нужно выбрать порт и подсети IPv4 и IPv6. Мы будем использовать порт 37581 и подсети 10.73.105.0/24 и fd41:ce44:b4c9:44ca::/64. Вы можете использовать их же или выбрать любой другой порт (от 1 до 65535, кроме 22, поскольку он используется для SSH) и любые подсети из 10.0.0.0/8 и fd00::/8 (если знаете, как их рассчитывать). Вопрос выбора порта особенно интересен, так как есть информация о блокировках WireGuard по порту, но мы не столкнулись ни с какими проблемами такого рода. На всякий случай рекомендуем не использовать стандартный порт 51820.

Создадим файл /etc/wireguard/wg0.conf. Ключи нужно заменить на те, что мы сгенерировали. Название интерфейса eth0 у вас может отличаться, узнать его можно командой sudo ifconfig:

[Interface]
PrivateKey = wFPFZDlmPY8v2LQUTyFOCwceZVWP8/x3nt3xhuwYVmE=
ListenPort = 37581

Address = 10.73.105.1/24
Address = fd41:ce44:b4c9:44ca::1/64

PostUp   = iptables  -A FORWARD -i %i -j ACCEPT
PostUp   = ip6tables -A FORWARD -i %i -j ACCEPT

PostDown = iptables  -D FORWARD -i %i -j ACCEPT
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT

PostUp   = iptables  -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp   = ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = iptables  -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = u2etdp5hA1C602w26JYwhx4TfGCscik89B1DjDz4uQs=
AllowedIPs = 10.73.105.2/32
AllowedIPs = fd41:ce44:b4c9:44ca::2/128

[Peer]
PublicKey = QmmAJIv5U5eMynOHz6/b4zqtuEURhhaKxV+QVmHcRWQ=
AllowedIPs = 10.73.105.3/32
AllowedIPs = fd41:ce44:b4c9:44ca::3/128

Теперь включим и запустим сервис:

# systemctl enable wg-quick@wg0.service
# systemctl start  wg-quick@wg0.service

Проверить работу сервера можно командой sudo wg show. На экране должна появиться следующая информация (ключи будут отличаться):

interface: wg0
  public key: /Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
  private key: (hidden)
  listening port: 37581

peer: u2etdp5hA1C602w26JYwhx4TfGCscik89B1DjDz4uQs=
  allowed ips: 10.73.105.2/32, fd41:ce44:b4c9:44ca::2/128

peer: QmmAJIv5U5eMynOHz6/b4zqtuEURhhaKxV+QVmHcRWQ=
  allowed ips: 10.73.105.3/32, fd41:ce44:b4c9:44ca::3/128

Настраиваем WireGuard на настольном компьютере

Здесь мы рассмотрим настройку WireGuard на настольном компьютере под управлением операционной системы Ubuntu 20.04 или подобной. Если вы используете другую операционную систему, то воспользуйтесь инструкциями из Интернета.

Повторим команды, которые мы уже использовали на сервере:

$ sudo su
# apt install wireguard resolvconf --yes
# umask 077

Теперь с помощью консольного текстового редактора создадим файл /etc/wireguard/wg0.conf. Ключи, опять же, нужно заменить на те, что мы сгенерировали. IP-адрес 164.90.178.225 замените на адрес вашего сервера:

[Interface]
PrivateKey = SALtULoabF1hjIsRryYKf4ZlCPPCGptglNkuUqacoHk=
DNS = 1.1.1.1

Address = 10.73.105.2/32
Address = fd41:ce44:b4c9:44ca::2/128

[Peer]
PublicKey = /Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
Endpoint = 164.90.178.225:37581

AllowedIPs = 0.0.0.0/0
AllowedIPs = ::/0

Если вы использовали графический текстовый редактор, то файл нужно защитить явно:

$ sudo chown root:root /etc/wireguard/wg0.conf
$ sudo chmod 600       /etc/wireguard/wg0.conf

Теперь включим и запустим сервис:

$ sudo systemctl enable wg-quick@wg0.service
$ sudo systemctl start  wg-quick@wg0.service

Проверить работу сервера можно командой sudo wg show. На экране должна появиться следующая информация (ключи и порт будут отличаться):

interface: wg0
  public key: u2etdp5hA1C602w26JYwhx4TfGCscik89B1DjDz4uQs=
  private key: (hidden)
  listening port: 32937
  fwmark: 0xca6c

peer: /Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
  endpoint: 164.90.178.225:37581
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 1 minute, 51 seconds ago
  transfer: 52.37 MiB received, 48.08 MiB sent

Узнать свой IP-адрес можно следующей командой:

$ curl https://api.myip.com && echo
{"ip":"164.90.178.225","country":"Germany","cc":"DE"}

Он должен совпадать с IP-адресом вашего сервера.

Если на вашем сервере настроен IPv6, то у вас он тоже будет работать, даже если ваш поставщик услуг Интернета не поддерживает его:

$ curl -6 https://api.myip.com && echo
{"ip":"2a03:b0c0:3:d0::1057:a001","country":"Germany","cc":"DE"}

Настраиваем WireGuard на смартфоне Android

Для смартфонов под управлением операционной системы Android существует официальное приложение от оригинального разработчика WireGuard, доступное в Google Play Store и, конечно, для самостоятельной компиляции из исходного кода.

Интерфейс настройки повторяет структуру уже созданного нами ранее файла конфигурации для настольного компьютера, но мы всё-таки приведём пример заполнения полей. Опять же, нужно заменить ключи, IP-адрес и порт сервера на те, которые вы сгенерировали.

В секции “Interface”:

  • Name: любое название
  • Private key: SI+uObmWkwTXykuGk0E2LdClUvAmwkjRJA/XBo7//m4=
  • Public key: QmmAJIv5U5eMynOHz6/b4zqtuEURhhaKxV+QVmHcRWQ= (должен появиться автоматически)
  • Addresses: 10.73.105.3/32, fd41:ce44:b4c9:44ca::3/128
  • DNS servers: 1.1.1.1

В секции “Peer” (нужно нажать кнопку “ADD PEER”):

  • Public key: /Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
  • Endpoint: 164.90.178.225:37581
  • Allowed IPs: 0.0.0.0/0, ::/0

Также вы можете сгенерировать QR-код с вашей конфигурацией, который удобно считывать с помощью приложения WireGuard для смартфона. Для этого создайте где угодно файл конфигурации wg0.conf аналогичный тому, который мы создавали для настольного компьютера:

[Interface]
PrivateKey = SI+uObmWkwTXykuGk0E2LdClUvAmwkjRJA/XBo7//m4=
DNS = 1.1.1.1

Address = 10.73.105.3/32
Address = fd41:ce44:b4c9:44ca::3/128

[Peer]
PublicKey = /Rv/4+vo9pGPRAL5EOAk/LkEy7nXdvKH4ZX5UkS78yA=
Endpoint = 164.90.178.225:37581

AllowedIPs = 0.0.0.0/0
AllowedIPs = ::/0

Теперь установить программу для генерации QR-кодов и запустите её:

$ sudo apt install qrencode
$ qrencode -t ansiutf8 < wg0.conf
QR-код с конфигурацией WireGuard.
QR-код с конфигурацией WireGuard.

Считайте этот QR-код с помощью приложения WireGuard для смартфона. Не забудьте после этого удалить файл конфигурации, так как он содержит ваш приватный ключ:

$ rm wg0.conf

После включения VPN узнать ваш IP-адрес можно на сайте https://myip.com. Он должен совпадать с IP-адресом вашего сервера.

Безопасность

Теперь ваш VPN должен работать. Однако мы совсем не рассматривали вопросы безопасности.

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

$ sudo apt update
$ sudo apt upgrade --yes

Столь же важно включить аутентификацию в SSH по ключу вместо пароля или использовать очень длинный пароль (минимум 32 большие и маленькие цифры и буквы), а также сменить стандартный порт 22 на какой-нибудь другой (строка Port 22 в файле /etc/ssh/sshd_confg и команда sudo systemctl restart ssh.service для перезапуска).

Стоит запретить вход по SSH от имени суперпользователя. Для этого нужно создать другого пользователя, установить для него пароль и ключи SSH и раскомментировать в файле /etc/ssh/sshd_config строку PermitRootLogin no. Этот пользователь, хотя и будет иметь возможность исполнять команды от имени суперпользователя, должен требовать для этого ввод пароля. Таким образом, защита важных файлов будет состоять и из ключа, и из пароля.

Обычной практикой является использование сетевого экрана. В данном случае мы не видим в этом серьёзной необходимости, но всё-таки рекомендуем настроить его. Можно воспользоваться сетевым экраном вашего поставщика услуг VPS и самой операционной системы. Необходимо открыть порты SSH и WireGuard и запретить всё остальное. Следующие команды сохранят настройки и применят их даже после перезагрузки:

$ sudo apt install ufw
$ sudo ufw default allow outgoing
$ sudo ufw allow in 22/tcp    # замените на ваш порт SSH
$ sudo ufw allow in 37581/udp # замените на ваш порт WireGuard
$ sudo ufw default deny incoming
$ sudo ufw enable

Проверить работу сетевого экрана можно командой sudo ufw status verbose.

В большинстве других случаев также рекомендуются такие практики, как настройка Fail2ban для предотвращения множественных попыток подключения по SSH или включение доступа по SSH только после простукивания портов (англ. port knocking), настройка мониторинга и сбора журналов. Однако это выходит за рамки данной статьи.

Есть три основные опасности, которые может представлять для вас незащищённый сервер VPN в случае его взлома:

  • Перехват вашего нешифрованного трафика;
  • Подмена DNS и дальнейшая подмена веб-сайтов, если переход изначально осуществлён по HTTP и без знания веб-браузером параметров HSTS (от англ. HTTP Strict Transport Security);
  • Осуществление незаконных действий с вашего сервера.

Мы не считаем эти опасности очень критичными. При следовании советам из данной статьи они менее вероятны, чем, например, взлом домашнего маршрутизатора (англ. router), за безопасностью которых редко кто следит, насмотря на риски. Так что мы считаем, что если вы смогли выполнить указанные здесь инструкции, то вы вполне можете пользоваться собственным сервером VPN и не беспокоиться. Однако мы всё-таки надеемся, что вы не остановитесь на прочтении данного материала и подробнее изучите работу сетей и операционных систем. Хотя бы потому, что в современных условиях это может вам пригодиться, чтобы просто не потерять доступ в Интернет.