OpenVPN-ը stunnel-ի հետևում. ուղղեք փաթաթան, ոչ թե 1194 պորտը
Երկու լսող, երեք պորտ։ Ստուգեք, թե որտեղ է ընկնում ուղղորդումը, որտեղ է կապվում փաթաթան, որտեղ է միանում, ինչ բաց թողեց տեղական թեստը և երկու ինքնությունները։
Տեղադրեք TLS փաթաթան OpenVPN-ից առաջ, և տեղակայումը ստանում է երկրորդ լսող, որոնցից միայն մեկը երբևէ պետք է նայի համացանցին։ Երբ թունելը աշխատում է նույն մեքենայից և ձախողվում է դրսից, ուղղորդումը սովորաբար ուղղված է երկուսից սխալին։ Այն, ինչ պետք է համադրվի, շղթա է. հրապարակային կանոնը հասնում է փաթաթային, և փաթաթայի սեփական backend միացումը հասնում է իրական VPN սոքեթին։ Չորս թռիչք կրում են այդ շղթան, և դրանցից ցանկացածը կարող է շուտ ավարտել հետաքննությունը։
Երկու սոքեթ, երկու տեր, նրանցից մեկը հրապարակային
Փաթաթան ավարտում է TLS-ը արտաքին միացման համար և վերծանված բայթային հոսքը փոխանցում է սովորական OpenVPN TCP լսողին։ Դրանք առանձին սոքեթներ են՝ առանձին կոնֆիգուրացիայի ֆայլերով, այնպես որ մեկը խմբագրելը մյուսին թողնում է անձեռնմխելի և դեռևս արտաքուստ առողջ։ Դա նաև նշանակում է, որ երկուսը կարող են հեռանալ իրարից, երբ մեկը փոխվում է առանց մյուսի։
Հենց մեքենայից աշխատելը ուստի հրապարակային ուղու մասին շատ քիչ է ապացուցում։ Բնիկ պորտին ուղիղ միացումը բաց է թողնում փաթաթան, փաթաթային նրա LAN հասցեով միացումը բաց է թողնում թարգմանությունը, և միայն հաճախորդի կողմի ամբողջական կարգավորումն է վարժեցնում այն, ինչ անում է դրսի օգտատերը։ Անունները նույնպես պետք է ուշադիր կարդալ, որովհետև localhost նշանակում է այն հոսթը, որտեղ աշխատում է հենց այդ բաղադրիչը, ոչ թե այն հոսթը, որի վրա պատահաբար մուտքագրում եք։ Պահեք այդ տարբերությունը ձեր նշումներում, որովհետև առանց ծածկված թռիչքի գրանցված թեստը հրավիրում է երկու տարբեր բաների համեմատության։
Ուր է իրականում ընկնում ուղղորդումը
Շղթան ավելի հեշտ է պահել որպես չորս թռիչք, քան որպես երեք պորտի համար, որովհետև նույն համարը կարող է տարբեր բան նշանակել յուրաքանչյուր ծայրում։ Կարդացեք աղյուսակը տող առ տող. յուրաքանչյուր տող մեկ սոքեթ է, որը պետք է ընդունի միացում և հետո բացի հաջորդը։ Երբ տողը ուղղված է սխալ գործընկերոջը, վերջին սյունակի ախտանիշը հենց այն է, ինչ հաղորդում է օգտատերը։
| Hop | Listens on | Must reach | Symptom when it points elsewhere |
|---|---|---|---|
| Client machine | A local plaintext port | The wrapper's public TLS address | Plain text offered to a TLS endpoint |
| Router forward | Public TCP 443 | The wrapper host on its translated port | Wrapper records no connection at all |
| Wrapper, server mode | Its accepted port, 8443 here | The native VPN socket on loopback | Handshake completes, then silence |
| Native VPN listener | Loopback TCP port | Its peer, over TCP only | A 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