Вы должны установить команду conntrack
обычно упакованную как conntrack или conntrack-tools, с http://conntrack-tools.netfilter.org/ . Он будет в основном отображать тот же контент, что и /proc/net/nf_conntrack
но может делать больше.
Запустите conntrack в режиме событий на шлюзе NAT: conntrack -E
(или вы можете выбрать conntrack -E --proto tcp --orig-port-dst 443
для ограничения HTTPS). Теперь ваш предыдущий пример с запросом HTTPS даст что-то похожее на это:
[NEW] tcp 6 120 SYN_SENT src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 [UNREPLIED] src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798
[UPDATE] tcp 6 60 SYN_RECV src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798
[UPDATE] tcp 6 432000 ESTABLISHED src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798 [ASSURED]
[UPDATE] tcp 6 120 FIN_WAIT src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798 [ASSURED]
[UPDATE] tcp 6 60 CLOSE_WAIT src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798 [ASSURED]
[UPDATE] tcp 6 30 LAST_ACK src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798 [ASSURED]
[UPDATE] tcp 6 120 TIME_WAIT src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798 [ASSURED]
[DESTROY] tcp 6 src=192.168.2.55 dst=217.254.1.76 sport=50798 dport=443 src=217.254.1.76 dst=193.157.56.3 sport=443 dport=50798 [ASSURED]
Таблица nat является особенной в том смысле, что она используется только один раз на поток *, когда создается состояние [NEW]
. Все остальное короткое замыкание найденной записи conntrack. Правило SNAT в POSTROUTING не "тихо создает правило DNAT" для ответа. Он изменил запись conntrack, чтобы получить ответ dst = 193.157.56.3, и сказал netfilter «Я что-то изменил», вот и все. Все остальное (включая изменение исходного IP-адреса) обрабатывается conntrack (модули nf_conntrack, nf_conntrack_ipv4) и nat (модули nf_nat, nf_nat_ipv4 и, возможно, еще несколько здесь), а не iptables. Рассмотрим записи, являющиеся базой данных состояний соединений.
Когда ответный пакет получен, пакет, не имеющий сохраненной ассоциации, просматривается в записях conntrack (на самом деле поиск ассоциации выполняется в обоих направлениях, либо в исходной части, либо в ответной части, это не имеет значения), и совпадение найдено, поскольку запись была создана ранее. Затем упакованная информация обновляется с помощью этой связи соединения. Больше нет необходимости искать этот пакет, хотя записи больше не отображаются, даже если некоторые его свойства (источник или назначение ...) изменены, информация доступна напрямую. Некоторые из макро / встроенных функций, обрабатывающих это, определены в skbuff.h . Ищите _nfct
и nfct
. Пакет (он же skbuff) после поиска получает это значение в skb->_nfct
.
Итак, несколько вещей, которые вы могли пропустить:
- iptables не является сетевым фильтром. Это пользователь netfilter. nftables - другой пользователь netfilter. conntrack и nat (например, модуль nf_nat) являются частью netfilter.
- хук POSTROUTING никогда не увидит ответный пакет, потому что соединение не NEW: таблица nat больше не вызывается для этого потока, а пакеты идентифицируются как часть этого потока.
- большая часть обработки conntrack и nat выполняется ... conntrack и nat, а не iptables. iptables может использовать ресурсы conntrack (например:
-m conntrack --ctstate ESTABLISHED
) или nat (что угодно в таблице nat должно). Для приведенного выше примера, одна запись conntrack имеет информацию для «de-SNAT» пакета, и действительно она выглядит как DNAT с первоначально входящим соединением.
- Обычно нет необходимости искать записи conntrack более одного раза для части пакета существующего соединения, "индекс" прикрепляется к пакету после поиска.
Вы можете убедиться, что таблица nat не видит другие пакеты после первого, запустив несколько раз iptables-save -c
и посмотрев, как увеличиваются счетчики для правил в таблице nat: только для первого пакета.
* посмотрите на часть NAT:
Эта таблица немного отличается от таблицы `filter 'тем, что только первый пакет нового соединения будет проходить через таблицу: результат этого обхода затем применяется ко всем будущим пакетам в том же соединении.