2016-07-25 1 views
2

Это мой первый раз с использованием сырых сокетов (да, мне нужно использовать их, поскольку я должен изменить поле внутри сетевого заголовка), и вся документация или учебные материалы, которые я читаю, описывают решение для пакетов нюхания, но это не совсем то, что я необходимость. Мне нужно создать скрипт, который перехватывает пакет, обрабатывает его и отправляет его дальше в пункт назначения, т. Е. Пакеты не должны добираться до места назначения, если только мой скрипт не решит.Могу ли я перехватить сетевые пакеты с сырым сокетом (а не только понюхать)?

Чтобы узнать, я создал небольшой прототип, который обнаруживает пинг и просто печатает «PING». Я ожидаю, что ping не будет работать, поскольку я перехватываю пакеты, и я не включаю логику отправки их в пункт назначения. Тем не менее ping работает (опять же, кажется, что это просто обнюхивание/зеркальное отображение пакетов). Моя цель состоит в том, что пакеты ping «пойманы в ловушку» в моем скрипте, и я не знаю, как это сделать. Это то, что я в моем текущем сценарии питона (я избегаю писать, как я делаю декодирование для простоты)

sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003)) 
sock.bind((eth0, 0)) 
packet = sock.recvfrom(65565) 
decode_eth(packet) 
decode_ip(packet) 

if (ipheader.ip_proto == 1): 
      print("\nPING") 

Может кто-нибудь объяснить, как я могу достичь своей цели или указать мне на правую документацию?

ответ

0

Ваше описание кажется отличным от того, что предлагает ваш заголовок. Я понимаю, что вы хотите получать, изменять и, возможно, удалять входящие сетевые пакеты. И это должно быть сделано в Linux. В этом случае я предлагаю вам использовать крюк предварительной настройки netfilter, который сделает вещи намного проще (и, вероятно, более стабильными). Netfilter хорошо документирован, хороший обзор, включая информацию, связанную с вашими требованиями, можно увидеть here. Важной функцией для использования является nf_register_hook(), прочитайте ответ на вопрос this, чтобы получить представление о том, как настроить вещи.

0

Я полагаю, что ваш Linux-сервер настроен как маршрутизатор (а не мост). Пакет будет проходить через ваш Linux, потому что вы включили IP Forwarding. Таким образом, есть два решения:

Решение 1:

Отключить IP Forwarding, а затем получить пакет с одного интерфейса и сделать соответствующую задачу (переадресация на другой интерфейс или сбросив его).

Решение 2:

Использование NetFilterQueue.

Установите его на вашем Linux (Debian/Ubuntu в моем примере):

apt-get install build-essential python-dev libnetfilter-queue-dev 

Использование iptables для отправки пакетов, поступающих из входного интерфейса (eth0 в моем примере):

iptables -I INPUT -i eth0 -j NFQUEUE --queue-num 1 

Run этот скрипт обрабатывает пакеты, отправленные в очередь №1:

from netfilterqueue import NetfilterQueue 

def print_and_accept(pkt): 
    print pkt 
    pkt.accept() 

nfqueue = NetfilterQueue() 
nfqueue.bind(1, print_and_accept) 
try: 
    nfqueue.run() 
except KeyboardInterrupt: 
    print 

Обратите внимание, что pkt.drop() вызывают падение пакета. Также вы должны принимать/удалять каждый пакет.

Смежные вопросы