LINUX.ORG.RU

пакетный сокет

 ,


1

5

Добрый день! Имеется приложение в котором создается пакетный сокет:

pack_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

Данным сокетом с канального уровня сетевого стека вычитываются все входящие/выходящие пакеты. Однако, получается что пакетный сокет не удаляет пакет с канального уровня, а только копирует его, после чего пакет передается выше по сетевому стеку/в драйвер для передачи в сеть. То есть, если в дополнение к пакетному сокету открыть и присоединить к нужному ip и порту, скажем, udp сокет, то данным сокетом можно повторно вычитать данные (с удаленными ethernet, ip и udp заголовками), уже полученные пакетным сокетом. Вопрос: можно ли каким либо образом (выставлением флагов, модификацией стека) предотвратить передачу ВХОДЯЩИХ пакетов, вычитанных пакетным сокетом, выше по сетевому стеку?

Создай правило в netfilter, которое будет дропать те пакеты, которые ты хочешь ловить через твой raw-сокет.

i82 ★★
()

если память не изменяет для этих целей есть правило QUEUE у netfilter

иных способов нет, а то какое-то свинство будет - все кому не лень будут лезть в сетевой стек и дропать/менять пакеты

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

не, ну можно tun/tap сделать, забриджевать его с основным интерфесом... но это будет снижение производительности сразу, т.к. всё будет через юзер-мод качаться... но хз, что топик-стартеру надо на самом деле сделать :-)

i82 ★★
()

Расскажи что тебе нужно, возможно, есть другие пути решения проблемы.

Я бы попробовал на фаерволе сделать -j REDIRECT, получать эти пакеты, менять и отправоять обратно. Хотя, вариант не самый удачный т.к. будет перезаписан dst addr пакета, но есть способы решения и этой проблемой. В общем, гугли linux transparent proxy. Правда, большинство инструкций подразумевает один порт и tcp, но, думаю, правила можно доработать.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.