Правіла маршрутызацыі чытае метку пакета, а не conntrack
Маршрутызацыя па палітыцы чытае метку пакета; conntrack захоўвае іншае значэнне з даўжэйшым жыццём. Капіраванне паміж імі — гэта крок, які хтосьці павінен напісаць.
Чатыры праверкі аддзяляюць працоўнае правіла меткі ад працоўнага маршруту: якую метку чытае правіла, ці яшчэ нясе яе пакет у момант пошуку, ці была метка злучэння адноўлена на наступных пакетах, і ці маска і прыярытэт адпаведнага правіла дазваляюць яму спрацаваць. Лічыльнік, які павялічваецца, даказвае толькі тое, што нейкае правіла супала з нечым. Ён нічога не кажа пра тое, што нёс пакет, калі ядро выбірала яго шлях.
Дзве меткі жывуць у розных месцах і сканчаюцца па розных графіках.
Дзве меткі, два жыцці
Метка пакета належыць аднаму skb, падарожнічае з ім праз хук і спажываецца селектарам fwmark маршрутызацыі па палітыцы. Метка злучэння належыць запісу conntrack, захоўваецца на ўсіх пакетах гэтага патоку і застаецца нябачнай для правіла маршрутызацыі, пакуль нешта не скапіруе яе назад. Захаванне меткі пакета ў злучэнні — гэта захаванне; аднаўленне яе — асобнае дзеянне. Ні адно не адбываецца само сабой.
Таму набор правілаў можа выглядаць узгодненым, пакуль рашэнне маршрутызацыі бачыць нуль: значэнне было захавана, і нішто яго не аднавіла.
Капіраванне паміж імі — крок, які пішаце вы
Два важныя сцвярджэнні працуюць у супрацьлеглых кірунках: адно захоўвае метку пакета ў злучэнні, другое загружае метку злучэння на пакет. Якое з іх патрэбна, залежыць ад таго, калі адбываецца класіфікацыя адносна патоку. Праект можа патрабаваць толькі метку пакета, а даданне разметкі праз conntrack з-за таго, што абыходны шлях выкарыстоўваў абодва, — менавіта так простая палітыка набывае другі рэжым адмовы.
ct mark set meta mark meta mark set ct mark
Запішыце кірунак побач з правілам, бо гэта не відавочна з сінтаксісу на першы погляд. Першы радок захоўвае, другі аднаўляе, і ні адзін не вынікае з другога.
Класіфікуйце да пошуку, які гэта спажывае
Трафік, створаны лакальна, і трафік, перанакіраваны з LAN, праходзяць праз розныя кукі і дасягаюць рашэнняў маршрутызацыі ў розныя моманты. Правіла выхаду, якое працуе для ўласных злучэнняў маршрутызатара, не даказвае, што пакет перанакіраванага кліента быў пазначаны да свайго пошуку. Размясціце класіфікацыю там, дзе пошук, які яе спажывае, яшчэ не адбыўся, і праверце, ці наступныя правілы ў тым жа ланцугу не перазапісваюць значэнне. Парадак унутры ланцуга — частка канфігурацыі, а не дэталь рэалізацыі.
Захаванне стану злучэння таксама патрабуе яўнага плана. Калі класіфікуецца толькі першы пакет патоку, наступным пакетам трэба аднавіць захаваную метку, інакш яны пойдуць па непазначаным шляху. Гэта і ёсць розніца паміж меткай, якая апісвае злучэнне, і меткай, якая апісвае пакет.
Спытайце ў маршруту пазначанае пытанне
ip route get 10.77.0.10 mark 0x2
Прагледзьце правілы і табліцу, затым запытайце маршрут з уключанай меткай, а таксама з крыніцай або ўваходным інтэрфейсам, калі яны ўплываюць на палітыку. Звычайны непазначаны пошук адказвае на іншае пытанне і з задавальненнем паведаміць шлях, які вы не хацелі. Праверце маску і прыярытэт правіла, а не толькі яго значэнне, і пераканайцеся, што абраная табліца змяшчае прыдатны маршрут.
Лічыльнік, які павялічваецца, — гэта доказ таго, што нейкае правіла супала з нейкім пакетам. Гэта не доказ таго, што канчатковы пакет нёс патрэбную метку ў слушным пункце рашэння.
Чытайце метку, кірунак, час і маску. Чатыры праверкі, і маршрут перастае быць загадкай.