@Yagoda123

Где маркировать пакеты в iptables, если надо макировать ответ после SNAT и фильтровать по исходному IP (до SNAT)?

Прошу помощи, голову уже сломал.
Схема: серые внутренние IP натятся внешним диапазоном.
Требуется по некоторому условию (протокол, порт источника, внутренний IP) направить ответ в другую таблицу маршрутизации.
Вроде все просто - создаю нужную таблицу route, создаю rule fwmark с нужной меткой, в mangle/PREROUTING делаю -j MARK.

Все работает замечательно для внутренних белых (которые не натятся) IP. А вот для серых IP схема не работает.
Как я понял, в mangle/PREROUTING обратного преобразования NAT еще не было, и адрес назначения - внешний диапазон.
Пробую обрабатывать в mangle/FORWARD - реакции нет. Скорее всего, решение о маршрутизации уже принято и rule не срабатывает.

Может у кого будут идеи как разрулить? Или подскажет кто порядок прохождения ответа на SNAT?
  • Вопрос задан
  • 5749 просмотров
Решения вопроса 1
EvilMan
@EvilMan
Если нужно отбирать пакеты по оригинальным адресам (до трансляции), то можно использовать модуль сопоставления (match) conntrack.
Краткая справка опций данного сопоставления (можно посмотреть по iptables -m conntrack --help как и для всех других типов сопоставлений):
[!] --ctstate {INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED|SNAT|DNAT}[,...]
                               State(s) to match
[!] --ctproto proto            Protocol to match; by number or name, e.g. "tcp"
[!] --ctorigsrc address[/mask]
[!] --ctorigdst address[/mask]
[!] --ctreplsrc address[/mask]
[!] --ctrepldst address[/mask]
                               Original/Reply source/destination address
[!] --ctorigsrcport port
[!] --ctorigdstport port
[!] --ctreplsrcport port
[!] --ctrepldstport port
                               TCP/UDP/SCTP orig./reply source/destination port
[!] --ctstatus {NONE|EXPECTED|SEEN_REPLY|ASSURED|CONFIRMED}[,...]
                               Status(es) to match
[!] --ctexpire time[:time]     Match remaining lifetime in seconds against
                               value or range of values (inclusive)
    --ctdir {ORIGINAL|REPLY}   Flow direction of packet


Но маркировать после SNAT не получится, так как nat выполняется в nat/POSTROUTING уже ПОСЛЕ mangle/POSTROUTING (диаграмма прохождения пакетов через Netfilter). При этом решение о маршрутизации принимается до SNAT, уже пытаться маршрутизировать пакеты в другую таблицу после SNAT неправильно. Может расскажете подробнее схему?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Gasoid
@Gasoid
мангл/построутинг по идее там проходят пакеты позже nat/postrouting
Ответ написан
@g3fox
Инженер
Возможно Вам как-либо поможет CONNMARK.
Ответ написан
Комментировать
@Yagoda123 Автор вопроса
Требуется определенный трафик (протокол, порт, IP клиента) пропустить через ... ну, допустим специальный анализатор на другом хосте, подключенном к шлюзу.
Соответственно и ответ должен пройти через этот дополнительный узел.

От клиента просто. А вот с ответом были проблемы.
Спасибо, помогло правило --ctorigsrc (как раз исходный адрес клиента до SNAT) модуля conntrack при обработке ответа в mangle/PREROUTING. Ну и дополнительное условие на --ctstate SNAT.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы