Настройка WireGuard-сервера на роутере с OpenWRT (с описанием настройки клиентов под Windows и Android)

Я уже писал, как настроить и собрать прошивку на основе ОС OpenWRT для роутера GL-MT300N-V2. Почитать эти заметки можно здесь и здесь. Теперь я решил построить свою виртуальную частную сеть на основе этого роутера. Структура этой сети предполагается такой. Есть роутер с двумя портами: WAN и LAN. К LAN-порту роутера подключен файловый сервер, в WAN-порт воткнут кабель провайдера. Пусть провайдер выдаёт мне белый IP-адрес 1.2.3.4. Цель: безопасно подключаться к файловому серверу из любой точки земного шара так, словно файловый сервер находится в изолированной локальной сети. Решить эту задачу просто, если создать VPN (а изначальный смысл VPN - виртуальной частной сети - именно в том, чтобы создавать «локальные» сети поверх Интернета, например, для подключения удалённых сотрудников офиса). Итак, роутер выступает VPN-сервером, файловый сервер подключен к нему как VPN-клиент. Любые другие устройства, которым требуется доступ к файловому серверу, подключаются к VPN-серверу как VPN-клиенты и становятся частью одной с файловым сервером «локальной» сети, то есть, могут общаться как с файловым сервером, так и между собой по внутренним IP-адресам. В качестве программы и протокола VPN я решил попробовать WireGuard. Вот как настроить сервер WireGuard на роутере и подключить к нему клиентов.

1. Установить необходимые пакеты. Можно так:

opkg update
opkg install kmod-wireguard luci-app-wireguard luci-proto-wireguard wireguard wireguard-tools

Но я выбирал их, когда настраивал собственную сборку OpenWRT.

2. В веб-интерфейсе роутера перейти в раздел Сеть → Интерфейсы и нажать кнопку «Добавить новый интерфейс». Ввести имя интерфейса: wg0. Выбрать протокол: WireGuard VPN.

3. Подключиться к роутеру по SSH и сгенерировать ключи:

umask 077 && wg genkey > privkey
cat privkey | wg pubkey > pubkey
cat privkey

4. Вернуться в веб-интерфейс, открыть Сеть → Интерфейсы и далее WG0 → Основные настройки. В поле «Приватный ключ» ввести приватный ключ, отображаемый в ssh-консоли. Задать порт (51820) и IP-адрес в CIDR-нотации, например, 10.14.0.1/29. Он определяет как IP-адрес самого WireGuard-сервера (10.14.0.1), так и диапазон всей частной подсети (/29) VPN-тоннеля. Я выбрал маску /29, так как её диапазона в семь адресов мне вполне достаточно. Про маски хорошо в Википедии написано.

5. Теперь частично настроим Android-клиент. Нужно скачать и установить приложение WireGuard из магазина Google Play. Затем открыть его, нажать кнопку «+», выбрать «Создать вручную». В открывшейся форме следует ввести имя туннеля (произвольное) и создать ключевую пару кнопкой «Создать». Далее вернуться в веб-интерфейс роутера. В разделе «Пиры» нажать кнопку «Добавить». В поле «Публичный ключ» ввести публичный ключ, сгенерированный приложением на смартфоне. В поле «Разрешённые IP-адреса» ввести желаемый IP-адрес клиента из диапазона, указанного при задании подсети в настройках интерфейса. Адрес должен быть в CIDR-нотации с маской /32 (например, 10.14.0.2/32). Поставить галочку «Маршрут, разрешённый для IP-адресов». В поле «Постоянно держать включённым» ввести значение «25».

6. Перейти во вкладку «Настройки межсетевого экрана» и в поле «Создать/назначить зону сетевого экрана» прикрепить к интерфейсу wg0 зону lan. Нажать кнопку «Сохранить и применить».

7. Завершить настройку Android-клиента. В поле «Адреса» ввести желаемый IP-адрес клиента, тот же самый, который установлен в настройках соответствующего пира (в этом примере 10.14.0.2/32). Поля «Порт» и «MTU» оставить пустыми, в поле «DNS-серверы» ввести любой предпочитаемый DNS-сервер, например, 8.8.8.8 или 1.1.1.1. Затем нажать кнопку «Добавить узел». В поле «Открытый ключ» ввести открытый ключ сервера, для получения которого в SSH-консоли роутера следует выполнить команду:

