Publicējiet VPN klienta portu aiz CGNAT: kontrolsaraksts
Tikai galamērķa NAT noteikums dod puslīdz atvērtus savienojumus. Nofiksējiet tuneļa adresi, tulkojiet abos virzienos un pirms testēšanas apstipriniet atbildes ceļu.
Ievietojiet pakalpojumu portatīvajā datorā aiz operatora līmeņa NAT, novirziet šo datoru uz VPS caur VPN, un neviens no ārpuses to nevar sasniegt. Pievienojat galamērķa NAT noteikumu VPS un iegūstat ko sliktāku par klusumu: savienojumi atveras un pēc tam iestājas. Atbilde nav pazudusi, tā iziet pa paša klienta noklusēto maršrutu, kas nozīmē, ka serveris to nekad neredz. Veiciet šīs piecas pārbaudes secīgi un apstājieties pie pirmās, kas neiztur.
Apstipriniet, ka serveris vispār pārsūtīs
Atzīmējiet šo rūtiņu, pirms rakstāt kaut vienu tulkojumu. Noteikumu parseris pieņem DNAT noteikumu paketei, kuru kodols atsakās pārsūtīt, un pēc tam to izmet pārsūtīšanas ceļš, kas rada taimautu, kurš izskatās kā ugunsmūra problēma.
sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1
Iestatīt to darbojošā kodolā nav tas pats, kas iestatīt to pāri pārstartēšanai. Ierakstiet net.ipv4.ip_forward=1 failā zem /etc/sysctl.d/, palaidiet sysctl --system un pēc tam nolasiet vērtību atpakaļ, tā vietā lai paļautos, ka fails tika paņemts. Konteineram, kas pārvalda savu tīkla vārdu telpu, vajag to pašu vērtību šajā telpā, ne tikai uz saimniekdatora.
Ja nolasījums joprojām ir nulle, apstājieties šeit. Nekas tālāk nedarbosies.
Nofiksējiet tuneļa adresi, pirms kāds noteikums uz to atsaucas
Pūls izdala adreses savienojumu secībā, tāpēc noteikums, kas rakstīts šodienas nomai, nākamnedēļ var klusi norādīt uz citu klientu. Saistiet adresi ar sertifikāta identitāti, nevis ar ierašanās secību.
client-config-dir /etc/openvpn/ccd
ifconfig-push 10.77.0.14 10.77.0.13
Šis pāris ir punkts-punktā tuneļa klienta gals un partnera gals, un serveris ir piesaistīts sertifikāta kopējam nosaukumam. Apakštīkla topoloģijā otro vērtību tā vietā nolasa kā tīkla masku, tāpēc rakstiet formu, kas atbilst izmantotajai topoloģijai. Pēc tam no jauna pievienojiet klientu un nolasiet adresi pašā klientā, jo servera skatījums uz pūlu nav pierādījums tam, ko klients konfigurēja.
Ja adrese pēc atkārtotas pievienošanās mainās, apstājieties. NAT noteikums, kas seko kustīgam mērķim, laiku pa laikam neizdosies un neko jums neiemācīs.
Tulkojiet abos virzienos
Galamērķa tulkojums nosūta ienākošo paketi klientam. Tieši avota tulkojums liek klientam atbildēt serverim, nevis sākotnējam sūtītājam, un tas ir noteikums, ko cilvēki izlaiž.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 29443 -j DNAT --to-destination 10.77.0.14:29443
iptables -t nat -A POSTROUTING -d 10.77.0.14 -p tcp --dport 29443 -j SNAT --to-source 10.77.0.13
Bez otrā noteikuma klients atbild pa savu ISP augšupējo līniju, tāpēc attālinātais partneris redz avota adresi, ar kuru nekad nav runājis, bet serverim nav neviena izsekošanas ieraksta atbildei. Ārējais novērotājs redz roku paspiešanu, kas pabeidzas uz pusi, un tas ir tieši tas simptoms, kas sūta cilvēkus meklēt ugunsmūra kļūdu, kuras nav.
Nolasiet abus noteikumus atpakaļ ar iptables -t nat -S un apstipriniet, ka saskarnes nosaukums ir tas, kas nes publisko adresi. Saimniekdatorā, kas jau filtrē ar nftables, rakstiet tulkojumu atbilstošās adrešu saimes nftables NAT ķēdē, nevis jaucot rīkus.
Palaižiet filtru tabulu cauri
NAT tabulas pārraksta galvenes; tās nepiešķir atļauju. Ar noklusēto DROP politiku pārsūtītajai plūsmai vajag savu atļauju, plus atgriešanās virzienu, ko lielākā daļa politiku jau nosedz ar established,related noteikumu.
iptables -A FORWARD -i eth0 -o tun0 -p tcp --dport 29443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Pārbaudiet FORWARD ķēdes politiku, pirms kaut ko pievienojat, jo agras DROP secība izšķir, vai jūsu noteikums vispār tiks izskatīts. Saimniekdatorā, kura filtrēšana dzīvo nftables, pievienojiet līdzvērtīgu noteikumu inet tabulas forward āķim un apstipriniet, ka bāzes ķēde tiešām redz pārsūtīto satiksmi, ne tikai lokālo ievadi. Ja jaunā noteikuma pakešu skaitītājs paliek nullē, kamēr NAT skaitītāji aug, pakete tiek izmesta pirms jūsu noteikuma. Tas ir signāls lasīt ķēžu secību, nevis pievienot otru tā paša noteikuma kopiju.
Pierādiet to no ārējā tīkla
Testējiet no nesaistīta tīkla. Pārbaude no citas mašīnas tajā pašā LAN var iziet caur hairpin NAT atbalstu un nekad neizmēģina ceļu, ko izmanto attālināts klients, tāpēc zaļš rezultāts tur pierāda nepareizo lietu.
tcpdump -ni any port 29443
conntrack -L | grep 29443
Palaidiet uztveršanu serverī un klientā vienlaikus. Servera uztveršana parāda, vai tulkotā pakete iziet uz tuneli; klienta uztveršana parāda, vai pieprasījums pienāk un kur adresēta atbilde. Tulkojuma ieraksts conntrack -L pierāda, ka noteikums sakrita, un tā neesamība pierāda, ka pakete nekad nesasniedza NAT ķēdi.
Portu skeneri ir vājš pierādījums. Tie ziņo portu kā aizvērtu, līdz lietojumprogramma ir piesaistīta un klausās, tāpēc izmantojiet reālu savienojumu ar reālu pakalpojumu. Kad tas beidzot strādā, turiet iedarbību uz šo vienu portu: pārsūtīt SSH vai administrācijas paneli tāpēc, ka pirmais noteikums šķita neērts, ir daudz lielāks lēmums nekā publicēt pakalpojumu.