Четири проверки отделят работещо правило за маркер от работещ маршрут: кой маркер чете правилото, дали пакетът все още го носи при търсенето, дали маркерът на връзката е бил възстановен върху следващите пакети и дали маската и приоритетът на съответното правило му позволяват да се задейства. Броячът, който се увеличава, доказва само, че някое правило е съвпаднало с нещо. Той не казва нищо за това какво е носил пакетът, когато ядрото е избирало пътя му.

Двата маркера живеят на различни места и изтичат по различни графици.

Два маркера, два живота

Маркерът на пакета принадлежи на един skb, пътува с него през куките и се изразходва от селектора fwmark на маршрутизирането по политика. Маркерът на връзката принадлежи на записа в conntrack, запазва се през пакетите на този поток и е невидим за правилото за маршрутизиране, докато нещо не го копира обратно. Запазването на маркера на пакета във връзката е запис; възстановяването му е отделно действие. Нито едно от двете не се случва автоматично.

Затова набор от правила може да изглежда последователен, докато решението за маршрут вижда нула: стойността е била запазена и нищо не я е възстановило.

Копирането между тях е стъпка, която пишете вие

Двете важни твърдения работят в противоположни посоки: едното записва маркера на пакета във връзката, другото зарежда маркера на връзката върху пакета. Кое от тях ви трябва, зависи от това кога се случва класификацията спрямо потока. Един дизайн може да се нуждае само от маркера на пакета, а добавянето на маркиране през conntrack, защото някакво заобиколно решение е използвало и двете, е начинът, по който една проста политика придобива втори режим на отказ.

ct mark set meta mark
meta mark set ct mark

Запишете посоката до правилото, защото тя не е очевидна от синтаксиса на пръв поглед. Първият ред записва, вторият възстановява и нито едното не предполага другото.

Класифицирайте преди търсенето, което го изразходва

Локално генерираният трафик и трафикът, препратен от LAN, преминават през различни куки и достигат до решения за маршрут в различни моменти. Правило за изход, което работи за собствените връзки на рутера, не доказва, че пакетът на препратения клиент е бил маркиран преди своето търсене. Поставете класификацията там, където търсенето, което я изразходва, още не се е случило, и проверете дали следващите правила в същата верига не презаписват стойността. Редът във веригата е част от конфигурацията, а не подробност на реализацията.

Запазването на състоянието на връзката също изисква ясен план. Ако се класифицира само първият пакет на потока, следващите пакети се нуждаят от възстановяване на запазения маркер, иначе ще поемат по немаркирания път. Това е разликата между маркер, който описва връзка, и такъв, който описва пакет.

Задайте на маршрута маркиран въпрос

ip route get 10.77.0.10 mark 0x2

Прегледайте правилата и таблицата, след което попитайте маршрута с включен маркер, плюс източника или входящия интерфейс, когато те влияят на политиката. Обикновеното немаркирано търсене отговаря на друг въпрос и с удоволствие ще ви съобщи пътя, който не сте искали. Проверете маската и приоритета на правилото, както и стойността му, и потвърдете, че избраната таблица съдържа използваем маршрут.

Увеличаващият се брояч е доказателство, че някое правило е съвпаднало с някой пакет. Той не е доказателство, че крайният пакет е носил желания маркер в правилната точка на решение.

Прочетете маркера, посоката, времето и маската. Четири проверки и маршрутът престава да бъде загадка.

Подобни статии