
Этотстраница, по-видимому, предполагает, что если в 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 и общих сетяхописывает отношения между различными хуками, которые видят пакет. Вот его меньшая часть:
Так что если вы хотите взаимодействоватьвеличественнос пакетамидонат, логичный выбор mangle/PREROUTING
:conntrackхук уже отследил пакет: он не получит состояние INVALID, нонатдо сих пор не произошло.
Просто помните, что iptablesнатвидит только первый пакет, а все остальное обрабатывается напрямуюconntrack, все еще происходящий в том же месте: между mangle/PREROUTING
и решением о маршрутизации.
Другой метод описан в книге Антона Даниловаотвечать: путем запросаconntrackдля проверки прежнего адреса по его таблице соответствия.