Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Linux: пакетный сокет


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

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

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

Автор: tzirechnoy 22.1.2017, 15:31
В правила firewallа (iptables) их добавь, чтобы -j DROP и всё такое.

Хотя, конечно, это тожэ будет неправильное решэние какой-то твоей задачи, которую ты здесь не привёл.

Автор: Olej 22.1.2017, 21:55
Цитата(vektor554 @ 21.1.2017,  16:21)
Вопрос: можно ли каким либо образом (выставлением флагов, модификацией стека) предотвратить передачу ВХОДЯЩИХ пакетов, вычитанных пакетным сокетом, выше по сетевому стеку?

Можно. И довольно элементарно, написав фильтр в стек TCP/IP ядра Linux - по форме это модуль ядра, драйвер.
Для этого нужно иметь высокую квалификацию в языке C и, желательно, в программировании модулей ядра Linux.
См. http://mylinuxprog.blogspot.com/2014/04/linux.html - там есть практически ваш код.

P.S. кто это вас научил называть SOCK_RAW "пакетным" сокетом? это всегда было "сырой" сокет.
SOCK_RAW - это нестандартное расширение техники TCP/IP, нестандартно для POSIX, это специфическое расширение Linux и оно может работать как угодно (даже от версии к версии).

Добавлено через 1 минуту и 58 секунд
Цитата(tzirechnoy @ 22.1.2017,  15:31)
В правила firewallа (iptables) их добавь, чтобы -j DROP и всё такое.

iptables ничего не знает о пакетах канального уровня ... он даже не догадывается о его существовании smile 

Автор: tzirechnoy 24.1.2017, 05:34
Цитата
он даже не догадывается о его существовании



Да уж, когда мой iptables начнёт о чём-нибудь догадываться, мне станет по-настоящему страшно.

PS Но кстати да, совет топикстартеру: не употребляйте слов "канальный уровень" и прочие дурацкие наборы букв из описания сетевого протокола имени ISO/OSI, сдохшэго примерно 30 лет назад. Сейчас это выглядит некоторым академическим позёрством, не очень способствующим общению. 

Автор: feodorv 21.2.2017, 05:00
Цитата(Olej @  22.1.2017,  21:55 Найти цитируемый пост)
кто это вас научил называть SOCK_RAW "пакетным" сокетом?

Не SOCK_RAW. Именно PF_PACKET. И "пакетный сокет" - общепринятое название для сокетов семейства PF_PACKET smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)