Nešiojamasis kompiuteris per Ethernet yra biuro /24 tinkle ir kartu prisijungia prie OpenVPN serverio, kuris gyvena tame pačiame /24. Kolega pingina tunelio adresą; užklausa aiškiai atvyksta, o niekas negrįžta. Tunelio žurnalas švarus, o naršymas dar veikia, tad tunelis yra netinkamas įtariamasis. IPv4 šaltinio tikrinimas priimančiame kompiuteryje išmeta paketą dar prieš ką nors jį perskaitant.

Išmetimas įvyksta dar prieš ką nors perskaitant paketą

Šaltinio tikrinimas užduoda vieną klausimą apie kiekvieną įeinantį paketą: jei šis kompiuteris atsakytų tam šaltiniui, ar atsakymas išeitų per sąsają, kuria paketas ką tik atvyko? Kai atsakymas ne, branduolys paketą išmeta jį gavęs. Joks lizdas ir joks persiuntimo kelias jo niekada nemato, todėl tunelio įrašas vis dar užfiksuoja užklausą, kurios programa niekada negauna.

Klientas čia laiko 10.66.0.9 savo tunelyje, o OpenVPN serveris atsako iš 192.168.80.10 biuro prefikso viduje. Kolega iš 192.168.80.25 pingina tunelio adresą, tad užklausa kerta vietinį tinklą, serveris nukreipia ją į tunelį, ir ji atvyksta į kliento tunelio sąsają su biuro šaltinio adresu. Tos mašinos maršrutų lentelėje biuro prefiksas priklauso Ethernet įrenginiui, o ne tuneliui. Tikrinimas palygina atvykimo sąsają su maršrutu, randa neatitikimą ir išmeta paketą, tad kolega mato visišką nuostolį, o abu galai praneša apie sveiką tunelį.

Veidrodinė kryptis turi tą pačią formą: kai klientas pradeda link biuro, atsakymai gali būti išmetami biuro pusėje dėl tos pačios priežasties. Taisymas, patikrintas tik viena kryptimi, paprastai grįžta kaip antras bilietas.

Įrodykite veikiantį režimą prieš liesdami bet kurį sysctl

Skaitikite faktines reikšmes, o ne pasitikėkite distribucijos numatytąja, nes sąsajos nustatymas yra tik pusė sprendimo. Veikiantis režimas yra didesnysis iš sąsajos vertės ir all vertės, tad nulis tunelio sąsajoje nieko nereiškia, kol all yra vienas. Griežto režimo sprendimas yra maršrutizavimo sprendimas, tad paleiskite paiešką, kurią paleidžia branduolys, ir palyginkite jos atsakymą su sąsaja, kuria paketas tikrai atvyko.

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

Tada pakartokite pingą stebėdami klaidų skaitiklį. Skaitiklis, kuris kyla šalia užklausos, kurią įrašas jau rodo, yra šio išmetimo parašas, o ne trūkstamo maršruto. Įjunkite marsiečių paketų žurnalą, kol ten esate, kad branduolys įvardytų atmestą šaltinį ir sąsają. Kartu jie atmeta šifrą, užkardą ir trūkstamą iroute kaip paaiškinimus.

Užrašykite pradinę būseną prieš ką nors keisdami: abi vertes, įrenginį, kurį pasirinko paieška, ir skaitiklį, kurį stebėjote. Būtent šis įrašas vėliau pasakys, ar pakeitimas padarė tai, ką manote.

Ką iš tikrųjų priima kiekvienas rp_filter režimas

Branduolys rodo tris vertes kiekvienai sąsajai, ir tai nėra trys vienos taisyklės atspalviai. Nulis išjungia tikrinimą. Vienas yra griežtas ir reikalauja, kad šaltinis būtų maršrutizuojamas atgal per atvykimo sąsają. Du yra laisvas ir reikalauja tik, kad lentelėje egzistuotų koks nors maršrutas į šaltinį, kur jis bežiūrėtų.

ValueNameAcceptsStill rejects
0offany source at allnothing on this check
1stricta source routed back out the arrival interfacea source whose route points elsewhere
2loosea source with any route in the tablea source with no route at all

Čia svarbi eilutė yra laisvoji, ir tai, ką ji tebedmeta. Suklastotas šaltinis, kuris maršrutizuojamas bet kur jūsų lentelėje, praeina, o šaltinis be jokio maršruto vis dar atmetamas. Nešiojamajame tai siaura nuolaida; maršrutizatoriuje, kuris persiunčia kitų žmonių srautą, ji plati. Režimas priklauso kompiuteriui, tad tas pats skaičius dviejose vietose turi skirtingą svorį.

Kuri eilutė reikalinga šiai topologijai, išplaukia iš lentelės, o ne iš įpročio. Paketas yra teisėtas ir jo šaltinis maršrutizuojamas, tad laisvasis jį priima, o griežtasis ne. Niekas šioje byloje nereikalauja nulio, o nulio pasirinkimas pašalintų patikrinimą, kuris čia nieko nekainuoja.

Pasirinkite mažiausią pakeitimą, kuris pašalina dviprasmiškumą

Laisvasis režimas yra mažiausias tinkamas pakeitimas, ir tai yra tikras griežtumo sumažinimas, o ne nekenksmingas jungiklis. Geresnis variantas egzistuoja visada, kai topologija leidžia: pašalinkite persidengimą, ir dviprasmiškumas dingsta.

Kur biuro prefikso reikia tik per Ethernet, išimkite jį iš maršrutų, kuriuos traukia profilis, ir adresas taps pasiekiamas vienu keliu. Kai abu keliai tikrai turi egzistuoti kartu, prisekite šaltinį ir įrenginį politikos taisykle, o ne atlaisvinkite tikrinimą kiekvienoje sąsajoje. Tai išlaiko griežtą filtravimą viskam kitam mašinoje ir dokumentuoja išimtį ten, kur kitas inžinierius jos ieškos.

Kad ir kurį kelią pasirinktumėte, užrašykite jį sysctl drop-in faile, o ne gyvoje komandoje. Nustatykite all ir default raktus kartu, kad prisijungimas iš naujo negalėtų tyliai grąžinti griežto režimo.

# /etc/sysctl.d/99-rp-filter.conf
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
sysctl --system

Ko laisvasis režimas atsisako, ir kur

Laisvasis režimas vis dar atmeta šaltinį, kurio nepasiektų joks maršrutas, ir nustoja atmesti suklastotą šaltinį, kuris atsitiktinai yra maršrutizuojamas. Nešiojamajame tai siaura nuolaida. Įrenginyje, kuris persiunčia srautą, kuris jam nepriklauso, tas pats pasirinkimas yra daug platesnis. Todėl ta pati nuostata turi dvi labai skirtingas reikšmes, priklausomai nuo to, kur ji veikia.

Visiškai išjungti tikrinimą kompiuteryje, kuris persiunčia srautą kitiems žmonėms, yra vienintelis taisymas, kurio reikia vengti. Nulis išmeta tikrinimą, kurį laisvasis režimas rūpestingai saugo. Jei kompiuteris persiunčia už kitus, vietoj to ginkite ankstesnio skyriaus politikos taisyklės variantą.

Palikite pastabą, kurioje įvardytos dvi sąsajos, persidengiantis prefiksas ir tikslus bandymas, kuris dabar pavyksta. Tai naudingiau kitam inžinieriui nei eilutė, kad filtravimas buvo pakoreguotas.

Susiję straipsniai