Nieko lizde nėra, kas atsimintų, kuri sąsaja pernešė užklausą, todėl viso tunelio VPN numatytasis maršrutas gali pagauti atsakymą, kuris priklauso WAN. Tarnyba neignoruoja įeinančios sąsajos; Linux maršrutizuoja vietoje sukurtą atsakymą pagal paskirties vietą ir šaltinio politiką. Šaltiniu pagrįsta taisyklė gali siųsti tik tarnybos atsakymus per visą WAN lentelę, o įprastą išėjimą palikti tunelyje. Prievadas lieka atidarytas, kol atsakymas išeina neteisingu keliu, todėl simptomas atrodo vienpusis.

Klaidingas supratimas: atsakymai seka sąsają, kuria atėjo

Atrodo logiška, kad paketas, atėjęs per eth0, turėtų išeiti per eth0. Būsenos neturintys paketų filtrai gali būti taip parašyti, o tcpdump įėjimo pusėje rodo užklausą būtent ten, kur tikimasi. Maršrutizavimas taip neveikia srauto, kurį sukuria pats mazgas.

Kai tarnyba priima ryšį, jos atsakymas yra naujas vietoje sukurtas paketas. Branduolys tikrina maršrutizavimo taisykles atsakymo paskirties vietai ir šaltiniui, o numatytasis VPN maršrutas yra visiškai galiojantis atsakymas. Nieko lizde nėra, kas atsimintų, kuri sąsaja pernešė užklausą.

Todėl simptomas atrodo vienpusis: užklausos ateina, atsakymai dingsta. Todėl ir ugniasienės taisyklės įėjimo prievadui pridėjimas nieko nekeičia. Paketas nestabdomas kelyje į vidų; jis maršrutizuojamas kitur kelyje į išorę. Sekite atsakymą šaltiniu kvalifikuota paieška, ir aplinkkelis taps matomas.

Ką branduolys iš tikrųjų maršrutizuoja: šaltinio adresą

Reikalinga rankena yra vietinis adresas, kurį tarnyba naudoja atsakymams. Mazge, kurio iliustracinis eth0 adresas yra 192.0.2.10/24, o šliuzas 192.0.2.1, tas adresas yra sąsajoje. Debesų VM viešasis adresas gali būti aukščiau išverstas ir svečiame jo nebelikti, todėl naudokite adresą, kurį mazgas iš tikrųjų turi.

Patikrinkite dabartinę būseną prieš rezervuodami lentelės numerį ar taisyklės prioritetą. Esamos politikos taisyklės gali užgožti naują, o sena lentelė su tuo pačiu numeriu jau gali turėti nesusijusių maršrutų:

ip -4 addr show dev eth0
ip -4 rule show
ip -4 route show table all

Tada pasirinkite lentelę pagal šaltinį. Taisyklė atitinka atsakymus, kurie jau turi 192.0.2.10, būtent vietoje užbaigtą srautą, kurį norite atleisti. Persiunčiamas srautas ir paketai iš kitų vietinių adresų neatitinka.

Sukurkite visą grąžinimo lentelę, o ne pusę numatytojo maršruto

Lentelės su vien tik numatytuoju maršrutu nepakanka. Branduolys vis tiek turi išspręsti šliuzą, o tam reikia prijungto prefikso toje pačioje lentelėje. Lentelė, kurioje trūksta šio prefikso, nepavyksta sprendžiant šliuzą, net kai jos numatytasis maršrutas atrodo teisingas. Pridėkite abu, tada nukreipkite šaltinio taisyklę į lentelę:

ip -4 route add table 100 192.0.2.0/24 dev eth0 src 192.0.2.10
ip -4 route add table 100 default via 192.0.2.1 dev eth0
ip -4 rule add priority 1000 from 192.0.2.10/32 lookup 100

Naudokite tikrą prefiksą ir šliuzą, o ne kopijuokite pavyzdį. Debesų sąsaja, sukonfigūruota kaip /32 su on-link šliuzu, reikalauja kito prijungto maršruto, o lentelė, sukurta iš neteisingo prefikso, nepavyksta pirmame šuolyje. Atributas src nurodo pageidaujamą to maršruto šaltinį; jis nepakeičia šaltinio taisyklės.

Tvarka taip pat svarbi. Plati taisyklė su mažesniu prioriteto numeriu vertinama pirmiausia, todėl šaltinio taisyklę reikia pasiekti prieš bet kurią taisyklę, kuri grąžintų šį srautą į pagrindinę lentelę. Patikrinkite prioritetus su ip rule show po pridėjimo, ne tik paleidimo metu.

Patikrinkite šaltiniu kvalifikuota paieška

Paprašykite branduolio maršrutizuoti bandomąją paskirties vietą iš tarnybos adreso. Atsakymas turėtų įvardyti eth0 ir WAN šliuzą, o ne tunelį:

ip -4 route get 198.51.100.25 from 192.0.2.10

Tada sukurkite naują autorizuotą ryšį ir stebėkite abi kryptis. Paieška, kuri pasirenka teisingą lentelę, kol gyvas ryšys vis dar nepavyksta, nurodo atvirkštinio kelio filtravimą arba ugniasienės taisyklę, o ne lentelę. Patikrinkite tas kontrolės priemones prieš ką nors išjungdami globaliai.

Padėkite galutinius maršrutus ir taisyklę po tinklo tvarkykle, kuriai priklauso sąsaja. Adresų pokyčiai, DHCP atnaujinimas ir VPN prisijungimai iš naujo perrašo branduolio būseną, o ranka pridėta taisyklė dingsta arba rodo į pasenusį šliuzą po kito įvykio.

Kur ši išimtis baigiasi

Taisyklė atleidžia vietoje užbaigtą srautą iš vieno šaltinio adreso. Ji neapima Docker paskelbtų prievadų, DNAT ar tarnybų, persiunčiamų per mazgą, nes tie paketai maršrutizuojami kaip persiunčiamas srautas ir niekada neturi mazgo vietinio šaltinio tokiu pačiu būdu. Tokie sprendimai paprastai reikalauja žymės, uždėtos įėjime, ir taisyklės, atitinkančios žymę.

Ji taip pat nepadaro, kad mazgo viešasis adresas atsirastų sąsajoje. Kai aukštesnis NAT valdo tą adresą, atsakymas vis tiek turi išeiti keliu, kurio tas NAT tikisi, todėl WAN lentelė turi atspindėti pirminį šliuzą ir prefiksą, o ne spėjamą viešą diapazoną.

Laikykite išimtį dokumentuotą su lentelės numeriu, taisyklės prioritetu ir tiksliu šaltinio adresu. Kitas VPN ar sąsajos pakeitimas gali ją tyliai sulaužyti, o pastaba, įvardijanti tris reikšmes, patikrinama greičiau nei simptomo atradimas iš naujo kliento ataskaitoje.

Jei tarnyba vis dar atsako neteisingu keliu po to, kai šaltiniu kvalifikuota paieška pavyksta, palyginkite gyvo lizdo šaltinio adresą su nurodytu taisyklėje. Tarnyba, susieta su pakaitos adresu, gali pasirinkti kitą šaltinį nei testuotas adresas, ir tas neatitikimas yra likusi spraga.

Susiję straipsniai