Տեղադրեք TLS փաթաթան OpenVPN-ից առաջ, և տեղակայումը ստանում է երկրորդ լսող, որոնցից միայն մեկը երբևէ պետք է նայի համացանցին։ Երբ թունելը աշխատում է նույն մեքենայից և ձախողվում է դրսից, ուղղորդումը սովորաբար ուղղված է երկուսից սխալին։ Այն, ինչ պետք է համադրվի, շղթա է. հրապարակային կանոնը հասնում է փաթաթային, և փաթաթայի սեփական backend միացումը հասնում է իրական VPN սոքեթին։ Չորս թռիչք կրում են այդ շղթան, և դրանցից ցանկացածը կարող է շուտ ավարտել հետաքննությունը։

Երկու սոքեթ, երկու տեր, նրանցից մեկը հրապարակային

Փաթաթան ավարտում է TLS-ը արտաքին միացման համար և վերծանված բայթային հոսքը փոխանցում է սովորական OpenVPN TCP լսողին։ Դրանք առանձին սոքեթներ են՝ առանձին կոնֆիգուրացիայի ֆայլերով, այնպես որ մեկը խմբագրելը մյուսին թողնում է անձեռնմխելի և դեռևս արտաքուստ առողջ։ Դա նաև նշանակում է, որ երկուսը կարող են հեռանալ իրարից, երբ մեկը փոխվում է առանց մյուսի։

Հենց մեքենայից աշխատելը ուստի հրապարակային ուղու մասին շատ քիչ է ապացուցում։ Բնիկ պորտին ուղիղ միացումը բաց է թողնում փաթաթան, փաթաթային նրա LAN հասցեով միացումը բաց է թողնում թարգմանությունը, և միայն հաճախորդի կողմի ամբողջական կարգավորումն է վարժեցնում այն, ինչ անում է դրսի օգտատերը։ Անունները նույնպես պետք է ուշադիր կարդալ, որովհետև localhost նշանակում է այն հոսթը, որտեղ աշխատում է հենց այդ բաղադրիչը, ոչ թե այն հոսթը, որի վրա պատահաբար մուտքագրում եք։ Պահեք այդ տարբերությունը ձեր նշումներում, որովհետև առանց ծածկված թռիչքի գրանցված թեստը հրավիրում է երկու տարբեր բաների համեմատության։

Ուր է իրականում ընկնում ուղղորդումը

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

HopListens onMust reachSymptom when it points elsewhere
Client machineA local plaintext portThe wrapper's public TLS addressPlain text offered to a TLS endpoint
Router forwardPublic TCP 443The wrapper host on its translated portWrapper records no connection at all
Wrapper, server modeIts accepted port, 8443 hereThe native VPN socket on loopbackHandshake completes, then silence
Native VPN listenerLoopback TCP portIts peer, over TCP onlyA UDP socket behind a byte-stream relay

Կանոնը, որը թիրախավորում է բնիկ VPN պորտը փաթաթայի փոխարեն, ամբողջությամբ բաց է թողնում TLS-ի ավարտը, ինչը այս սխալի ամենատարածված ձևն է. հաճախորդը ձեռքսեղմում է բացում լսողի հետ, որը սպասում է OpenVPN շրջանակավորմանը, ուստի միացումը կարող է բացվել և հետո կանգ առնել։ Հաստատեք թարգմանված պորտը փաթաթայի կոնֆիգուրացիայի ֆայլի դեմ, ոչ թե հիշողության, որովհետև այդ ֆայլը հաջորդ անգամ խմբագրողը կարող է այլ համար ընտրել։ Ստորև երկու հրամանները ցույց են տալիս այդ հարցի երկու կողմերը միաժամանակ։

grep -nE '^[[:space:]]*(accept|connect)' /etc/stunnel/stunnel.conf
ss -lntp | grep -E ':443|:8443|:1194'

Այն կապման հասցեն, որը մերժում է ձեզ

127.0.0.1-ին կապված accept տողը պատասխանում է միայն հենց հոսթին, ուստի LAN հասցեին եկող ուղղորդումը չի կարող միանալ, և հաճախորդը տեսնում է մերժում, որը հնչում է ինչպես փաթեթային զտիչի խնդիր։ Նայեք սոքեթին նախքան firewall-ին դիպչելը, որովհետև սոքեթն ավելի էժան պատասխանն է։ Կամ կապեք փաթաթան այն ինտերֆեյսին, որին ուղղված է ուղղորդումը, կամ թողեք այն loopback-ում և արեք այնպես, որ ուղղորդումը հասնի loopback-ին իսկապես աշխատող ինչ-որ բանի միջոցով։ Դրանք երկու նախագիծ են, և յուրաքանչյուրն ունի իր կանոնը։

