Наладжваем просты 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

Дадаць каментар