Pieprasījums vienmēr ir viena un tā paša teikuma variants: paturi VPN pārlūkošanai, bet ļauj SSH vai dublēšanas uzdevumam izmantot parasto savienojumu. Šajā jautājumā izplatītais padoms, pāradresēt portu ar iptables NAT noteikumiem, to nedara. NAT noteikums pārraksta adreses un portus plūsmas iekšienē; tas nekad neizvēlas, pa kuru saskarni pakete iziet. Šis lēmums pieder maršruta meklēšanai, un maršruta meklēšanai vajadzīga palīdzība, lai ieraudzītu portu.

Kāpēc vienkāršs maršruts nevar atbilst portam

Linux izvēlas maršrutu, meklējot galamērķa adresi tabulā, pēc tam kad kandidāttabulas ir izfiltrētas ar politikas noteikumiem. Šie noteikumi var atbilst ugunsmūra atzīmei, avota adresei, ienākošajai saskarnei vai UID. Pašam maršruta ierakstam nav porta lauka, jo maršruts tiek izvēlēts pirms tam, kad transporta galvene sāk būt svarīga.

Mūsdienu iproute2 un kodoli paplašina noteikuma atlasītāju: ipproto, sport un dport tiek pieņemti, tāpēc ip rule add ipproto tcp dport 22 table 100 izsaka nodomu vienā rindā. Palaidiet ip rule add help īstajā resursdatorā, lai redzētu, vai jūsu būvējums uzskaita dport. Ja uzskaita, esat pabeidzis ar vienu komandu; ja ne, tālāk aprakstītais atzīmes ceļš ir līdzvērtīgs.

Lai kā būtu, noteikums ir tikai rādītājs. 100. tabulai joprojām vajadzīgs maršruts, un tieši šo daļu cilvēki aizmirst.

Trīs daļas vai viena

Mūsdienu forma ir iepriekš minētais vienīgais noteikums plus maršruts alternatīvajā tabulā. Klasiskā forma pa vidu pievieno netfilter: atzīmē paketi, pēc tam saskaņo atzīmi noteikumā. Abas beidzas ar to pašu meklēšanu; tās atšķiras ar to, kur tiek lasīts ports.

Atzīmes pieeja pastāv tāpēc, ka netfilter redz transporta galveni, bet maršrutēšanas kods vēsturiski to neredzēja. Tas ir viss mehānisms, un tas izskaidro, kāpēc rezerves variants ir trīs sadarbojošās daļas, nevis viena gudra komanda.

Trīs daļas secībā

Vispirms atzīmējiet plūsmas, kuras vēlaties novirzīt, ķēdē, kas darbojas pietiekami agri, lai atzīme pastāvētu pirms maršruta lēmuma:

nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1

Otrkārt, sūtiet atzīmētās paketes uz atsevišķu tabulu:

ip rule add fwmark 0x1/0x1 table 100

Treškārt, dodiet šai tabulai noklusējuma maršrutu caur fizisko saiti. Adreses ir ilustratīvas; ievietojiet savas:

ip route add default via 192.168.1.1 dev wlan0 table 100

Izlaidiet trešo soli, un atzīmētā pakete 100. tabulā neatradīs maršrutu, tāpēc tā neizdosies. Simptoms izskatās tā, it kā noteikums būtu salauzis tīklu, lai gan patiesībā tas noņēma vienīgo ceļu, kas paketei vēl bija palicis.

Kas to notur darbā pēc pirmās paketes

Atzīmes attiecas uz izejošām paketēm. Atbilde ierodas fiziskajā saskarnē ar adresi, ko piešķīra šī saite, un galvenā tabula joprojām var dot priekšroku tunelim šim galamērķim. Divi mehānismi notur atbildes ceļu konsekventu: avota balstīts noteikums saites adresei un savienojumu izsekošana, kas saglabā lēmumu visu plūsmas mūžu. Atzīmes saglabāšana conntrack un atjaunošana atbildē ir ierastais veids, kā padarīt stāvokļa izņēmumu stabilu.

Apgrieztā ceļa filtrēšana ir otrs klusais slepkava. Ja kodols stingri pārbauda atgriešanās ceļu un atbilde ierodas saskarnē, kuru galvenā tabula neizvēlētos, pakete tiek izmesta bez jebkāda ziņojuma. rp_filter noklusējuma vērtības atšķiras atkarībā no distribūcijas un no tā, vai saskarne tiek pārsūtīta, tāpēc lasiet faktisko vērtību, nevis pieņemiet, ka tā ir izslēgta.

Neatzīmējiet paša tuneļa transportu. WireGuard vai UDP OpenVPN tunelis nav TCP 22, tāpēc iepriekš minētā recepte ir droša, bet izņēmums, kas rakstīts kā viss, izņemot tuneļa galamērķi, var noķert šifrētās paketes un salauzt tuneli tā, ka tas izskatās pēc maršrutēšanas cilpas.

Pārbaudiet, nevis pieņemiet

Pajautājiet kodolam, kuru ceļu tas izvēlētos, galamērķim un portam, pēc tam palaidiet īsto pārraidi:

ip route get 203.0.113.10
ip rule show
nft list ruleset

Ja atzīme ir, bet skaitītāji nekad nekustas, noteikums neatbilst. Skaitītāji ir atšķirība starp konfigurāciju, ko uzrakstījāt, un politiku, ko kodols piemēro.

Kad šis ir nepareizais rīks

Uz portu balstīti izņēmumi pēc būtības ir trausli. Pakalpojumi maina portus, HTTP/3 nāk kā UDP 443, un viena lietojumprogramma var atvērt vairākas dažāda veida plūsmas. Ja īstā prasība ir, lai šī programma izmantotu parasto saiti, maršrutēšanas slānis ir nepareizā vieta; tīkla nosaukumtelpa vai starpniekserveris katrai programmai der labāk.

Ja prasība ir, lai šis apakštīkls izmantotu parasto saiti, pilnībā izlaidiet atzīmes un pievienojiet konkrētāku maršrutu. Tas ir vienkāršāk, redzams vienā tabulā, un nākamā persona to var auditēt, nelasot noteikumu kopumu.

Pierakstiet, kura no trim prasībām jums patiešām ir, pirms aiztiecat ugunsmūri. Iepriekš aprakstītais mehānisms ir precīzs, un nepareizajā slānī pielietota precizitāte ir tikai ilgāks pārtraukums.

Saistītie raksti