Как Netfilter понимает, что пакет связан?

conntrack модуль --ctstate поддерживает RELATED состояние пакета. Как Netfilter знает, что, например, в случае активного FTP соединение с портом данных FTP-сервера (порт TCP 20) в непривилегированный порт данных, указанный ранее клиентом, является подключенным соединением? Существует ли в Netfilter несколько модулей, где описывается каждый протокол, поддерживаемый RELATED ? И последнее, но не менее важное: есть ли список протоколов, поддерживаемых этим RELATED ?

Различные пакеты протокола интернет-протокола (ICMP) могут быть «связаны» с соединением какого-либо протокола (или с попыткой такого), но эти ICMP-пакеты отличаются от протокола, вызвавшего их, следовательно, «связанного» понятия. Это может произойти, если хост или брандмауэр отклоняет попытку подключения TCP или UDP с недоступным ICMP-пакетом назначения; позволяя RELATED пропускать соответствующий ICMP-пакет. (TCP имеет RST, поэтому может или не может выдавать соответствующий ответ ICMP, а администраторы брандмауэра могут или не могут разрешать ответы ICMP …)

Для протоколов уровня приложений (например, для FTP) каждый из них требует настраиваемый модуль, так как пользовательский код необходим для того, чтобы выкопать пакеты и выяснить, относится ли и как это относится к чему-либо, о чем знает netfilter. Эти модули могут быть написаны кем угодно для любого приложения, хотя проверка nf_conntrack_* файлов nf_conntrack_* может быть хорошим местом для начала списка:

 % print -l /lib/modules/3.10.0-327.13.1.el7.x86_64/kernel/net/netfilter/nf_conntrack_*(:t) nf_conntrack_amanda.ko nf_conntrack_broadcast.ko nf_conntrack_ftp.ko ...