Поўны тунэль WireGuard: AllowedIPs 0.0.0.0/0 недастаткова
0.0.0.0/0 і ::/0 толькі выбіраюць, што пярэснік будзе несці. Менеджар кліента, перадача на шлюзе, DNS і палітыку збою ўсё яшчэ трэба наладзіць.
Размясціць 0.0.0.0/0, ::/0 у AllowedIPs пярэсніка — гэта крок, які памятаюць усе, і ён вызначае толькі, які трафік пярэсніку дазволена несці. Гэтыя прэфіксы не ствараюць маршрутаў, нічога не перасылаюць на іншым баку і пакідаюць рэзалвер кожнай праграмы там, дзе ён быў. Чатыры асобныя рэчы павінны выконвацца адначасова, каб поўны тунэль быў поўным, і іх лепш правяраць у парадку ніжэй, бо позняя праверка не выратуе папярэднюю. Кожная праверка ніжэй — гэта факт, які можна прачытаць з машыны, а не налада, пра якую вы спадзяецеся, што яна ўжытая.
Што выбірае прэфікс пярэсніка, а што не
AllowedIPs — гэта адначасова селектар і дазвольнік. Ён кажа лакальнаму боку, якія прызначэнні можна адпраўляць гэтаму пярэсніку, і кажа атрымальнаму боку, якія адрасы крыніцы гэты пярэснік можа прадстаўляць. Гэта ўся праца. Нішто ў гэтым апісанні не стварае маршрут на хасце, не ўключае перадачу на далёкім баку і не закранае развязанне імёнаў.
Менавіта таму канфігурацыя можа выглядаць поўнай і паводзіць сябе як раздвоены тунэль. Прэфікс кажа, што пярэснік прыме ўсё; табліца маршрутызацыі хасця вырашае, што фактычна туды патрапіць, а шлюз — ці нешта выйдзе. Ні адно з гэтых трох рашэнняў не жыве ў секцыі пярэсніка.
Маршрутызаваць кліента, а не толькі спіс пярэснікаў
Менеджары такія як wg-quick праграмуюць табліцу маршрутызацыі хасця за вас, і таму два аднолькавыя файлы канфігурацыі паводзяць сябе па-рознаму ў залежнасці ад таго, як узняўся інтэрфейс. Мінімальны профіль дастаткова кароткі, каб прачытаць яго за адзін раз:
[Interface]
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = vpn.example.net:51820
Працу нясуць дзве дэталі. Address — гэта адзіны прэфікс хасця, а не падсетка, якую кліент лічыць сваёй, і менавіта менеджар ператварае стандартны AllowedIPs у сапраўдны стандартны маршрут. Узніміце той самы файл з дапамогай ip link і wg setconf і маршруты не з’явяцца зусім, што выглядае як зламаны тунэль, а насамрэч гэта здаровы тунэль з прапушчаным крокам маршрутызацыі. wg-quick кіраўніцтва дакументуе маршрутызацыю і Table паводзіны, якія дадаюць гэтыя менеджары.
Чытайце вынік, а не файл: ip route get 1.1.1.1 павінна называць інтэрфейс тунэля, а wg show павінна паказваць нядаўні рукапоціск з лічыльнікам перадачы, які рухаецца. Рукапоціск без маршруту азначае, што менеджар не запускаўся, і паўторнае рэдагаванне профілю гэтага не выправіць. Запускайце інтэрфейс так, як яго запусціць карыстальнік, інакш тэст вымярае вашу абалонку замест разгортвання.
Трымаць канчатковы пункт па-за тунэлем
Поўны тунэль захоплівае кожнае прызначэнне, уключаючы тое, з якім ён мусіць размаўляць, каб існаваць. Менеджары вырашаюць гэта, дадаючы маршрут хасця для канчатковага пункта праз першапачатковы шлюз, і таму правільная канфігурацыя амаль заўсёды змяшчае адзін наўмысны вынятак. Ужыванне паловы канфігурацыі менеджарам, а другой паловы ўручную — звычайны шлях, якім гэты вынятак губляецца.
Калі канчатковы пункт — гэта імя хасця, якое развязваецца ў некалькі адрасоў або ў сямейства, якое вы не несіце, вынятак дрэнна старэе, і тунэль можа адмовіць пасля перападлучэння, якое выглядала звычайным. Закмапіце канчатковы пункт на адрас, які вы кантралюеце, або пацвердзіце, што менеджар пераацэньвае яго, і перачытайце маршрут хасця пасля кожнай змены сеткі.
Той самы механізм тлумачыць, чаму поўны тунэль і партал захопу сварацца. Партал чакае перахапіць трафік, які ваш тунэль цяпер захоплівае, таму ў гатэльных і аэрапортавых сетках вы ўзнімаеце тунэль пасля ўваходу ў партал, ніколі перад ім.
Перадача і зваротны шлях на шлюзе
На шлюзе ўключыце перадачу для сямейства, якое вы несіце, дазвольце ланцуг forward у абодвух кірунках, калі вы трансліруеце, і пацвердзіце зваротны шлях пошукам, спецыфічным для крыніцы. Нішто з гэтага не вынікае з паспяховага рукапоціску, бо рукапоціск даказвае толькі тое, што два пярэснікі могуць абменьвацца UDP. Ён нічога не кажа пра тое, што адбываецца з дэкапсуляваным пакетам пасля.
sysctl net.ipv4.ip_forward net.ipv6.conf.all.forwarding
ip route get 1.1.1.1 from 10.8.0.2
Пошук выконваецца на шлюзе, а не на кліенце, інакш вы будзеце чытаць іншую табліцу маршрутызацыі. Калі ён называе няправільны інтэрфейс або паведамляе пра адсутнасць маршруту, то ніякая змена на баку кліента не дасць выхаду ў інтэрнэт. Калі шлюз трансліруе адрасы кліентаў на выхадзе, адказ залежыць ад стану трансляцыі, таму правіла павінна існаваць для абодвух кірункаў патоку, а не толькі для зыходнага.
DNS і стан збою, правераныя асобна
Сам пратакол не наладжвае рэзалвер ніводнай праграмы. wg-quick ужывае радок DNS праз інтэграцыю рэзалвера дыстрыбуцыі, кантэйнеры і браўзеры з уласнымі стэкамі могуць яго ігнараваць, і таму імя можа не развязацца, пакуль тунэль ідэальна нясе пакеты. Тэстуйце з імем хасця, а не з адрасам, і адзначце, які сервер адказаў, замест таго каб меркаваць, што гэта зрабіў сервер з профілю.
Сямействы адрасоў — асобны тэст з асобным адказам. Стандартны маршрут v4 нічога не кажа пра тое, што зробіць злучэнне v6 нейкай праграмы, і тунэль, які моўчкі ўцякае другое сямейства, горш за той, што гучна адмаўляе. Запытайце імя праз кожнае сямейства, прачытайце інтэрфейс, які выкарыстаў кожны запыт, і праверце лічыльнікі трансляцыі да і пасля, бо правіла, якое ні з чым не супадае, выглядае гэтак жа, як правіла, якое адсутнічае.
Нарэшце, праверце стан, які вы хочаце, калі тунэль спыняецца. Поўны тунэль павінен адмаўляць закрыта для трафіку, на які ён прэтэндуе: калі інтэрфейс падае, а праграмы спакойна працягваюць праз фізічнае злучэнне, дызайн — гэта раздвоены тунэль з дадатковымі крокамі. Запішыце меркаваныя паводзіны пры збоі, праверце іх наўмысна і скончыце запісам чатырох адказаў — які менеджар узнімае інтэрфейс, які маршрут нясе стандарт, хто перадае і трансліруе на шлюзе і які рэзалвер адказвае.