WireGuard PersistentKeepalive: išlaikykite NAT susiejimą gyvą
Jei atvirkštinis ryšys veikia tik iškart po to, kai partneris išsiunčia srautą, susiejimas baigia galioti. Nustatykite keepalive už maršrutizatoriaus ir tada perskaitykite tikrąjį skirtąjį laiką.
Namų dėžutė atidaro tunelį ir be problemų pasiekia debesijos serverį. Debesijos serveris gali pasiekti namų programą minutę ar dvi po to, kai namų dėžutė paskutinį kartą ką nors išsiuntė, ir tada sustoja. WireGuard žurnale nieko neatsiranda, jokia rankos paspaudimo klaida nepranešama, o tunelio paleidimas iš naujo trumpam tai sutvarko. Šis modelis yra baigiantis galioti susiejimas, o ne sugedęs tunelis, ir toliau pateiktas vadovas tai patvirtina prieš ką nors keičiant.
Patvirtinkite, kad modelis yra galiojimo pabaiga neveiklumo metu
Išskirianti detalė yra laikas. Jei atvirkštinis ryšys veikia iškart po to, kai namų partneris išsiunčia srautą, ir nepavyksta po tylios pertraukos, kelias yra tvarkingas, o būsena viduryje – ne. Jei jis niekada neveikė, net ir iškart po srauto, tai neteisinga diagnozė.
sudo wg show wg0 latest-handshakes
sudo wg show wg0 endpoints
sudo wg show wg0 transfer
Paleiskite pirmąsias dvi iš karto po to, kai namų partneris ką nors išsiunčia, palaukite penkias minutes ir paleiskite jas dar kartą. Rankos paspaudimo laiko žyma, kuri atsinaujina pagal grafiką be naujo galinio taško, parodo, kad tunelis gyvas. Kas pasikeitė, tai neprašytų paketų galimybė atkeliauti iš išorės, kuri yra kelio, o ne tunelio savybė.
Tada atlikite atvirkštinį bandymą ir stebėkite perdavimo skaitiklius. Jei debesijos pusė siunčia baitus, o namų pusė negauna nė vieno, paketas paliko debesiją ir žuvo kelyje esančiame būseną išlaikančiame įrenginyje. Tai yra parašas, kurio ieškote. Jei juda abu skaitikliai, tunelis pristatė paketą, o įtariamasis yra programa.
Įdėkite keepalive į partnerį už maršrutizatoriaus
Nuolatiniai keepalive palaiko NAT susiejimą ir bet kokią ugniasienės būseną gyvą siųsdami mažą autentifikuotą paketą pagal grafiką. Nustatymas priklauso mašinai už maršrutizatoriaus, jos įraše nuotoliniam partneriui, nes būtent ta pusė savo išeinančiu paketu sukuria būseną.
[Peer]
PublicKey = <cloud peer public key>
AllowedIPs = 10.71.0.1/32
PersistentKeepalive = 25
Sujunkite jį su esamu partnerio skyriumi. Antro bloko su tuo pačiu viešuoju raktu pridėjimas nėra tinkamas būdas pridėti parinkčių, o wg-quick jų už jus nesujungs. Dokumentuotos 25 sekundės yra pavyzdys, pasirinktas kad būtų žemiau įprastų UDP skirtųjų laikų, o ne vertė su ypatinga reikšme.
Tos pačios direktyvos įdėjimas debesijos pusėje šiai problemai nepadeda. To partnerio paketai jau ateina iš viešo adreso, todėl svarbia kryptimi nėra ko išsaugoti. Tai prideda srauto ir nieko nekeičia.
Skaitykite laikmačius, o ne spėliokite intervalą
keepalive veikia todėl, kad atvyksta dažniau, nei būsena baigia galioti. Todėl skirtasis laikas yra skaičius, kurio jums iš tikrųjų reikia, o Linux sistemoje jį galima perskaityti įrenginyje, kuris atlieka vertimą:
sysctl net.netfilter.nf_conntrack_udp_timeout
sysctl net.netfilter.nf_conntrack_udp_timeout_stream
sudo conntrack -L -p udp --dport 51820
Pirmoji reikšmė yra UDP srauto, matyto tik viena kryptimi, skirtasis laikas, o antroji taikoma, kai jau pastebėti atsakymai. Abu paprastai būna trumpi, o nutilusios susiejimas laikysis to, kas taikoma jūsų srautui.
Palyginkite šį skaičių su savo intervalu. 25 sekundžių keepalive esant 30 sekundžių skirtajam laikui veikia; tas pats keepalive esant 15 sekundžių skirtajam laikui neveikia. Joks bandymų skaičius tos aritmetikos nepakeis. Kai kurie namų maršrutizatoriai ir mobilieji operatoriai naudoja daug trumpesnes reikšmes nei Linux numatytoji, todėl konfigūracija, kuri veikia viename tinkle, nepavyksta kitame.
| 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 |
Tikrinkite klausytoją ir ugniasienę atskirai
Gyvas susiejimas yra būtinas ir nepakankamas. Namų dėžutės programa turi klausytis teisingo adreso, o prieglobos ugniasienė turi leisti paketą po to, kai jis iššifruojamas.
sudo ss -lntup | grep 8080
sudo wg show wg0 allowed-ips
curl -sS -m 5 http://10.71.0.2:8080/health
Jei lizdas susietas tik su fizinio sąsajos adresu, o ne su tunelio adresu, tuneliu atvykstantys paketai išmetami dar nepasiteiravus ugniasienės. Šis gedimas iš debesijos pusės atrodo lygiai taip pat kaip susiejimo problema, ir jis išlieka po bet kokio keepalive derinimo.
Leidžiamųjų sąrašo tikrinimas kitą kryptimi yra lygiai toks pat svarbus. Debesijos partneris turi leisti namų tunelio adresą kaip šaltinį, jei ketina atsakyti, o namų partneris turi leisti debesijos adresą kaip paskirties vietą. keepalive paketai yra autentifikuotas srautas ir taiko tas pačias taisykles, todėl veikiantis keepalive gali egzistuoti kartu su programa, kuri neveikia.
Įdiekite pakeitimą ir žinokite jo ribas
Pritaikykite nustatymą, paleiskite sąsają iš naujo, jei tai jūsų atnaujinimo būdas, ir tada pakartokite neveiklumo testą, o ne tiesioginį testą. Palaukite ilgiau nei anksčiau perskaitytas skirtasis laikas, atlikite atvirkštinę užklausą ir patvirtinkite, kad skaitikliai pajudėjo abiejuose galuose.
Užsirašykite intervalą ir išmatuotą skirtąjį laiką šalia. Būsimas maršrutizatoriaus programinės įrangos pakeitimas arba perėjimas prie mobilaus ryšio gali pakeisti skirtąjį laiką. Užrašas leidžia kam nors vėl išvesti vertę, o ne ją nukopijuoti. Du skaičiai vienoje eilutėje vėliau sutaupo visą tyrimą.
Nuolatiniai keepalive saugo būseną. Jie neatidaro prievado, neprideda įrašo į leidžiamųjų sąrašą ir nepriverčia klausytojo atsirasti. Kai atvirkštinis ryšys visai neveikia, kaltė yra viename iš tų trijų, ir WireGuard greitasis vadovas aprašo keepalive nustatymą tomis pačiomis siauromis sąlygomis.