событие netfilter для пакета, обрабатываемого локально (код модуля ядра netfilter C)

Если входящий пакет приходит и обрабатывается локально, есть ли способ получить уведомление об этом событии?

В настоящее время я использую перехватчик NF_IP_LOCAL_IN. Но похоже, что это дает все пакеты, предназначенные для интерфейса. Например, предположим, что tcp-пакет X приходит на порт 5000, и на порту 5000 прослушивается сокет. Я хотел бы получить это событие.

Чтобы уточнить, я имею в виду, что хочу получать только события пакета X. Все остальные пакеты, которые не обрабатываются локально (т. Е. Те, которые генерируют сообщение о недоступности пункта назначения ICMP, о котором я не хочу получать уведомления)


person ajpyles    schedule 03.02.2011    source источник
comment
Итак, вы хотели бы получать уведомления, если есть процесс, прослушивающий порт 5000, и не получать уведомления, если процесс не прослушивает? Это за пределами знаний netfilter.   -  person ninjalj    schedule 03.02.2011
comment
@ninjalj А как насчет отслеживания соединений? Разве это не отслеживает, какие сокеты для прослушивания используются в настоящее время?   -  person ajpyles    schedule 03.02.2011
comment
@ajpyles: нет, отслеживает предполагаемые состояния TCP в соответствии с увиденными сегментами TCP.   -  person ninjalj    schedule 03.02.2011
comment
@ninjalj ОК, спасибо. Тогда мне нужно будет придумать свой собственный механизм проверки, который может оказаться дорогостоящим. Можно ли сделать копию входящего пакета для постобработки? Т.е. отправить NF_accept, но продолжить обработку пакета асинхронно.   -  person ajpyles    schedule 03.02.2011
comment
@ajpyles: копия (фактически, клон COW) пакета - это то, что делает AF_PACKET (например, tcpdump et al.).   -  person ninjalj    schedule 03.02.2011
comment
@ninjalj, вы имеете в виду struct nf_hook_ops nf; ... nf.pf = AF_PACKET подойдет? В таком случае мне действительно нужно возвращать что-нибудь из моей функции-перехватчика?   -  person ajpyles    schedule 03.02.2011
comment
@ajpyles: нет, я имел в виду, в зависимости от того, что именно вам нужно сделать, может быть, сокета AF_PACKET в пользовательском пространстве будет достаточно?   -  person ninjalj    schedule 03.02.2011


Ответы (2)


Netfilter находится на L3 / L4, поэтому он имеет доступ только к информации до L4. OTOH, LSM (модули безопасности Linux) имеют перехватчики почти повсюду, включая socket_recvmsg, который, я думаю, должен вызываться только для тех пакетов, которые вас интересуют.

Теперь, сможете ли вы использовать это, зависит от вашей ситуации. В вашей среде уже запущен LSM? Если ответ положительный, можете ли вы создать и вставить политику для вашего LSM, которой было бы достаточно для ваших целей?

person ninjalj    schedule 03.02.2011
comment
Выглядит интересно. Не могли бы вы пояснить, что означает LSM? - person ajpyles; 03.02.2011
comment
@ajpyles: расширенное сокращение. Примером LSM является Selinux. - person ninjalj; 03.02.2011

Что ж, интерфейс должен быть lo.

Или я не понимаю, почему хук LOCAL_IN вас не устраивает.

person adobriyan    schedule 03.02.2011
comment
Например, предположим, что у меня есть ТОЛЬКО прослушивающий сокет на порту 5000. Пакет X приходит на порт 5000, а пакет Y приходит на порт 5001. Оба события будут отображаться в ловушке LOCAL_IN. Но я просто хотел бы получить событие, когда приходит пакет X (потому что он обрабатывается локально). - person ajpyles; 03.02.2011
comment
Есть модуль соответствия сокетов (xt_socket.c). Может, это поможет. - person adobriyan; 03.02.2011