WireGuard PersistentKeepalive: одржете го NAT мапирањето живо
Ако обратната врска работи само веднаш откако партнерот ќе прати сообраќај, мапирањето истекува. Поставете keepalive зад рутерот и потоа прочитајте го вистинскиот рок.
Куќната кутија го отвора тунелот и без проблем стигнува до облачниот сервер. Облачниот сервер може да стигне до домашната апликација една или две минути откако куќната кутија последен пат пратила нешто, и потоа запира. Во дневникот на WireGuard не се појавува ништо, не се пријавува грешка при ракување, а рестартирањето на тунелот го поправа на кратко. Тој образец е мапирање што истекува, а не расипан тунел, и упатството подолу го потврдува тоа пред да се смени нешто.
Потврдете дека образецот е истекување при мирување
Разликувачкиот детал е времето. Ако обратната врска работи веднаш откако домашниот партнер ќе прати сообраќај и не успее по тивок интервал, патеката е во ред, а состојбата во средината не е. Ако никогаш не работела, дури и веднаш по сообраќај, ова е погрешна дијагноза.
sudo wg show wg0 latest-handshakes
sudo wg show wg0 endpoints
sudo wg show wg0 transfer
Извршете ги првите две веднаш откако домашниот партнер ќе прати нешто, почекајте пет минути и извршете ги повторно. Временската ознака за ракување што се обновува според распоред без нова крајна точка ви кажува дека тунелот е жив. Она што се смени е способноста на непобараните пакети да пристигнуваат однадвор, што е својство на патеката, а не на тунелот.
Потоа направете обратен обид и гледајте ги бројачите на пренос. Ако облачната страна праќа бајти, а домашната не прима ниту еден, пакетот го напуштил облакот и умрел во уред што чува состојба на патот. Тоа е потписот што го барате. Ако се движат и двата бројача, тунелот го доставил пакетот и осомничена е апликацијата.
Ставете го keepalive на партнерот зад рутерот
Постојаните keepalive го одржуваат NAT мапирањето и секоја состојба на огнениот ѕид живи со тоа што според распоред праќаат мал автентификуван пакет. Поставката им припаѓа на машината зад рутерот, во нејзиниот запис за оддалечениот партнер, бидејќи таа страна со својот излезен пакет ја создава состојбата.
[Peer]
PublicKey = <cloud peer public key>
AllowedIPs = 10.71.0.1/32
PersistentKeepalive = 25
Спојте го во постоечкиот дел за партнерот. Додавањето втор блок со истиот јавен клуч не е валиден начин да се додадат опции, и wg-quick нема да ги спои наместо вас. Документираните 25 секунди се пример избран да стои под вообичаените UDP рокови, а не вредност со посебно значење.
Поставувањето на истата директива на облачната страна не помага за овој проблем. Пакетите на тој партнер веќе пристигнуваат од јавна адреса, така што нема мапирање што треба да се зачува во важната насока. Тоа додава сообраќај и не менува ништо.
Читајте ги тајмерите наместо да погодувате интервал
keepalive работат затоа што пристигнуваат почесто отколку што состојбата истекува. Тоа го прави рокот бројот што навистина ви треба, а во Linux тој може да се прочита на уредот што го прави преведувањето:
sysctl net.netfilter.nf_conntrack_udp_timeout
sysctl net.netfilter.nf_conntrack_udp_timeout_stream
sudo conntrack -L -p udp --dport 51820
Првата вредност е рокот за UDP тек што е забележан само во една насока, а втората важи откако ќе бидат забележани одговори. И двете обично се кратки, а мапирањето што ќе замолкне ќе следи тоа што важи за вашиот тек.
Споредете го тој број со вашиот интервал. keepalive од 25 секунди под рок од 30 секунди работи; истиот keepalive под рок од 15 секунди не работи. Ниту една количина повторувања не ја менува таа аритметика. Некои домашни рутери и мобилни оператори користат многу пократки вредности од стандардот на Linux, затоа конфигурација што работи на една мрежа не успева на друга.
| Observation | What it means | Reasonable response |
|---|---|---|
| Works after traffic, dies when idle | Mapping or firewall state expiring | Lower the keepalive interval |
| Never works, even immediately | No return route, listener or firewall | Stop tuning keepalive |
| Works for hours, then dies once | Carrier-side translation or address change | Check the endpoint and logs together |
Проверете го слушачот и огнениот ѕид одделно
Живото мапирање е неопходно и недоволно. Апликацијата на куќната кутија мора да слуша на вистинската адреса, а огнениот ѕид на домаќинот мора да го дозволи пакетот откако ќе се дешифрира.
sudo ss -lntup | grep 8080
sudo wg show wg0 allowed-ips
curl -sS -m 5 http://10.71.0.2:8080/health
Ако приклучокот е врзан само за адресата на физичкиот интерфејс, а не за адресата на тунелот, пакетите што пристигнуваат на тунелот се отфрлаат пред воопшто да се праша огнениот ѕид. Овој неуспех од облачната страна изгледа исто како проблем со мапирање и преживува секое прилагодување на keepalive.
Проверката на дозволената листа е исто толку важна во другата насока. Облачниот партнер мора да ја дозволи адресата на домашниот тунел како извор ако ќе одговара, а домашниот партнер мора да ја дозволи облачната адреса како одредиште. keepalive пакетите се автентификуван сообраќај и ги применуваат истите правила, затоа keepalive што изгледа дека работи може да постои заедно со апликација што не работи.
Распоредете ја промената и знајте ги нејзините граници
Применете ја поставката, рестартирајте го интерфејсот ако тоа е вашиот начин на ажурирање, и потоа повторете го тестот за мирување наместо непосредниот тест. Почекајте подолго од рокот што го прочитавте претходно, направете обратно барање и потврдете дека бројачите се движеле на двата краја.
Запишете го интервалот и измерениот рок до него. Идна промена во фирмверот на рутерот или премин на мобилна врска може да го смени рокот. Забелешката е она што му овозможува на некој повторно да ја изведе вредноста наместо да ја копира. Два броја во една линија подоцна заштедуваат цела истрага.
Постојаните keepalive го заштитуваат состојбата. Тие не отвораат порта, не додаваат запис во дозволената листа и не предизвикуваат појавување на слушач. Кога обратната врска воопшто не работи, вината е во една од тие три, и брзиот почеток на WireGuard ја опишува поставката keepalive во истите тесни услови.