Как фильтрация iptables в цепочке FORWARD или INPUT взаимодействует с NAT?

Как фильтрация iptables в цепочке FORWARD или INPUT взаимодействует с NAT?

Этотстраница, по-видимому, предполагает, что если в PREROUTINGцепочке таблицы есть правило nat, которое переводит назначение 1.2.3.4:80в 10.1.1.1:8080, то правила в цепочке INPUTи FORWARDдолжны совпадать с 10.1.1.1:8080, а не с 1.2.3.4:80.

Что делать, если кто-то хочет реализовать порядок действий, более похожий на тот, что описанздесь? То есть, как вы выполняете фильтрацию по характеристикам пакетов перед NAT?

Одна из возможностей, похоже, заключается в использовании PREROUTINGцепочки таблицы raw. Проблема в том, что conntrack недоступен в raw/PREROUTING(см. примечание 1), и, например, неначальный фрагмент UDP не будет связан с начальным фрагментом и даст неожиданные совпадения.

Пожалуйста, дайте мне знать, ясно ли я описал дилемму и есть ли какой-либо обходной путь.

Примечание 1: Поправьте меня, если я ошибаюсь, но когда я попытался использовать conntrack в raw/PREROUTING, все начальные пакеты SYN были помечены " INVALID", а не " NEW". Также похоже, что в блок-схеме Netfilter "conntrack" находится после raw/PREROUTING.

решение1

Вам не нужны никакие raw/PREROUTINGправила. Вы можете использовать сопоставление conntrackдля фильтрации пакетов по оригинальному (до трансляции) адресу назначения/источника/номеру порта. Это conntrackпреемник старого stateсопоставления. Он может проверять различные дополнительные метаданные, связанные с conntrack entry(и NAT).

Пара примеров:

# allow any port-forwarded packets
iptables -t filter -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

# check the original destination address of DNATed packets
iptables -t filter -A FORWARD -p tcp --dport 8080 -m conntrack --ctstate DNAT --ctorigdstport 80 --ctorigdst X.X.X.X --ctdir ORIGINAL -j ACCEPT

Для получения более подробной информации проверьте выходные данные iptables -m conntrack --helpи man iptables-extensions.

решение2

TheПоток пакетов в Netfilter и общих сетяхописывает отношения между различными хуками, которые видят пакет. Вот его меньшая часть:

Поток пакетов в Netfilter и общих сетях

Так что если вы хотите взаимодействоватьвеличественнос пакетамидонат, логичный выбор mangle/PREROUTING:conntrackхук уже отследил пакет: он не получит состояние INVALID, нонатдо сих пор не произошло.

Просто помните, что iptablesнатвидит только первый пакет, а все остальное обрабатывается напрямуюconntrack, все еще происходящий в том же месте: между mangle/PREROUTINGи решением о маршрутизации.

Другой метод описан в книге Антона Даниловаотвечать: путем запросаconntrackдля проверки прежнего адреса по его таблице соответствия.

Связанный контент