Դրանք խառնելը հենց այն է, ինչի պատճառով աշխատող փաթաթան դրսից անհասանելի է դառնում, մինչ ամեն ֆայլ ճիշտ է թվում։ Ստորև ստուգումը մեկ հրաման է, և այն պատասխանում է հարցին, որին firewall-ի կանոնների վերանայումը չի կարող։ Եթե արդյունքը ցույց է տալիս loopback հասցե, մինչ ուղղորդումը թիրախավորում է LAN հասցեն, ուղղումը պատկանում է accept տողին, ոչ թե փաթեթային զտիչին։

ss -lntp '( sport = :8443 )'

Ինչ իրականում ապացուցեց տեղական թեստը

Առանց ծածկված թռիչքի գրանցված հաջողությունը ապացույց չէ մյուս թռիչքների մասին։ Նշեք, թե թեստը որ հասցեն է օգտագործել և որ գործընթացն է պատասխանել։ Այնուհետև կրկնեք ցանցից դուրս, ոչ թե նույն Wi-Fi-ի հեռախոսից, որովհետև hairpin վարքը տարբերվում է երթուղիչների միջև, և միացումը, որը երբեք չի լքել LAN-ը, կարող է բավարարել հաճախորդին առանց ուղղորդման ընդհանրապես մասնակցելու։ Միայն այդ երկրորդ փորձն է վարժեցնում այն ուղին, որով գնում է անծանոթը։

Երբ փորձը ձախողվում է, հետևեք մեկ միացման երկու մատյաններում. փաթաթայի ընդունված և միացված տողերը, ապա VPN դեմոնի սեփական սեսիայի մատյանը։ Առաջին սահմանը, որը ոչինչ չի գրանցում, հաջորդ փոփոխության տեղն է։ Երբ OpenVPN-ը սկսում է համեմատել գործընկերոջ ընտրանքները, գնահատեք այդ հաղորդագրությունները այդ իրականացման կանոններով։ link-mtu անհամապատասխանության նախազգուշացումը ինքնաբերաբար ճակատագրական չէ, link-mtu-ն 1500-ի վրա ամրացնելը չի ապացուցում, որ բեկորավորումը դադարել է, և ծածկագրի բանակցությունը պատկանում է OpenVPN-ի ներքին կոնֆիգուրացիային, ոչ թե երթուղիչի ուղղորդմանը։

nc -vz 127.0.0.1 1194
journalctl -u stunnel -n 50 --no-pager

Այդ զոնդերը ծածկում են backend սոքեթը և փաթաթայի մատյանը, ինչը մերժված backend-ը առանձնացնում է մերժված ձեռքսեղմումից։ Գործարկեք դրանք, երբ մեկ փորձ է ընթանում, ոչ թե հետո։ Մեկ փորձի ժամանակադրոշմներն են, որ համեմատությունը դարձնում են վստահելի։

Երկու ինքնություն, երկու ձախողման հերթականություն

Արտաքին վկայականը պատկանում է փաթաթային, իսկ ներքին ինքնությունը՝ OpenVPN-ին, և դրանք կարող են տարբեր մարմիններից լինել։ Ստուգումներից որևէ մեկի անջատումը, որպեսզի ուղին առողջ երևա, իրական պաշտպանությունը փոխանակում է կոսմետիկ արդյունքի հետ։ Պահեք երկու ստուգումներն էլ և վրիպազերծեք դրանք հերթականությամբ, որովհետև հաղորդագրությունների հաջորդականությունը նշում է շերտը. փաթաթայի վկայականի խնդիրը երևում է նախքան VPN-ի որևէ ընտրանքի բանակցելը, մինչ ներքին ինքնության ձախողումը երևում է միայն հոսքի հաստատվելուց հետո։

stunnel ձեռնարկը հստակ սահմանում է accept, connect և հաճախորդի ռեժիմը, և այդ բաժինները պատասխանում են սոքեթի հարցին ավելի արագ, քան գուշակելը։ Երբ դեռ չեք կարող ասել, թե որ շերտն է պատասխանել, կարդացեք հանրային պորտի ներկայացրած վկայականը ստորև հրամանով։ Արդյունքի մեջ փաթաթայի վկայականը նշանակում է, որ ուղղորդումը հասել է փաթաթային, իսկ լռությունը կամ արձանագրության սխալը նշանակում է, որ չի հասել։ Այդ մեկ տարբերությունը խնայում է ավելի շատ ժամանակ, քան այստեղ ցանկացած այլ ստուգում։

openssl s_client -connect vpn.example:443 -servername vpn.example </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer

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