RuCore.NET

VPN с WireGuard + Raspberry Pi





Оборудование: Raspberry Pi 3 с модулем LTE и публичным IP-адресом. Здесь будет VPN-сервер (далее в тексте он называется edgewalker). Телефон на Android, который должен использовать VPN для всех коммуникаций. Ноутбук Linux, который должен использовать VPN только внутри сети. Каждое устройство, которое подключается к VPN, должно иметь возможность подключаться ко всем другим устройствам. Например, телефон должен иметь возможность подключаться к веб-серверу на ноутбуке, если оба устройства являются частью сети VPN. Если настройка получится достаточно простой, то можно подумать о подключении к VPN и десктопа (по Ethernet).

 



 

Установка программного обеспечения

WireGuard предоставляет предварительно скомпилированные пакеты для большинства дистрибутивов Linux, Windows и macOS. Приложения для Android и iOS поставляются через каталоги приложений.

У меня последняя Fedora Linux 31, а перед установкой я поленился прочитать руководство. Просто нашёл пакеты wireguard-tools, установил их, а потом не мог понять, почему ничего не работает. Дальнейшее исследование показало, что у меня не установлен пакет wireguard-dkms (с сетевым драйвером), а его не было в репозитории моего дистрибутива.

 

Если бы я прочитал инструкцию, то сделал бы правильные шаги:

PHP код:

$ sudo dnf copr enable jdoss/wireguard

$ sudo dnf install wireguard-dkms wireguard-tools

На Raspberry Pi у меня установлен дистрибутив Raspbian Buster, там уже есть пакет wireguard, устанавливаем его:

PHP код:

$ sudo apt install wireguard

На телефоне Android установил приложение WireGuard VPN из официального каталога Google App Store.

 

Установка ключей

Для аутентификации узлов Wireguard использует простую схему закрытого/открытого ключей для аутентификации узлов VPN. Можете легко создать ключи VPN с помощью следующей команды:

PHP код:

$ wg genkey | tee wg-laptop-private.key | wg pubkey > wg-laptop-public.key

$ wg genkey | tee wg-server-private.key | wg pubkey > wg-server-public.key

$ wg genkey | tee wg-mobile-private.key | wg pubkey > wg-mobile-public.key

Это даёт нам три пары ключей (шесть файлов). Не будем ссылаться на файлы в конфигах, а скопируем сюда содержимое: каждый ключ — это одна строка в base64.

Создание файла конфигурации для VPN-сервера (Raspberry Pi)

Конфигурация довольно простая, я создал следующий файл /etc/wireguard/wg0.conf:

PHP код:

 

 

[Interface]

Address = 10.200.200.1/24

ListenPort = 51820

PrivateKey = <copy private key from wg-server-private.key>

PostUp  = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wwan0 -j MASQUERADE

[Peer]

# laptop

PublicKey = <copy public key from wg-laptop-public.key>

AllowedIPs = 10.200.200.2/32

[Peer]

# mobile phone

PublicKey = <copy public key from wg-mobile-public.key>

AllowedIPs = 10.200.200.3/32

 

 

Пару замечаний:

В соответствующие места нужно вставить строки из файлов с ключами. Моя сеть VPN использует внутренний диапазон 10.200.200.0/24

Для команд PostUp/PostDown у меня указан внешний сетевой интерфейс wwan0, у вас может быть другой (например, eth0)

Сеть VPN легко поднимается следующей командой:

PHP код:

$ sudo wg-quick up wg0

Одна маленькая деталь: в качестве DNS-сервера я использовал dnsmasq с привязкой к сетевому интерфейсу br0, я также добавил устройства wg0 в список разрешённых устройств. В dnsmasq это делается путём добавления новой строки с сетевым интерфейсом в файл конфигурации /etc/dnsmasq.conf, например:

PHP код:

interface=br0

interface=wg0

Кроме того, я добавил правило iptable, чтобы разрешить трафик на прослушивающий UDP-порт (51280):

PHP код:

$ sudo iptables -I INPUT -p udp —dport 51820 -j ACCEPT

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

PHP код:

$ sudo systemctl enable wg-quick@wg0.service

Конфигурация клиента на ноутбуке.

На ноутбуке создаём файл конфигурации /etc/wireguard/wg0.conf с такими же настройками:

PHP код:

 

 

[Interface]

Address = 10.200.200.2/24

PrivateKey = <copy private key from wg-laptop-pr

Krebs Boryan, [07.02.20 18:48]

ivate.key>

[Peer]

PublicKey = <copy public key from wg-server-public.key>

AllowedIPs = 10.200.200.0/24

Endpoint = edgewalker:51820

 

 

Примечания:

Вместо edgewalker нужно указать публичный IP или хост VPN-сервера. Установив AllowedIPs на 10.200.200.0/24, мы используем VPN только для доступа к внутренней сети. Трафик на все остальные IP-адреса/серверы будет по-прежнему идти по «обычным» открытым каналам. Также будет использоваться предварительно настроенный DNS-сервер на ноутбуке.

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

PHP код:

$ sudo wg-quick up wg0

$ sudo systemctl enable wg-quick@wg0.service

Настройка клиента на Android-телефоне

Для телефона Android создаём очень похожий файл конфигурации (назовём его mobile.conf):

PHP код:

 

 

[Interface]

Address = 10.200.200.3/24

PrivateKey = <copy private key from wg-mobile-private.key>

DNS = 10.200.200.1

 

[Peer]

PublicKey = <copy public key from wg-server-public.key>

AllowedIPs = 0.0.0.0/0

Endpoint = edgewalker:51820

 

 

В отличие от конфигурации на ноутбуке, телефон должен использовать наш VPN-сервер в качестве DNS-сервера (строка DNS), а также пропускать через VPN-туннель весь трафик (AllowedIPs = 0.0.0.0/0).

Вместо копирования файла на мобильное устройство можно преобразовать его в QR-код:

PHP код:

$ sudo apt install qrencode

$ qrencode -t ansiutf8 < mobile.conf

QR-код выйдет в консоль как ASCII. Его можно отсканировать из приложения Android VPN и автоматически настроить VPN-туннель.

 

Источник: https://habr.com/



Поделись статьей с друзьями


66 просмотров



Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: