Читайте конфігурацію WireGuard рядок за рядком, від Interface до Peer
Ключі Interface належать цьому кінцю, ключі peer — іншій стороні. Читайте кожен рядок як один напрямок, потім перевірте, що wg-quick додав навколо протоколу.
Більшість зламаних конфігурацій WireGuard помиляються не в значенні; вони ставлять правильне значення не на той бік. Приватний ключ належить цій машині, peer несе відкритий ключ іншої машини, а адреса сидить у блоці interface, хоч і описує, де живе тунель. Читайте файл як два напрямки, що зустрічаються, потім перевірте, що додав згори допоміжний скрипт. Сам протокол має менше полів, ніж файл, і додаткові варто знати окремо.
Ключі interface описують цю машину
Блок interface тримає власну ідентичність цього кінця. PrivateKey — це та ідентичність, і вона ніколи не залишає хост; із неї виводиться відповідний відкритий ключ, і саме його перелічують інші peers. ListenPort — це місце, де ця сторона приймає рукостискання, тому двом клієнтам за однією адресою потрібні різні порти.
Address — це адреса тунелю, на яку відповідає цей хост, записана з довжиною префікса, бо він же буде й джерелом. Помилка в префіксі тут змінює, які адресати хост вважає підключеними напряму, і це дає збої, схожі на маршрутизацію, а не на конфігурацію.
Усе інше в [Interface] блоці зі справжнім клієнтом зазвичай додає wg-quick: DNS, MTU, Table, і рядки перехоплювачів. Це не поля протоколу, і гола wg установка повністю їх ігнорує.
Кожен запис peer описує один інший бік
[Peer] блок — це віддалена сторона. PublicKey — виведений ключ цієї сторони, ніколи не її приватний ключ, а PresharedKey — необов'язковий додатковий секрет, який обидві сторони мають тримати однаково. Endpoint — це куди надсилати, а PersistentKeepalive просить цей хост надіслати пакет після інтервалу, коли більше нічого не виходить.
Дві помилки пояснюють більшу частину плутанини тут. Копіювання власного приватного ключа в блок peer змушує два кінці ділити одну ідентичність, і рукостискання зривається так, що це погано журналюється. Endpoint залишити ззовні на клієнті зазвичай навмисно, бо сервер дізнається адресу з вхідного рукостискання; залишити його ззовні на сервері, який має ініціювати, — ні. Пам'ятайте також, що keepalive тримає відображення NAT відкритим, і він не покращує пропускну здатність і не зменшує затримку, тож тридцять секунд зайвих пакетів нічого не купують, коли трафік уже йде.
AllowedIPs — це маршрутизація, а не список дозволів
AllowedIPs — це криптоключова маршрутизація WireGuard. На виході вона вирішує, який peer отримає пакет за призначенням. На вході вона вирішує, чи буде прийнято пакет, що надійшов від цього peer, за джерелом. Те саме поле робить обидві роботи, тому це не список контролю доступу і не список дозволених сайтів.
Вузький AllowedIPs на сервері для клієнта означає, що сервер прийме лише пакети, які заявляють ці джерела, і надішле лише ці адресати тому клієнту. Розширте один бік, не розширюючи інший, і отримаєте тунель, який піднімається і нічого не пропускає.
Що wg-quick додає навколо протоколу
wg-quick читає той самий файл і виконує мережеві кроки, які протокол залишає операційній системі. Він призначає адресу interface, додає маршрути, виведені з AllowedIPs, записує налаштування резолвера і виконує команди перехоплювачів по черзі.
Цей шар пояснює класичну асиметрію. Файл із 0.0.0.0/0 і рядком DNS дає клієнту маршрут за замовчуванням і резолвер, і він зовсім нічого не робить із правилами пересилання чи NAT сервера. Вони належать власній конфігурації сервера, і жоден клієнтський файл не може їх надати.
Тримайте одного власника файлу. Ручне редагування, поки SaveConfig увімкнено, означає, що ваша правка зникне наступного разу, коли інтерфейс опуститься, і інтерфейс не скаже вам, що це сталося.
Перевіряйте застосований стан, а не файл
Файл — це намір. Застосований стан — те, що тримає ядро, і вони розходяться щоразу, коли помічник, drop-in або перехоплювач щось змінив після активації.
Читайте живий стан і адресацію разом, потім порівняйте обидва з тим, що ви написали:
sudo wg show
ip -4 addr show dev wg0
ip -4 route show dev wg0
grep -v "^#" /etc/wireguard/wg0.confЯкщо список peers порожній, інтерфейс створено без застосування його конфігурації. Якщо адреси й маршрути є, але лічильники залишаються на нулі, файл завантажився і рукостискання зривається, і це проблема ключа чи кінця, а не порядку розділів. Порівняйте два подання перед редагуванням, бо розрив між ними зазвичай і є справжньою несправністю.