Դուք պատկերացնում եք, թե VPN սերվերը կարդում է ձեր նոթբուքի հասցեն փաթեթից և գրում այն մատյանում։ Այն, ինչ նա կարդում է, այն է, ինչ վերջին NAT ցատկը դրել է արտաքին վերնագրում, իսկ որպես հոթսփոթ օգտագործվող հեռախոսում դա հաճախ հարյուրավոր այլ բաժանորդների հետ կիսվող հասցե է։ Ձեր մեքենայի սեփական 192.168.x.x հասցեն երբեք չի անցնում ինտերնետը այդ վերնագրում, և թունելի հասցեն սերվերը տալիս է այն բանից հետո, երբ կապն արդեն հաստատված է։ Այսպիսով, երբ սերվերի մատյանն ու նոթբուքի ip addr-ը չեն համընկնում, ոչ մեկը սխալ չէ, նրանք նկարագրում են մեկ սեսիայի տարբեր շերտեր։

Երեք հասցե, և մատյանի մեջ միայն մեկը

Շփոթմունքն առաջանում է երեք հասցեն մեկի մեջ միավորելուց։ Յուրաքանչյուրն ունի տարբեր սեփականատեր, ապրում է տարբեր վերնագրում և սերվերին հասնում է տարբեր ճանապարհով։

AddressWho assigns itWhere it sitsVisible to the VPN server
Device address, e.g. 192.168.1.24Your router via DHCPOuter header, before translationNo, rewritten in place
Translated address and portRouter, ISP CGNAT, or bothOuter header, after translationYes, this is the tuple it logs
Tunnel address, e.g. 10.8.0.6The VPN server itselfInner header, after decapsulationYes, but it chose it

Միայն միջին տողն է անհայտ միանալու պահին։ Սերվերը գրում է այն իր գործընկերների աղյուսակում, կարգավիճակի ֆայլում կամ հոսքի մատյանում՝ կախված դեմոնից. WireGuard-ը այն անվանում է վերջնակետ, OpenVPN-ի կարգավիճակի ֆայլը նշում է այն որպես Real Address, իսկ strongSwan-ը հայտնում է այն որպես IKE_SA-ի հեռավոր հոսթ։ Այդ արժեքը թարմացվում է ամեն անգամ, երբ փաթեթը գալիս է այլ աղբյուրից, ուստի այն փոխվում է առանց որևէ մեկի ինչ-որ բան վերագործարկելու։

Ներքևի տողն այն է, ինչ մարդիկ սխալմամբ կարդում են որպես ինքնության պահանջ։ Այն նշում է տեղ սերվերի կոնֆիգուրացիայում, ոչ թե մարդ, որովհետև սերվերն այն ընտրել է իր իսկ պահուստից։ Երկու օգտատեր կարող են տարբեր օրերին ստանալ նույն թունելի հասցեն, և մեկը կարող է ունենալ դրանցից երկուսը երկու սարքից։

Ինչու է մատյանում գրված թուպլը փոխվում, մինչ թունելը մնում է բաց

Հասցեների թարգմանությունը աղյուսակ է ժամաչափով, ոչ թե մշտական կապում։ Տնային երթուղիչը պահում է իր UDP քարտեզագրումը վերջին փաթեթից որոշ ժամանակ, օպերատորի դարպասը վերամշակում է պորտերը իր ժամանակացույցով, իսկ Wi-Fi-ից LTE անցնող հեռախոսը վերադառնում է բոլորովին այլ աղբյուրով։ Linux-ի conntrack-ի լռելյայն արժեքները այստեղ օգտակար չափանիշ են. nf_conntrack_udp_timeout-ը 30 վայրկյան է, իսկ հոսքային տարբերակը՝ 120, այնպես որ հանգիստ թունելը կարող է կորցնել քարտեզագրումը շատ ավելի վաղ, քան օգտատերը կնկատի։

Թունելը գոյատևում է, որովհետև արձանագրությունը վավերացնում է գործընկերոջը, ոչ թե հասցեն։ WireGuard-ը ձեռքսեղմումից հետո վիճակազուրկ է, ուստի ցանկացած վավերացված փաթեթ թարմացնում է պահված վերջնակետը, և վերակապումը բուժվում է հաջորդ փաթեթով, դրա համար էլ գոյություն ունի persistent-keepalive = 25-ը՝ քարտեզագրումը տաք պահելու համար անգործության ժամանակ։ OpenVPN-ի --float-ը նույն գործն է անում՝ թույլ տալով վավերացված հաճախորդին շարունակել նոր հասցեից և պորտից։ 2.4 և 2.5 տարբերակներում, որտեղ float-ը լռելյայն անջատված է, վերակապումը վերականգնում է սեսիան, և հաճախորդը նորից միանում է։

IPsec-ը հասնում է այնտեղ ավելի շատ շարժական մասերով։ IKEv2-ը նկատում է թարգմանությունը՝ համեմատելով աղբյուրի և նպատակակետի հեշերը NAT-ի հայտնաբերման բեռնվածքներում, անցնում է UDP 4500 ինկապսուլյացիայի և հետևում keepalive-ներին մինչև նոր թուպլը։ Երբ keepalive-ները արգելափակված են, SA-ն մնում է բաց միայն թղթի վրա, մինչ մի ուղղությամբ երթևեկությունը լուռ կանգ է առնում։

Ինչ կարող է սերվերը վերագրել, և ինչ՝ ոչ

