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 հոսքի ժամկետն է, իսկ երկրորդը գործում է պատասխանները դիտելուց հետո։ Երկուսն էլ սովորաբար կարճ են, և լռող քարտեզագրումը կհետևի այն ամենին, ինչը վերաբերում է ձեր հոսքին։
Համեմատեք այդ թիվը ձեր ընդմիջման հետ։ 25 վայրկյանի keepalive-ը 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 կարգավորումը։