2016-08-16 6 views
2

Я реализую рукопожатие TCP с использованием сокетов RAW с помощью python. Ядро Linux, однако, очень раздражает, поскольку оно пытается обрабатывать определенные аспекты этого протокола.TCP рукопожатие с использованием python RAW-сокетов

Например, когда я отправляю пакет SYN, сервер ответил SYN, ACK-пакетом; к которому ядро ​​автоматически отвечает RST-пакетом, сбрасывающим соединение. Я преодолел это мой сбросив все такие пакеты сброса, используя следующую iptable правило:

-A OUTPUT -p tcp -m tcp --sport 999 --tcp-flags RST RST -j DROP 

Теперь я хочу, чтобы получить пакет SYN, ACK, посланный сервером и распечатать его. Но я не получаю ничего, когда я делаю следующее:

a = self.s.recvfrom(4096) 

Я подозреваю, что ядро ​​сбросив SYN, ACK прежде, чем я могу ПРИЕМ его с помощью моего гнезда. Кто-нибудь знает разумное обходное решение?

+0

Не могли бы вы использовать Scapy? https://github.com/secdev/scapy/ –

+0

Может ли scapy оживить и разобрать SYN, ACK? По верил, что этот пакет был сброшен ядром – SivaDotRender

+0

Не знаю, я предложил его как возможную библиотеку более высокого уровня, которую вы можете использовать (или, по крайней мере, учиться у), и пытаться все это сделать с нуля. –

ответ

1

Вы можете использовать Libpcap, в Python, кажется, этот модуль: http://pylibpcap.sourceforge.net/ или это один: https://pypi.python.org/pypi/pypcap

С PCAP вы можете зарегистрироваться, чтобы получать сообщения от ядра. Предоставляя правильный фильтр из вашего приложения, вы можете получать сегменты TCP из ядра. Я использовал libpcap в C, и я предполагаю, что вы можете использовать указанные модули таким же образом. Для меня это лучшее решение, так как вы можете справиться с ним из приложения довольно стандартным образом.

Чтобы избежать реакции ядра с RST, ваше решение с помощью iptables выглядит лучше всего для меня.

1

Хотя я надеюсь, что кто-то придумает более удобное решение, одним из способов сделать это будет использование iptables для передачи входящих пакетов TCP Sync на nfqueue. Nfqueue имеет существующий python bindings, поэтому его использование не должно быть проблемой.

Идея состоит в том, чтобы поймать все входящие TCP-сирены до того, как они достигнут реализации TCP в ядре. Затем передайте эти пакеты в nfqueue, которое может контролировать ваше пользовательское приложение. Для каждого пакета, которое ваше приложение получит из nfqueue, ему необходимо будет решить (return a verdict), обрабатывать ли сам пакет (т. Е. Отбрасывать пакет до OS) или передавать его в соответствии с обычной реализацией TCP.

Я знаю, что этот подход работает, но это громоздко.

+0

Это звучит как самое разумное решение для меня. – SivaDotRender

1

Поскольку вы все это делаете с сырыми пакетами, почему бы просто не создать свой собственный MAC-адрес и IP-адрес? Вам нужно будет поместить адаптер в беспорядочный режим для приема пакетов, но если вы это сделаете, ядро ​​не должно отправлять ответы на входящие пакеты, поскольку они будут отображаться для «какой-либо другой системы». Это делает тривиальным фильтровать пакеты, которые вам интересны для других.

Вам также потребуется ответить на ARP соответствующим образом, чтобы другая система могла найти ваш MAC-адрес. И если вам нужен DHCP для получения IP-адреса, вам также нужно будет обрабатывать эти взаимодействия.