# WireGuard for Internet access

<https://interface31.ru/tech_it/2022/04/nastroyka-wireguard-vpn-dlya-dostupa-v-internet.html>

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-e3c96e78d5b7aa6086e94b534831ae9c08cbc3b5%2Fwireguard-vpn-internet-access-000.png?alt=media)

Для многих обычных пользователей слово VPN сразу ассоциируется со средством доступа в сеть интернет. Действительно, это один из самых популярных сценариев использования данной технологии. Но если для большинства это всего лишь способ обхода ограничений, то специалисты чаще рассматривают VPN как защищенный канал в сетях с низким уровнем доверия: публичный Wi-Fi, сети баров, гостиниц, аэропортов. А если вы работаете с чувствительной информацией, то для таких целей лучше использовать собственный сервер, например, создав его на базе WireGuard.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на [углубленном курсе по администрированию MikroTik](https://xn-----xlcfvffioc4g.xn--p1ai/lp-mikrotik-mtcna?utm_source=interface31\&utm_medium=cpc\&utm_campaign=2-1372). Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.

WireGuard в последнее время стремительно набирает популярность благодаря своей простоте и скорости работы. Конечно, есть и обратная сторона медали, но в данном сценарии раскрываются в основном только плюсы.

Напомним, WireGuard - это туннель без сохранения состояния, а следовательно применять к нему термины "клиент" и "сервер" некорректно, каждый узел WireGuard может как подключаться к другим узлам, так и принимать соединения. Но если мы говорим об организации выхода в интернет посредством VPN, то здесь данные термины уместны. В данном случае VPN-сервер - это узел предоставляющий возможность выхода в интернет, а VPN-клиенты - узлы, которые данную возможность используют, при этом технология реализации самого VPN-канала роли не играет.

### Настройка VPN-сервера

Для обеспечения доступа в интернет VPN-сервер должен находиться на узле, обладающем достаточной пропускной способностью и точкой выхода в определенном географическом положении, которое зависит от того, к каким именно ресурсам вам нужно получать доступ. В большинстве случаев отлично подойдет VPS (виртуальный выделенный сервер) с минимальным тарифом в нужном расположении и ОС семейства Linux. Если говорить о семействе Debian / Ubuntu, то WireGuard поддерживается начиная с Debian 10 и Ubuntu 18.04 LTS. Все описанные ниже действия следует выполнять с правами суперпользователя root или через sudo.

Если вы используете Debian 10, то вам потребуется подключить **backports**-репозиторий:

```
echo deb http://deb.debian.org/debian buster-backports main > /etc/apt/sources.list.d/buster-backports.list
```

Обновим источники пакетов и установим WireGuard:

```
apt update
apt install wireguard
```

Следующим шагом выполним генерацию ключей, для этого перейдем в директорию **/etc/wireguard**:

```
cd /etc/wireguard
```

Временно изменим маску для обеспечения нужного набора прав на создаваемые файлы:

```
umask 077
```

Выполним генерацию ключевой пары:

```
wg genkey > privatekey
wg pubkey < privatekey > publickey
```

И вернем маску к стандартным значениям:

```
umask 022
```

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

```
cat /etc/wireguard/privatekey
```

Скопируем его содержимое, оно понадобится нам на следующем шаге, помним, что приватный ключ является секретным!

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

```
nano /etc/wireguard/wg0.conf
```

В данном случае мы используем nano, если вам больше по душе редактор mс, то просто замените **nanо** на **mcedit**.

Прежде всего настроим сетевой интерфейс WireGuard, для этого добавим в файл следующую секцию:

```
[Interface]
Address = 10.20.0.1/24
ListenPort = 34567
Privatekey = kNYGiCR3/ikepyURjFnEu5ueoCBsP2pjvGdcj2pggG8=
```

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

Сохраним конфигурацию и добавим службу в автозагрузку, одновременно запустив ее:

```
systemctl enable --now wg-quick@wg0
```

В качестве имени службы используется **wg-quick@<имя\_конфигурационного\_файла>**.

Посмотреть статус WireGuard можно командой:

```
wg
```

Если все сделано правильно, то вы увидите информацию о созданном интерфейсе, в частности порт и публичный ключ.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-33ce7a988cd7db24d88649c2b28b6819b38a35ec%2Fwireguard-vpn-internet-access-001.png?alt=media)

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

### Настройка NAT и брандмауэра

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

Прежде всего включим маршрутизацию, чтобы иметь возможность пересылать пакеты между интерфейсами, для этого откроем файл **/etc/sysctl.conf**, найдем и раскомментируем в нем следующую опцию:

