Maršrutas atmestas dėl hosto bitų? Raskite numatytą priešdėlį
Atmesta maršruto eilutė paprastai būna dėl hosto bitų, o ne persiuntimo problemos. Nustatykite numatytą priešdėlį, užuot platindami kaukę, kol ji bus priimta.
Jūsų maršruto eilutė grįžta atmesta, o rastas patarimas sako įjungti IP persiuntimą. Šie du dalykai yra skirtingose problemos stadijose. Persiuntimas nusprendžia, ar hostas gali perkelti paketus tarp sąsajų; jis neturi nuomonės, ar įvestas tikslas yra galiojantis tinklas. Pirmiausia pataisykite priešdėlį, nes persiuntimas neišgelbės nesutariančio adreso ir kaukės.
Dėl ko analizatorius iš tikrųjų skundžiasi
Tikslas, parašytas kaip adresas plius kaukė, turi apibūdinti tinklą, o tinklas prasideda nuliais užpildytais hosto bitais. Kai pateiktas adresas vis dar turi reikšmę hosto dalyje, pora yra viduje prieštaringa: 172.20.130.0 atrodo tvarkingai, nes baigiasi nuliu, bet nulis ketvirtame oktete nėra vienintelis svarbus dalykas. Čia bereikalingus bitus laiko būtent trečias oktetas.
Įrankiai šį prieštaravimą sprendžia skirtingai. Griežti analizatoriai atmeta eilutę ir įvardija hosto bitus. Švelnūs analizatoriai užmaskuoja adresą ir įdiegia tai, ko neprašėte, o tai blogiau, nes konfigūracija dabar maršrutizuoja diapazoną, kurio niekada nenorėjote. Python ipaddress modulis siūlo pasirinkimą tiesiogiai: griežtas tinklo analizavimas išmeta klaidą, o strict=False užmaskuoja hosto bitus. Jūsų klientas gali būti griežtas, švelnus arba nenuoseklus tarp versijų, todėl skaitykite pranešimą, o ne pasitikėkite įpročiu.
Išnagrinėkite pavyzdį ranka
Paimkite tunelį, kuris turi pasiekti 172.20.130.0 su /20 kauke. /20 pasiskolina keturis bitus iš trečio okteto, todėl tas oktetas skaičiuojamas tik 16 žingsniais: 0, 16, 32 ir toliau iki 240. Reikšmė 130 patenka tarp 128 ir 143, vadinasi, apimantis tinklas prasideda 172.20.128.0, o ne 172.20.130.0 su nunulintu paskutiniu oktetu.
Užrašius, blokas eina nuo 172.20.128.0 iki 172.20.143.255 ir talpina 4,096 adresus. Tų pačių reikšmių perdavimas negriežtam analizatoriui parodo pakeitimą, kurį jis būtų atlikęs už jus:
$ python3 -c "import ipaddress; n=ipaddress.ip_network('172.20.130.0/20', strict=False); print(n, n.num_addresses)"
172.20.128.0/20 4096Nuspręskite, kokio tikslo iš tikrųjų norėjote
Atmesta eilutė paprastai slepia vieną iš trijų ketinimų, ir pasirinkti galite tik jūs. Jei tuneliui reikia viso bloko, rašykite 172.20.128.0/20, kanoninį tinklo adresą. Jei tuneliui reikia tik 130 segmento, kaukė buvo neteisinga ir 172.20.130.0/24 yra sąžininga forma. Jei tikslas yra viena mašina, IPv4 hosto maršrutas yra /32 ir jokia kaukės aritmetika nenaudojama.
Kiekvienas jų leidžia skirtingą srauto kiekį, ir tai yra tikroji priežastis neplatinti kaukės, kol skundas nesiliaus. /16 priima eilutę beveik visur ir siunčia srautą į tikslus, kurių niekada nenorėjote maršrutizuoti per tunelį. Parašykite siauriausią ketinimą atitinkantį priešdėlį, tada patvirtinkite jį su numatomas kitu šuoliu, o ne su analizatoriaus tyla.
Kodėl persiuntimas niekada nebuvo sprendimas
Atmestas maršrutas niekada nepasiekia persiuntimo kelio, todėl net.ipv4.ip_forward perjungimas negali pakeisti rezultato. Šis nustatymas svarbus vėliau, kai hostas turi perduoti paketus tarp sąsajų, o įjungus jį prieš lentelę esant teisingai, keičiasi tik tai, kuri stadija nepavyks toliau.
Tame pačiame taške dažnai kaltinami dar du dalykai. Maršrutas gali būti priimtas ir vis tiek pralaimėti konkretesniam maršrutui, o ugniasienės taisyklė gali numesti srautą po teisingos paieškos. Laikykite stadijas atskirai: sintaksė, diegimas, atranka, filtravimas. Darbas ne toje stadijoje atrodo produktyvus, nes kiekvienas pakeitimas ką nors paleidžia iš naujo.
Patikrinkite įdiegtą maršrutą ir kelią, kurį jis laimi
Kai klientas priima eilutę, pažiūrėkite, ką jis įdiegė ir kurį maršrutą branduolys pasirenka reprezentaciniam adresui bloko viduje. Jei įdiegtas priešdėlis skiriasi nuo parašytojo, už jus veikė normalizatorius.
Klauskite nario adreso ir vieno už bloko ribų, kad palyginimas būtų prasmingas, o ne viena raminanti eilutė:
ip -4 route show 172.20.128.0/20
ip -4 route get 172.20.140.10
ip -4 route get 172.20.200.10Trečioji užklausa turėtų kristi už tunelio, jei jūsų priešdėlis teisingas, o jei ne, pastatytas maršrutas platesnis, nei manote. Užsirašykite, ką priešdėlis turėjo aprėpti, prieš liedami kitą nustatymą, nes analizuojamas maršrutas ir veikiantis kelias lieka atskiri stebėjimai.