LINUX.ORG.RU
ФорумAdmin

CONNMARK/MARK

 ,


2

2

Разделяю трафик с локалки по таблицам. Чтобы засунуть нужные куски локалки в нужные таблицы маркирую iptables нужные Ipшники.

Вот так (mangle):

-A PREROUTING -m iprange -i eth2 --src-range 172.16.0.2-172.16.0.10 -j MARK --set-mark 0x2
-A PREROUTING -m iprange -i eth2 --src-range 172.16.0.11-172.16.0.254 -j MARK --set-mark 0x1

Всё работает замечательно и трафик идёт в нужные таблицы. Только у меня возник вопрос: почему когда используешь CONNMARK ip rule не подхватывает маркированные пакеты в нужные таблицы? Ведь отличие CONNMARK от простого MARK только в том, что первый маркирует соединения, а второй - пакеты. И первый рекомендуют как дефолт. Но почему в моём случае CONNMARK не работал, а MARK работает?

Вот такое правило ip rule:

ip rule add fwmark 0x1 lookup raw_link
ip rule add fwmark 0x2 lookup vpn_link

Ведь отличие CONNMARK от простого MARK только в том, что первый маркирует соединения, а второй - пакеты.

В этом и отличие. По простому, через ip rule у вас пролетает именно пакет. MARK - маркирует пакет, но не соединение. CONNMARK - соединение но не пакет.

В простом случае как у вас MARK отработает как надо, т.е. каждый пакет с исходящим адресом перечисленном в --src-range получит однозначно метку на основании которой позже будет оправлен в соответствующую таблицу.

Теперь предположим другой простой случай. У вас два интерфейса назовем их по аналогии с вашими таблицами raw_link и vpn_link оба смотрят наружу. Необходимо сделать dnat для входящих на любой из этих интерфейсов на адрес 172.16.0.3. Если входящее соединение прилетит на raw_link то и исходящее уйдет с него же в соответствии с вашими правилами. Но вот если прилетит на vpn_link уйдет все равно с raw_link что уже скорее всего будет не правильно. Обычным mark тут не решить, т.к. на уровне пакета исходящего с 172.16.0.3 вы не знаете по какому маршруту его отправить. Вот в данном случае поможет connmark, маркируем вводящее соединение в зависимости от того на какой интерфейс прилетело, а потом --restore-mark который скопирует метку соединения connmark в метку пакета mark.

И первый рекомендуют как дефолт.

Никогда такого не слышал.

Но почему в моём случае CONNMARK не работал, а MARK работает?

restore-mark забыли?

anc ★★★★★
()
Ответ на: комментарий от anc

Спасибо! Разъяснили всё доходчиво.

Никогда такого не слышал.

На Stackoverflow можно встретить подобное.

restore-mark забыли?

Его в какую цепочку? POST или PRE routing?

FluffyPillow
() автор топика
Ответ на: комментарий от FluffyPillow

Его в какую цепочку? POST или PRE routing?

PRE. она так и называется prerouting. В post уже «не интересно» :)

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.