```
net.ipv4.ip_forward = 1
```

Затем перечитаем настройки:

```
sysctl -p
```

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

Более подробно о всех этих способах вы можете прочитать в нашей статье: [Основы iptables для начинающих. Как сохранить правила и восстановить их при загрузке](https://interface31.ru/tech_it/2021/12/osnovy-iptables-dlya-nachinayushhih-kak-sohranit-pravila-i-vosstanovit-ih-pri-zagruzke.html)

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

Создадим файл скрипта и разместим его в **/etc:**

```
nano /etc/nat-rules
```

И добавим в него следующее содержимое:

```
#!/bin/sh

# Сбрасываем настройки брандмауэра
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Разрешаем уже установленные соединения. Первое правило в цепочке!!!
iptables -A INPUT -i ens33 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем подключения по SSH
iptables -A INPUT -i ens33 -p tcp --dport 22 -j ACCEPT
# Разрешаем подключения к WireGuard
iptables -A INPUT -i ens33 -p udp --dport 34567 -j ACCEPT
#Запрещаем входящие извне. Последнее правило в цепочке!!!
iptables -A INPUT -i ens33 -j DROP

# Разрешаем уже установленные транзитные соединения
iptables -A FORWARD -i ens33 -o wg0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Запрещаем транзитный трафик извне
iptables -A FORWARD -i ens33 -o wg0 -j DROP

# Включаем маскарадинг для WireGuard клиентов
iptables -t nat -A POSTROUTING -o ens33 -s 10.20.0.0/24 -j MASQUERADE
```

Это минимальная конфигурация брандмауэра, разрешающего только SSH и WireGuard подключения к серверу, по мере необходимости следует добавить в нее собственные правила. Все они должны располагаться между правилами, разрешающими уже установленные соединения и запрещающего входящие соединения извне. В качестве внешнего интерфейса сервера используется **ens33**.

Сделаем данный файл исполняемым:

```
chmod + x /etc/nat-rules
```

Для его запуска можно добавить в секцию **\[Interface]** конфигурационного файла WireGuard опцию:

```
PostUp = /etc/nat-rules
```

В большинстве случаев этого достаточно, но, если вдруг у нас не запустится WireGuard мы останемся без брандмауэра. Поэтому мы предлагаем пойти другим путем.

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

```
/etc/nat-rules
```

Посмотреть состояние брандмауэра можно командой:

```
iptables -L -vn
```

Если все работает нормально, то установим утилиту **iptables-persistent**:

```
apt install iptables-persistent
```

Во время установки вам будет предложено сохранить текущие правила, с чем следует согласиться. После чего ваши правила будут автоматически сохранены в **/etc/iptables/rules.v4**, откуда будут восстанавливаться при загрузке. Скрипт нам больше не нужен, можем его убрать.

Можно ли обойтись без скрипта? Можно. Но не все обладают достаточными навыками работы с iptables, поэтому предложенный нами способ, хоть и является более длинным и избыточным, позволяет выполнить настройку брандмауэра наиболее просто для начинающих.

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

Скачайте и установите WireGuard для Windows c [официального сайта](https://www.wireguard.com/install/). В приложении выберите **Добавить туннель - Добавить пустой туннель**.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-3e7aa63edc4c0f0e8cae76669a490845d65f0c5c%2Fwireguard-vpn-internet-access-002-thumb-600xauto-14474.png?alt=media)

При этом автоматически будет создана ключевая пара и откроется окно редактирования конфигурационного файла, который уже будет содержать секцию **\[Interface]** и закрытый ключ, все что нам останется, это добавить туда опцию с адресом интерфейса, его следует выбирать из того же диапазона, который вы указали на сервере.

```
Address = 10.20.0.101/24
```

Ниже добавим секцию **\[Peer]** для подключения к серверу:

```
[Peer]
PublicKey = kKxQ4wF+kUrpsTGwjMvlSwX45WV4nixG76/+sKlzEQA=
AllowedIPs = 10.20.0.0/24, 0.0.0.0/0
Endpoint = 203.0.113.2:34567
PersistentKeepalive = 25
```

Которая содержит публичный ключ сервера, его адрес и порт, разрешенные сети. Так как нам требуется обеспечить выход в интернет через WireGuard подключение, то в список сетей мы добавили **0.0.0.0/0**, что обеспечит направление в туннель всего исходящего трафика. Опция **PersistentKeepalive** предполагает обмен служебным трафиком с указанным пиром раз в 25 секунд, что требуется для поддержания нормальной работы клиента в том случае, если он находится за NAT.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-741252b98af21c4b51abd59c90eb4579ceb146d5%2Fwireguard-vpn-internet-access-003-thumb-600xauto-14477.png?alt=media)

После сохранения настроек туннельный интерфейс будет поднят и статус соединения будет **Подключен**, хотя мы еще не делали никаких настроек для данного клиента со стороны сервера. Кого-то может удивить или ввести в заблуждение такое положение дел и именно поэтому мы каждый раз акцентируем тот факт, что WireGuard - это **туннель без сохранения состояния**. Он ничего не знает о реальном состоянии канала и пира, к которому производится подключение, единственный способ это выяснить - послать пакет на другую сторону туннеля.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-41c88d5f4bac3adc66d4773dab36f0a9da49723b%2Fwireguard-vpn-internet-access-004.png?alt=media)

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

```
[Peer]
PublicKey =i p9UjCFHiLnhQTcVgS/Y7j0s8caNj9hhn5RS2UqMXRo=
AllowedIPs = 10.20.0.101/32
```

Где мы укажем публичный ключ клиента и его внутренний IP-адрес, с которого следует принимать пакеты.

Перезапустим службу WireGuard на сервере:

```
systemctl restart wg-quick@wg0
```

Теперь можем проверить связь, для начала пропингуем внутренний адрес сервера **10.20.0.1** - если он отвечает, то туннель работает нормально.

Как мы уже говорили, при тех настройках, которые мы указали в туннель будет заворачиваться **весь исходящий трафик** клиента, в т.ч. и DNS-запросы. Поэтому если у вас в системе указаны локальные адреса DNS, скажем 192.168.1.1 роутера или адреса провайдера, недоступные из внешнего интернета, то разрешение имен работать не будет. Внешне это будет проявляться в том, что интернет работать не будет с указанием на ошибку DNS.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-f6a55d8d3efd243bb150e7edfc22e20c973d06b0%2Fwireguard-vpn-internet-access-005.png?alt=media)

WireGuard прост, и обратная сторона этой простоты заключается в том, что мы не можем передавать нужные опции с сервера на клиента, как в OpenVPN, поэтому спасение утопающих - дело рук самих утопающих. К счастью, WireGuard позволяет задать опции для конфигурирования локального сетевого интерфейса, поэтому откройте приложение Wireguard, найдите свой туннель и выберите Редактировать, в открывшемся окне в секцию **\[Interface]** добавьте опцию:

```
DNS = 8.8.8.8, 1.1.1.1
```

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

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

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

С правами root или через sudo выполним установку и генерацию ключей точно также, как мы это делали на сервере, затем также создадим конфигурационный файл:

```
nano /etc/wireguard/wg0.conf
```

И внесем в него следующее содержимое:

```
[Interface]
Address = 10.20.0.102/24
Privatekey = 4Hfj7lZuaQZWkW2OGHPlkhr3Jxheg/lpcJkwiosvG0w=
DNS = 8.8.8.8, 1.1.1.1

[Peer]
PublicKey = kKxQ4wF+kUrpsTGwjMvlSwX45WV4nixG76/+sKlzEQA=
AllowedIPs = 10.20.0.0/24, 0.0.0.0/0
Endpoint = 203.0.113.2:34567
PersistentKeepalive = 25
```

Секция **\[Interface]** описывает сетевой интерфейс, в ней мы указываем секретный ключ клиента, желаемый адрес в VPN-сети и DNS-сервера. Секция **\[Peer]** отвечает за подключение к серверу, у всех клиентов она общая, содержит публичный ключ сервера, его адрес и порт, а также параметры подключения и роутинга.

Для управление туннелем в ручном режиме можно использовать утилиту **wg-quick**, для подключения выполните:

```
wg-quick up wg0
```

где **wg0** - имя вашего конфигурационного файла, с этим же именем будет создан сетевой интерфейс. Если запустить команду от имени обычного пользователя будет автоматически запрошено повышение прав.

![](https://296194292-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FLoAqAoOfr7XVUQw7Gff8%2Fuploads%2Fgit-blob-4c39d55e948ec889319ca3a9e262fc0b51415664%2Fwireguard-vpn-internet-access-006-thumb-600xauto-14484.png?alt=media)

Для отключения используйте:

```
wg-quick down wg0
```

При этом не забудьте добавить секцию **\[Peer]** для этого узла на сервере и перезапустить службу, для этого понадобится указать публичный ключ клиента и его адрес, точно также как мы это делали для Windows-клиента.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на [углубленном курсе по администрированию MikroTik](https://xn-----xlcfvffioc4g.xn--p1ai/lp-mikrotik-mtcna?utm_source=interface31\&utm_medium=cpc\&utm_campaign=2-1372). Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
