Wareguard простими словами
Ця стаття розрахована на людей які знають що таке DNS і DHCP. Іншим, моя порада, не варто витрачати свій час.
Для початку нам треба з'ясувати що таке VPN. Virtual Private Network - це технологія за допомогою якої ми можемо об'єднати дві, або більше локальні мережі в одне ціле. Частий випадок, коли до мережі треба приєднати тільки один компьютер. Але по суті це теж саме.
Побічним ефектом є те, шо має на увазі більшість людей, а саме, виходити в Інтернет в з іншої IP адреси і обходячі таким чином багатьох блокіровок. Для багатьох звичайних користувачів слово VPN відразу асоціюється із засобом доступу в мережу інтернет. Дійсно, це один із найпопулярніших сценаріїв використання цієї технології. Але якщо для більшості це всього лише спосіб обходу обмежень, то фахівці частіше розглядають VPN як захищений канал у мережах із низьким рівнем довіри: публічний Wi-Fi, мережі барів, готелів, аеропортів. А якщо ви працюєте з чутливою інформацією, то для таких цілей краще використовувати власний сервер, наприклад, створивши його на базі WireGuard.
Wireguard це програмний комплекс який нам дозволяє реалізувати технологію VPN. Він має багато переваг порівняно з багатьма іншими. Але має і недоліки. Ми зараз не будемо розглядати ні того ні іншого. Тільки зазначимо, що wireguard стрімко набирає популярності завдяки своїй простоті та швидкості роботи.
Нагадаємо, WireGuard - це тунель без збереження стану, а отже застосовувати до нього терміни "клієнт" і "сервер" некоректно, кожен вузол WireGuard може як підключатися до інших вузлів, так і приймати з'єднання. Але якщо ми говоримо про організацію виходу в інтернет за допомогою VPN, то тут ці терміни доречні. У цьому разі VPN-сервер - це вузол, що надає можливість виходу в інтернет, а VPN-клієнти - вузли, які цю можливість використовують, при цьому технологія реалізації самого VPN-каналу ролі не грає.
Wireguard можливо запустити на різних ОС, але ми розглянемо його “рідну” - linux.
Підготовка це насамперед планування. Планування топології, планування адресного простору, планування потужності сервера та ширини каналів зв'язку. Все це необхідно викласти в письмовому вигляді до начала роботи. Якщо ви змогли це викласти в письмовому вигляді, до ви дійсно склали план (хоча може й з помилками) і можно рухатись далі.
Ви обрали собі “залізо”. Це може бути багато чого, але ми припустимо шо це буде віртуальний сервер в якомусь Европейскому дата центрі. На ньому встановлен Linux і хай це буде Debian (або якись його родич). І ми робимо обґрунтоване припущення, що ви під'єднялись до нього за допомогою SSH.
Перше що ми робимо, це перевіряємо, чи є доступні оновлення системи.
sudo apt update |
Якщо ви вважаєте, що оновлення безпечні і необхідні то оновлюємо систему.
sudo apt upgrade |
Або можно все виконати одною командою.
sudo apt update && sudo apt upgrade -y |
Іноді буває корисно перевірити чи не потрібно перезавантажити систему після оновлення.
# If the file /var/run/reboot-required exists then reboot: |
Переходимо до наступного етапу.
Для встановлення wireguard на ОС Debian 11 треба виконати команду.
sudo apt install wireguard openresolv -y |
Note: якщо ви використовуєте стару версію Debian, наприклад, Debian 10 buster, виконайте команду: |
Для полегшення налаштування клієнта у клієнтів, можно встановити генератор QR кода.
sudo apt install qrencode -y |
Змінимо користувача на root. Так буде зручніше, хоча і небезпечно.
sudo su |
Ви можете зберігати файли конфігурації для wireguard деінде, але розумним вибором буде шлях /etc/wireguard. Перейдомо до нього за допомогою комонди:
cd /etc/wireguard/ |
WireGuard потребує публічних та приватних ключів у кодуванні Base64. Їх можна згенерувати за допомогою утиліти wg. Сгенєруемо ключи для сервера. Це можно зробити різними шляхами, але ми це зробимо в стандартний спосіб. Та перед цим, тимчасово змінимо маску, для забезпечення потрібного набору прав на створені файли:
umask 077 |
Виконаємо генерацію ключової пари:
wg genkey > server_private.key |
І повернемо маску до стандартних значень:
umask 022 |
Ми повинні отримати два файли в поточному каталозі. Це можно перевіпити командою
ls -la |
Наступні команди створять файл wg0.conf і додадуть в нього два рядка які нам знадобляться.
echo "[Interface]" > wg0.conf echo "PrivateKey = "$(cat /etc/wireguard/server_private.key) >> wg0.conf |
Що таке, створенний нами файл wg0.conf? Це файл конфігурації для одного інтерфейсу. Всередині файлу, інструкції для створення інтерфейсу wg0, який буде використаний wireguard для роботи VPN. Конфігурація WireGuard має синтаксис INI, визначений у файлі, який зазвичай називається wg0.conf. Для кожного пристрою краще мати окремий конфіг.
Він може бути розміщений в будь-якому місці системи, але часто розміщується в /etc/wireguard/wg0.conf і посилання на нього повинно бути з використанням абсолютного шляху (зазвичай розміщується в файлі /etc/wireguard/wg0.conf на більшості Linux-систем). Шлях до конфігураційного файлу вказується як аргумент при запуску будь-якої команди wg-quick, наприклад wg-quick up /etc/wireguard/wg0.conf (завжди вказуйте повний, абсолютний шлях)
Ім'я конфігураційного файлу має бути у форматі ${ім'я нового інтерфейсу WireGuard}.conf. Імена інтерфейсів WireGuard зазвичай мають префікс wg і нумеруються, починаючи з 0, але ви можете використовувати будь-яке ім'я, яке відповідає регексу ^[a-zA-Z0-9_=+.-]{1,15}$.
Файли конфігурації можуть використовувати обмежений набір параметрів wg config або більш розширені параметри wg-quick, залежно від того, яка команда є кращою для запуску WireGuard. У цих документах рекомендується використовувати wg-quick, оскільки вона забезпечує більш потужний і зручний досвід конфігурування.
Для клієнта, конфіг або файл конфігурації - це файл, що містить у собі налаштування для підключення до сервера. Він зручний тим, що його можна просто імпортувати в застосунок і він налаштується автоматично.
А зараз пропоную розглянути опції файлу конфігурації Wireguard. Файл конфігурації розділений на дві секції:
Основні параметри [Interface]:
Секції [Peer] містять налаштування клієнтів, які можуть підключитися до сервера. Кожен пір має бути представлений окремою секцією [Peer] з такими полями (що збігаються з параметрами запуску wg set <WG_IFACE> peer...):
Продовжимо налаштування сервера Wireguard. Зараз ми маємо два рядка у файлі. Додамо адресу сервера і порт на якому він буде працювати.
echo "Address = 172.160.100.1/24" >> wg0.conf echo "ListenPort = 51820" >> wg0.conf |
З'ясуємо яку назву має мережевий інтерфейс який виходить у Internet.
ip route get 8.8.8.8 | awk '{print $5}' |
Найімовірніше, у вас мережевий інтерфейс eth0, але можливо й інший, наприклад, enp0s31f6 або якось інакше. Ця назва інтерфейсу використовується далі в конфігурації /etc/wireguard/wg0.conf:
Для редагування файла конфігурації, я зазвичай, використовую редактор vim. Але ви можете використовувати будь який vi, nano або mcedit. Це залежить тільки від ваших уподобань. |
vim /etc/wireguard/wg0.conf |
Далі ми вставляем два правила для фаервола. І ми повинні отримати щось на зразок такого.
[Interface] |
Зверніть увагу - у рядках PostUp і PostDown використано якраз мережевий інтерфейс eth0. Якщо у вас інший - замініть eth0 на ваш. Замість <server_private.key> ми повинні бачити вміст файлу /etc/wireguard/server_private.key
Настраиваем IP форвардинг:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf |
Перевіряємо:
sysctl -p |
Включаем systemd демон с wireguard:
systemctl enable wg-quick@wg0.service |
Перевіряємо:
ip addr |
На цьому первинне налаштування сервера завершено.
Створюємо ключі клієнта:
umask 077 # generate private key umask 022 |
Додамо до файла конфігурації необхідні рядки:
echo " " >> wg0.conf echo "[Peer]" >> wg0.conf echo "#client01" >> wg0.conf echo "PublicKey = "$(cat /etc/wireguard/client01_public.key) >> wg0.conf echo "AllowedIPs = 172.16.100.2/32" >> wg0.conf |
[Peer] |
Зрозуміло що замість <client01_puplic.key> повинно бути вміст файлуclient01_public.key
Перезавантажуємо systemd сервіс із wireguard:
systemctl restart wg-quick@wg0 |
Перевіримо, що ми ми знаходимось каталоге /etc/wireguard/
pwd |
Створимо конфіг для першого клієнта:
echo "[Interface]" >> client01_wb.conf echo "PrivateKey =" $(cat /etc/wireguard/client01_private.key) >> client01_wb.conf echo "Address = 172.16.100.2/32" >> client01_wb.conf echo "DNS = 8.8.8.8" >> client01_wb.conf echo " " >> client01_wb.conf echo "[Peer]" >> client01_wb.conf echo "PublicKey =" $(cat /etc/wireguard/server_public.key) >> client01_wb.conf echo "Endpoint = <SERVER-IP>:51820" >> client01_wb.conf echo "AllowedIPs = 0.0.0.0/0" >> client01_wb.conf echo "PersistentKeepalive = 20" >> client01_wb.conf |
<SERVER-IP> замінюємо на IP сервера.
Далі нам треба на клієнти встановити wireguard і скопіювати файл конфігурації на клієнта. Цей файл відкриваємо в Wireguard клієнті (є для всіх операційних систем, зокрема мобільних) - і тиснемо в клієнті кнопку підключення. Та це буває дуже незручно і займає багато часу. І ось тут нам стане в нагоді програма генерації QR кода, яку ми встановили на початку qrencode. Справа у тому, що багато клієнтів дозволяють створити пір (канал) на через сканування QR коду. Для генерації QR коду потрібно виконати команду …
qrencode -t ansiutf8 < /etc/wireguard/client01_wb.conf |
Ця команда генерує QR код і зразу його показує. Та QR код можно записати у файл і відправити по пошті клієнту.
qrencode -t ansiutf8 -o client01_wb.png < /etc/wireguard/client01_wb.conf |
Наприклад…
mutt -s "Wireguard VPN client config" -a /etc/wireguard/client01_wb.conf -- client01@example.com < /dev/null |
Якщо у Вас є бажання ви можете додати правила маршрутизації у конфіг файл.
Ще можно зустріти використання параметру presharedkey. Від додає захисту системі. Для того щоб його генерувати використайте команду …
# Generate the pre-shared key:
$ wg genpsk > client01.psk |
Перевірка інтерфейсів
# показати мережеві інтерфейси системи LAN і WAN
ifconfig |
# показати мережеві інтерфейси VPN системи
ifconfig wg0 |
# показати інтерфейси WireGuard VPN
wg show all |
Перевірка IP адресів
# показати IP адрес через який трафік йде в Internet
ifconfig eth0 |
# показати зовнішній IP адрес
apt install dnsutils; dig -4 +short myip.opendns.com @resolver1.opendns.com |
# показати IP-адресу VPN
ip address show wg0 |
Перевірка маршрутизації
# показати таблицю маршрутизації WireGuard і однорангові з'єднання
wg show |
# показати таблицю маршрутизації системи
ip route show table main |
# показати системний маршрут до певної адреси
ip route get 172.16.100.2 |
Перевірка ведення журналів
Здійснити додатковий запуск логірування:
modprobe wireguard |
Слідкувати за журналами:
dmesg -wH |
У системах з сучасним ядром і безпечним завантаженням може знадобитися вимкнути перевірку підпису DKMS Secure Boot, щоб дозволити доступ до журналів ядра.
mokutil --disable-verification |
Тестування ping
# перевірте, що сервер wireguard може виходити в Інтернет (з сервера)
ping 1.1.1.1; ping 8.8.8.8 |
# перевірте, чи доступний сервер wireguard по VPN (з кліента)
ping 172.16.100.1 |
# перевірте, чи доступні кліенти мережі через VPN (з сервера)
ping 172.16.100.2 |
# перевірте, чи доступні віддалені піри з NAT через VPN
ping 172.16.100.3 |
# перевірте, чи доступні однорангові маршрутизатори NAT у вашій локальній мережі через VPN
ping 172.16.100.4 |
Traceroad - маршрут проходження трафіку
# перевірте, чи вірно налаштований маршрут (з сервера)
$ traceroute -4 google.com |
# перевірте, чи вірно налаштований маршрут (з кліента)
$ traceroute -4 8.8.4.4 |
# встановіть iperf за допомогою вашого улюбленого менеджера пакетів
apt/brew/pkg install iperf |
# перевірити пропускну здатність публічної мережі Інтернет до сервера ретрансляції
iperf -s # on public relay server |
# перевірка пропускної здатності по VPN до сервера ретрансляції
iperf -s # on public relay server |
# перевірка пропускної здатності через VPN до віддаленого публічного вузла
iperf -s # on remote public peer |
# перевірка пропускної здатності через VPN до віддаленого однорангового пристрою з підтримкою NAT
iperf -s # on remote NAT-ed peer |
# перевірка пропускної здатності через VPN до локального NAT-ed peer (в тій же локальній мережі)
iperf -s # on local NAT-ed peer |
Як ми змогли побачити Wireguard достатньо простий для встановлення і налаштування. В нього є купа переваг: швидкий, безкоштовний, простий в налаштуванні … Але є і застережливи моменти: молодий, тільки UTP, має велику прихильність до Linux. Якщо ми розглядаємо wireguard для приватного використання або для використання в невеликій групі, то це розумний вибір.
Цей рукопис був створений з використанням різних істочників, та я вважаю самим корисним був: Some Unofficial WireGuard Documentation
Можливо хтось знайде корисним: Сайт для генерації WireGuard конфігурацій