Налаштовуємо простий VPN з WireGuard і Raspberry Pi як сервер

Оскільки WireGuard стане частиною майбутнього ядра Linux 5.6, я вирішив подивитися, як найкраще інтегрувати цей VPN з моїм LTE-маршрутизатор/точка доступу на Raspberry Pi.

Обладнання

  • Raspberry Pi 3 з модулем LTE та публічною IP-адресою. Тут буде VPN-сервер (далі в тексті він називається edgewalker)
  • Телефон на Android, який має використовувати VPN для всіх комунікацій
  • Ноутбук Linux, який має використовувати VPN лише всередині мережі

Кожен пристрій, який підключається до VPN, повинен мати можливість підключатися до всіх інших пристроїв. Наприклад, телефон повинен мати можливість підключатися до веб-сервера на ноутбуці, якщо обидва пристрої є частиною мережі VPN. Якщо налаштування вийде досить простий, можна подумати про підключення до VPN і десктопа (по Ethernet).

Враховуючи, що провідні та бездротові з'єднання з часом стають все менш безпечними (таргетовані атаки, атака KRACK по злому WPA2 и атака Dragonblood проти WPA3), я всерйоз розглядаю можливість використання WireGuard для всіх моїх пристроїв, незалежно від того, в якому середовищі вони працюють.

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

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

У мене остання Fedora Linux 31, а перед встановленням я полінувався прочитати посібник. Просто знайшов пакети wireguard-tools, встановив їх, а потім не міг зрозуміти, чому нічого не працює. Подальше дослідження показало, що у мене не встановлений пакет wireguard-dkms (з мережним драйвером), а його не було у репозиторії мого дистрибутива.

Якби я прочитав інструкцію, то зробив би правильні кроки:

$ sudo dnf copr enable jdoss/wireguard
$ sudo dnf install wireguard-dkms wireguard-tools

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

$ sudo apt install wireguard

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

Встановлення ключів

Для автентифікації вузлів Wireguard використовує просту схему закритого/відкритого ключів для автентифікації вузлів VPN. Ви можете легко створити ключі VPN за допомогою наступної команди:

$ 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:

[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 легко піднімається наступною командою:

$ sudo wg-quick up wg0

Одна маленька деталь: як DNS-сервер я використав dnsmasq з прив'язкою до мережного інтерфейсу br0я також додав пристрої wg0 до списку дозволених пристроїв. У dnsmasq це робиться шляхом додавання нового рядка з мережевим інтерфейсом у файл конфігурації /etc/dnsmasq.conf, Наприклад:

interface=br0
interface=wg0

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

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

Тепер, коли все працює, можемо прописати автоматичний запуск VPN-тунелю:

$ sudo systemctl enable [email protected]

Конфігурація клієнта на ноутбуці

На ноутбуці створюємо конфігураційний файл /etc/wireguard/wg0.conf з такими ж налаштуваннями:

[Interface]
Address = 10.200.200.2/24
PrivateKey = <copy private key from wg-laptop-private.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:

$ sudo wg-quick up wg0
$ sudo systemctl enable [email protected]

Налаштування клієнта на Android-телефоні

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

[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-код:

$ sudo apt install qrencode
$ qrencode -t ansiutf8 < mobile.conf

QR-код вийде в консоль як ASCII. Його можна відсканувати з Android VPN і автоматично налаштувати VPN-тунель.

Висновок

Налаштування WireGuard просто чарівне порівняно з OpenVPN.

Джерело: habr.com

Додати коментар або відгук