cat pubkey

В поле «Разрешённые IP-адреса» ввести строку «0.0.0.0/0», а в поле «Конечная точка» - внешний адрес роутера вместе с портом, выбранным при настройке интерфейса (пусть провайдер предоставляет белый IP 1.2.3.4, и кабель провайдера воткнут в WAN-порт роутера; тогда это и есть внешний адрес роутера, и в поле «Конечная точка» следует ввести «1.2.3.4:51820», где 51820 — выбранный ранее порт для интерфейса wg0). Сохранить настройки туннеля (нажать на кнопку с изображением дискеты в правом верхнем углу приложения). Чтобы активировать подключение к VPN, достаточно открыть на смартфоне приложение WireGuard и включить нужный туннель, переведя переключатель в положение «Включено».

8. Завершить настройку роутера. Вернуться в SSH-консоль и настроить файрвол, введя эти команды:

uci add firewall rule
uci set firewall.@rule[-1].src="*"
uci set firewall.@rule[-1].target="ACCEPT"
uci set firewall.@rule[-1].proto="udp"
uci set firewall.@rule[-1].dest_port="51820"
uci set firewall.@rule[-1].name="Allow-Wireguard-Inbound"
uci commit firewall
/etc/init.d/firewall restart

9. Теперь нужно настроить Windows-клиент, подключенный к LAN-порту роутера. Нужно скачать и установить официальный WireGuard-клиент. Нажать на стрелочку возле кнопки «Add Tunnel» и выбрать пункт «Add empty tunnel...». В открывшемся окне появится автоматически сгенерированная ключевая пара. В текстовом поле ниже следует ввести такие настройки:

[Interface]
PrivateKey = <Приватный ключ, автоматически сгенерированный программой>
Address = 10.14.0.3/32
DNS = 8.8.8.8

[Peer]
PublicKey = <Публичный ключ сервера>
AllowedIPs = 0.0.0.0/0
Endpoint = 192.168.1.1:51820

Здесь следует обратить внимание на два поля. Поле «Address» - это желаемый IP-адрес для данного клиента. Адрес 10.14.0.2 уже присвоен Android-клиенту, поэтому просто выбираем следующий по счёту адрес. В поле «Endpoint» нужно указать адрес роутера вместе с портом. И вот здесь очень тонкий момент. В любом другом клиенте мы бы указали IP-адрес, выданный нам провайдером, как в п. 7 («1.2.3.4:51820»). Но в данном случае наш компьютер подключён к LAN-порту роутера, являющегося WireGuard-сервером, поэтому мы должны указывать локальный адрес самого роутера. Тот самый адрес, по которому мы получаем доступ к веб-интерфейсу роутера.

10. Теперь, кстати, надо снова открыть веб-интерфейс роутера, чтобы добавить новый пир. Нужно перейти в раздел Интерфейсы → WG0, в разделе «Пиры» нажать кнопку «Добавить». В поле «Публичный ключ» нужно ввести ключ, сгенерированный при запуске программы-клиента на компьютере (см. п. 9). В поле «Разрешённые IP-адреса» ввести выбранный адрес данного клиента (10.14.0.3/32). Поставить галочку «Маршрут, разрешённый для IP-адресов». В поле «Постоянно держать включённым» ввести значение «25». Нажать кнопку «Сохранить и применить». Настройка сервера и двух клиентов завершена.

Чтобы убедиться в правильности настроек, подключитесь к созданной сети со смартфона, включив соответствующий туннель в приложении WireGuard. Если затем вы откроете браузер и в адресной строке наберёте внутренний адрес WireGuard-роутера 10.14.0.1, то должны попасть в веб-интерфейс роутера.

Также доступно официальное руководство OpenWRT по настройке сервера WireGuard.

Дополнительно. Этот же рецепт, но без использования веб-интерфейса, только через консоль.
2020-02-29