80 ir 443 prievadų taisyklės neveda naršyklės per VPN
Prievado atitikmuo parenka TCP srautus, o ne naršyklę. HTTP/3 veikia per UDP, DNS gali eiti kitu keliu, o atnaujinimo programa atitinka tą pačią taisyklę, kurią parašėte.
Kažkas prašo, kad naršyklė naudotų tunelį, ir atsakymas grįžta kaip ugniasienės taisyklė, atitinkanti paskirties prievadus 80 ir 443. Ji atrodo tiksli ir nėra. Prievado atitikmuo parenka paketus pagal jų transporto antraštę, o ne pagal tai, kuri programa atidarė lizdą, ir šiuolaikinis naršymas neapsiriboja tais dviem prievadais TCP. Taisyklė praleis dalį srauto, kurį norėjote įtraukti, ir pagaus srautą, kurio niekada neketinote liesti. Prieš rašydami nuspręskite, kurios iš trijų skirtingų ribų iš tikrųjų norite.
Taisyklė aprašo transporto klasę, o ne programą
Linux sistemoje paskirties prievado atitikmuo tikrina TCP antraštę ir nieko virš jos. Tų paketų žymėjimas ir nukreipimas politikos maršrutu veikia tiksliai taip, kaip dokumentuota, ir nė vienas iš šių mechanizmų nežino, ką reiškia naudingasis krūvis ar kuris procesas jį išsiuntė. Žymė yra prie paketo prijungtas skaičius, o ne prie programos prijungta tapatybė.
nft add rule inet mangle output tcp dport { 80, 443 } meta mark set 0x1
ip rule add fwmark 0x1 table 100
ip route add default dev wg0 table 100
Iš karto kyla dvi pasekmės. Programinės įrangos atnaujinimo programa, kuri jungiasi prie TCP 443, gauna tokį patį traktavimą kaip naršyklė, ir tai gali būti gerai, o gali būti sutrikimas, laukiantis kito atnaujinimo ciklo. O žiniatinklio paslauga, sąmoningai paskelbta kitame prievade, tarkim 8443, visiškai iškrenta iš taisyklės, nors tai vis dar tas žiniatinklio srautas, kuris rūpėjo vartotojui.
Skaičiai yra teisėti parinkikliai, kai reikalavimas tikrai apie tuos prievadus. Jie tampa fikcija, kai biliete parašyta „naršyklė“, o taisyklių rinkinyje įgyvendintas prievadų diapazonas. Šis atotrūkis nėra dokumentacijos smulkmena. Tai skirtumas tarp taisyklės, kurią galite apginti peržiūroje, ir tokios, kurios niekas negali išbandyti.
HTTP/3 tyliai palieka jūsų TCP taisyklę
HTTP/3 veikia per QUIC, o QUIC perduodamas UDP. Taisyklė, atitinkanti tik TCP, negali jo pamatyti, todėl ta pati naršyklė, kuri praeina jūsų bandymo puslapį, gali vėlesnę užklausą išsiųsti per UDP ir apeiti tunelį, niekam nepakeitus nustatymo. RFC 9114 aprašo HTTP/3 kaip QUIC pagrįstą protokolą, o QUIC naudoja UDP su numatytuoju prievadu 443 įprastame diegime.
Ar tam tikra naršyklė bandys HTTP/3, priklauso nuo jos konfigūracijos, svetainės ir nuo to, ar ankstesnis bandymas pavyko. Todėl apie tai bloga samprotauti iš atminties. Paklauskite įrankio:
curl --http3 -sS -o /dev/null -w '%{http_version} %{time_total}\n' https://example.com
ss -tunp | grep -E ':443\b'
curl eilutė išveda suderėtą versiją, todėl 3 patvirtina, kad buvo naudojamas UDP kelias. Tada lizdų sąrašas parodo, ar ta jungtis susieta su tunelio sąsaja, ar su fizine. Jei jūsų curl rinkinyje HTTP/3 nėra, vėliavėlė garsiai nepavyksta, o ne tyliai atsitraukia, ir tai yra jos pačios maža malonė.
DNS yra atskiras sprendimas, kurį turite priimti
Žiniatinklio srauto prievado taisyklė nieko nesako apie vardų sprendimą. Naršyklė gali naudoti sistemos sprendiklį, naršyklės viduje sukonfigūruotą sprendiklį arba tą, kurį įstūmė paskutinė jungtis. Kiekvienas jų gali siųsti užklausas kitu keliu nei tas, kurį pasirenka jūsų taisyklė, ir tai sukuria klasikinį skilimą: puslapis įkeliamas, vardas išsprendžiamas ten, kur nesitikėjote, o vidinė svetainė išsprendžiama į viešą adresą arba visai neišsprendžiama.
Nuspręskite tai aiškiai. Jei vidiniai vardai turi būti sprendžiami per tunelį, sprendiklis turi būti jo viduje, o taisyklių rinkinys turi leisti DNS į tą sprendiklį, laikydamas kitas užklausas lauke. Jei naršyklė naudoja DNS over HTTPS viešajam teikėjui, užklausa visiškai apeina jūsų sprendiklį ir prievado taisyklė negali padėti. Įrašykite pasirinkimą į tą patį pakeitimo įrašą kaip ir maršrutizavimo taisyklę, nes abu kartu skaito tas, kas derins kitą gedimą.
Tada patikrinkite sprendikliu, o ne puslapiu:
resolvectl query intranet.example.internal
resolvectl status | grep -A3 'Current DNS Server'
Trūkstamas atsakymas yra sprendimo problema net tada, kai naršyklės klaidos pranešimas kaltina tinklą. Šie du gedimai vartotojui atrodo vienodai ir yra visiškai skirtingi bilietai.
Trys ribos, trys skirtingi mechanizmai
Didžioji dalis sumaišties išnyksta, kai įvardijate norimą ribą. Jos nėra keičiamos, ir kiekviena turi skirtingą gedimo režimą tuneliui nutrūkus.
| What you actually want | Mechanism that fits | What it does not cover |
|---|---|---|
| These transport ports use this exit | Firewall mark plus policy route | Applications, HTTP/3 over UDP, DNS |
| This browsing session stays separate | Application-aware VPN, or a separate network namespace plus a proxy | Other applications in the same session |
| Only these private sites are reachable | Destination-based routes with private DNS | Public sites on the same address family |
Atskiras naršyklės profilis yra vidurinės eilutės spąstai. Jis atskiria slapukus ir istoriją ir nieko nekeičia pagrindinio kompiuterio maršrutizavimo lentelėje, todėl abu profiliai eina tuo pačiu keliu. Izoliacijai reikia kažko, ką primeta branduolys, tai yra vardų erdvė, konteineris arba programa, turinti savo tunelio sąsają.
Kuri eilutė bebūtų taikoma, užrašykite, kas turi įvykti, kai tunelis krinta. Žyme pagrįstas maršrutas, kuris išnyksta su sąsaja, paprastai grįžta prie fizinio numatytojo maršruto, o tai yra fail-open elgsena. Tai gali būti priimtina naršymui ir nepriimtina viskam kitam, ir tai sprendimas, o ne įgyvendinimo detalė.
Išbandykite srautus, kuriuos teigiate apimantys
Priėmimo testas turi sekti jūsų užrašytą ribą, o ne patogius prievadų numerius. Pasirinkite vieną srautą, kuris turi eiti per tunelį, vieną, kuris neturi, ir vieną, kuris naudoja transportą, apie kurį negalvojote:
ip route get 203.0.113.40
curl -sS -o /dev/null -w 'v4 %{http_version} %{remote_ip}\n' https://example.com
nft list ruleset | grep -A2 'dport'
Maršruto užklausa pasako, kurią sąsają paskirties taškas iš tikrųjų naudoja, ir tai yra faktas, kurį dauguma ataskaitų nurodo neteisingai. curl eilutė patvirtina suderėtą versiją ir adresų šeimą. Taisyklių rinkinio išvedimas pagauna taisyklę, kurią pridėjote testuodami ir pamiršote apriboti, ir taip laikina žymė virsta nuolatiniu fail-open maršrutizavimu.
Užfiksuokite visus tris išvestis su laiko žyma ir saugokite jas kartu su pakeitimu. Kai vėliau kas nors praneš, kad „VPN sugadino intranetą“, skirtumas tarp numatytos ir įgyvendintos ribos bus matomas tame įraše, o pataisa bus taisyklės pakeitimas, o ne ginčas.