Առասպելը, որն արժե սպանել, այն է, թե թարգմանությունը թաքցնում է ձեզ օպերատորից։ Այն փոխում է պիտակը, ոչ թե դիտարկումը։ Օպերատորի NAT-ի հետևում գտնվող դարպասը տեսնում է 100.64.0.0/10 տարածությունը կամ մեկ հանրային հասցե, որը կիսում են շատ բաժանորդներ, և այնուամենայնիվ կարող է հոսքը կապել վկայագրի սուբյեկտի, WireGuard-ի հանրային բանալու, հատկացված թունելի հասցեի, բայթային հաշվիչների և ժամանակային պատուհանի հետ։ Դրանցից ոչ մեկին ձեր LAN հասցեն պետք չէ։

Սահմանափակումները գնում են նաև հակառակ ուղղությամբ։ Մատյանի մեջ կիսված հասցեն ցույց է տալիս դարպասի, ոչ թե տնային տնտեսության. նույն թարգմանված հասցեից տարբեր պորտերով երկու սեսիաները տարբեր սարքեր են. նույն հասցեն երկու տարբեր օրերին կարող է լինել երկու անկապ բաժանորդ, եթե պորտը վերամշակվել է։ Սերվերը, որը գրանցում է միայն գործընկերների բանալիները, չի կարող դրանք կապել հաճախորդի հետ առանց հաշիվների տվյալների բազայի, իսկ սերվերը, որը գրանցում է միայն հասցեներ, չի կարող տարբերել նոթբուքը հեռախոսից նույն երթուղիչի հետևում։

Համեմատեք երկու ծայրերը՝ գուշակելու փոխարեն

Պարզելու համար, թե ինչ եղավ, գրավեք նույն կապը երկու ծայրերում նույն պահին և համեմատեք թուպլը, ոչ թե հասցեն։ Հաճախորդի վրա, ցանկացած թարգմանությունից առաջ.

ss -uapn 'dport = :51820'
ip -4 route get 203.0.113.10
wg show wg0 endpoints

Այնուհետև կարդացեք թարգմանության գրառումը երթուղիչի կամ CGNAT դարպասի վրա, և այն, ինչ ի վերջո հասնում է սերվերին.

conntrack -L -p udp --dport 51820
tcpdump -ni eth0 udp port 51820

Երեք օրինաչափություն բացատրում են անհամապատասխանությունների մեծ մասը։ Սերվերի աղբյուր պորտը տարբերվում է տեղական պորտից, մինչ նպատակակետը համընկնում է. սովորական պորտի թարգմանություն։ Սերվերի աղբյուր հասցեն պատկանում է ISP բլոկի, որը ձերը չէ. առնվազն մեկ լրացուցիչ NAT շերտ։ Փաթեթները կանգ են առնում անգործության շրջանից հետո և շարունակվում նոր պորտով. քարտեզագրումը լրացել է, ոչ թե երթուղային խափանում։ Եթե ժամանակային նշանները մեկ-երկու վայրկյանից ավելի հեռու են, դուք համեմատում եք երկու տարբեր փորձ։

Որտեղ է տարբերությունը կոտրում ամեն ինչ

Սերվերի խափանումների նման ընդհատումները սովորաբար սկսվում են այստեղ։ Ձեր տնային հասցեին կապված մուտքի կանոնը ձախողվում է ISP-ի վարձակալության փոփոխությունից հետո։ Թարգմանված հասցեին համապատասխանող fail2ban կանոնն արգելափակում է այդ դարպասի հետևի բոլոր բաժանորդներին միանգամից։ Հաստատուն հեռավոր հասցեով կայք-կայք գործընկերը դադարում է թարմացնել բանալիները բջջային կապի փոփոխությունից հետո։ Թունելի արձանագրությունը կարգին էր. արտաքին թուպլի մասին ենթադրությունը՝ ոչ։

Նույն շփոթմունքը երևում է սերվերի կողմում։ Եթե VPN տուփն ինքն է NAT-ի հետևում, ձեզ պետք է պորտի փոխանցում և աշխատող փոխանցման ուղի. strongSwan-ի փոխանցման ուղեցույցը լուսաբանում է այդ դեպքը IPsec-ի համար։ Միայն մասնավոր հասցեով հասանելի սերվերը երբեք չի տեսնում իր հաճախորդների ներկայացրած թարգմանված թուպլը, և դա այլ խնդիր է, քան հաճախորդների թարգմանությունը։

Անցեք այս չորս ստուգումները հերթականությամբ և կանգ առեք առաջին ձախողվածի վրա.

  • Գրավեք երկու ծայրերում միաժամանակ. հաստատեք, որ աղբյուր պորտը, նպատակակետ պորտը և ժամանակային նշանները համընկնում են։
  • Սերվերի գործընկերների ցանկում կարդացեք այն հասցեն, որը նա հիմա պահում է, ոչ թե այն, ինչ դուք սպասում էիք։
  • Ստուգեք conntrack կամ NAT աղյուսակը՝ գրառման և դրա մնացած կյանքի համար։
  • Հաստատեք, որ հաճախորդի թունելի ինտերֆեյսի հասցեն համընկնում է սերվերի հատկացրածի հետ, ոչ թե LAN հասցեի։

Եթե երկու գրավումները համաձայն են թուպլի շուրջ, և թունելը դեռ ձախողվում է, թարգմանությունը ձեր խնդիրը չէ. անցեք ձեռքսեղմմանը և թունելի ներսի երթուղային աղյուսակին։

Առնչվող հոդվածներ