Kāpēc VPN klients biroja lokālajā tīklā zaudē katru atbildi
Klēpjdators biroja lokālajā tīklā un tunelī tajā pašā apakštīklā atbild no nepareizās saskarnes. Vaļīga apgrieztā ceļa filtrēšana izskaidro šo klusumu.
Klēpjdators atrodas biroja /24 tīklā pa Ethernet un vienlaikus pievienojas OpenVPN serverim, kas dzīvo tajā pašā /24. Kolēģis pingē tuneļa adresi; pieprasījums skaidri pienāk, un nekas neatgriežas. Tuneļa žurnāls ir tīrs un pārlūkošana joprojām strādā, tāpēc tunelis ir nepareizais aizdomās turamais. IPv4 avota validācija uzņēmējā mašīnā izmet paku, pirms kaut kas to nolasa.
Iziešana notiek, pirms kaut kas nolasa paku
Avota validācija uzdod vienu jautājumu par katru ienākošo paku: ja šis resursdators atbildētu tam avotam, vai atbilde izietu pa to saskarni, pa kuru paka tikko ienāca? Kad atbilde ir nē, kodols paku izmet uzreiz pēc ienākšanas. Ne ligzda, ne pārsūtīšanas ceļš to nekad neredz, tāpēc tuneļa ieraksts joprojām fiksē pieprasījumu, ko lietojumprogramma nekad nesaņem.
Klients šeit tur 10.66.0.9 savā tunelī, un OpenVPN serveris atbild no 192.168.80.10 biroja prefiksa iekšienē. Kolēģis no 192.168.80.25 pingē tuneļa adresi, tāpēc pieprasījums šķērso lokālo tīklu, serveris to novirza tunelī, un tas ienāk klienta tuneļa saskarnē ar biroja avota adresi. Tās mašīnas maršrutēšanas tabulā biroja prefikss pieder Ethernet ierīcei, nevis tunelim. Validācija salīdzina ienākšanas saskarni ar maršrutu, atrod neatbilstību un izmet paku, tāpēc kolēģis redz pilnīgu zudumu, kamēr abi gali ziņo par veselīgu tuneli.
Spoguļvirzienam ir tāda pati forma: kad klients sāk uz biroju, atbildes var tikt izmestas biroja pusē tā paša iemesla dēļ. Labojums, kas pārbaudīts tikai vienā virzienā, parasti atgriežas kā otra biļete.
Pierādiet spēkā esošo režīmu, pirms aiztiecat jebkuru sysctl
Lasiet faktiskās vērtības, nevis paļaujieties uz distribūcijas noklusējumu, jo iestatījums katrai saskarnei ir tikai puse no lēmuma. Spēkā esošais režīms ir lielākais no saskarnes vērtības un all vērtības, tāpēc nulle tuneļa saskarnē neko nenozīmē, kamēr all ir viens. Stingrā režīma lēmums ir maršrutēšanas lēmums, tāpēc izpildiet meklēšanu, ko izpilda kodols, un salīdziniet tās atbildi ar saskarni, pa kuru paka patiešām ienāca.
tcpdump -ni tun0 icmp and host 192.168.80.25
ip route get 192.168.80.25
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.tun0.rp_filter
Pēc tam atkārtojiet ping, vērojot kļūdu skaitītāju. Skaitītājs, kas aug blakus pieprasījumam, ko ieraksts jau rāda, ir šīs izmešanas paraksts, nevis trūkstoša maršruta. Ieslēdziet marsiešu paku reģistrēšanu, kamēr esat tur, lai kodols nosauc noraidīto avotu un saskarni. Kopā tie izslēdz šifru, ugunsmūri un trūkstošu iroute kā izskaidrojumus.
Pierakstiet bāzes līniju, pirms kaut ko maināt: abas vērtības, ierīci, ko izvēlējās meklēšana, un skaitītāju, ko vērojāt. Tieši šis ieraksts vēlāk pateiks, vai izmaiņa izdarīja to, ko jūs domājat.
Ko katrs rp_filter režīms patiešām pieņem
Kodols parāda trīs vērtības katrai saskarnei, un tās nav viena noteikuma trīs nokrāsas. Nulle izslēdz pārbaudi. Viens ir stingrs un prasa, lai avots tiktu maršrutēts atpakaļ pa ienākšanas saskarni. Divi ir vaļīgs un prasa tikai, lai tabulā pastāvētu kāds maršruts uz avotu, kurp tas arī rādītu.
| Value | Name | Accepts | Still rejects |
|---|---|---|---|
| 0 | off | any source at all | nothing on this check |
| 1 | strict | a source routed back out the arrival interface | a source whose route points elsewhere |
| 2 | loose | a source with any route in the table | a source with no route at all |
Šeit svarīgā rinda ir vaļīgā, un tas, ko tā joprojām noraida. Viltots avots, kas ir maršrutējams jebkur jūsu tabulā, iziet cauri, kamēr avots bez jebkāda maršruta joprojām tiek noraidīts. Klēpjdatorā tā ir šaura piekāpšanās; maršrutētājā, kas pārsūta citu cilvēku datplūsmu, tā ir plaša. Režīms pieder resursdatoram, tāpēc tas pats skaitlis divās vietās nes atšķirīgu svaru.
Kura rinda šai topoloģijai vajadzīga, izriet no tabulas, nevis no ieraduma. Paka ir likumīga un tās avots ir maršrutējams, tāpēc vaļīgais to pieņem, bet stingrais ne. Nekas šajā lietā neprasa nulli, un nulles izvēle noņemtu pārbaudi, kas šeit neko nemaksā.
Izvēlieties mazāko izmaiņu, kas novērš neskaidrību
Vaļīgais režīms ir mazākā piemērotā izmaiņa, un tā ir īsta stingrības samazināšana, nevis nekaitīgs slēdzis. Labāks variants pastāv vienmēr, kad topoloģija atļauj: noņemiet pārklāšanos, un neskaidrība izzūd.
Kur biroja prefikss vajadzīgs tikai pa Ethernet, izņemiet to no maršrutiem, ko velk profils, un adrese kļūs sasniedzama pa vienu ceļu. Kad abiem ceļiem tiešām jāpastāv līdzās, piespraudiet avotu un ierīci ar politikas noteikumu, nevis atlaidiet validāciju katrā saskarnē. Tas saglabā stingru filtrēšanu visam pārējam mašīnā un dokumentē izņēmumu tur, kur nākamais inženieris to meklēs.
Lai kādu ceļu izvēlētos, ierakstiet to sysctl drop-in failā, nevis dzīvā komandā. Iestatiet atslēgas all un default kopā, lai atkārtota savienošana nevarētu klusi atjaunot stingro režīmu.
# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system
Ko vaļīgais režīms atsakās, un kur
Vaļīgais režīms joprojām noraida avotu, kuru nesasniegtu neviens maršruts, un pārstāj noraidīt viltotu avotu, kas nejauši ir maršrutējams. Klēpjdatorā tā ir šaura piekāpšanās. Ierīcē, kas pārsūta datplūsmu, kas tai nepieder, tā pati izvēle ir daudz plašāka. Tāpēc tas pats iestatījums nes divas ļoti atšķirīgas nozīmes atkarībā no tā, kur tas darbojas.
Pārbaudes pilnīga izslēgšana resursdatorā, kas pārsūta datplūsmu citu cilvēku labā, ir vienīgais labojums, no kura jāizvairās. Nulle izmet validāciju, ko vaļīgais režīms rūpīgi saglabā. Ja resursdators pārsūta citu labā, tā vietā aizstāviet iepriekšējās sadaļas politikas noteikuma variantu.
Atstājiet piezīmi, kas nosauc abas saskarnes, pārklājošos prefiksu un precīzo pārbaudi, kas tagad izdodas. Tas nākamajam inženierim ir noderīgāk nekā rinda, ka filtrēšana ir pielāgota.