Как прочитать полный IP-фреймы из TCP-сокета в Python? - PullRequest
3 голосов
/ 23 марта 2011

Мне нужно прочитать полный (необработанный) IP-фрейм из сокета потока TCP, используя Python.По сути, я хочу неизмененный фрейм, как если бы он вышел за пределы физической строки, включая всю информацию заголовка.

Я искал необработанные сокеты в Python, но столкнулся с некоторыми проблемами.Мне не нужно формировать свои собственные пакеты, мне просто нужно прочитать и переслать их дословно.

Итак, как я могу прочитать весь IP-кадр (включая заголовок) из существующего сокета TCP (в Python)?

Желательно использовать только стандартные библиотеки.Также я нахожусь на хосте Linux.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 23 марта 2011

Если вы не возражаете против использования Scapy , который не является частью стандартной библиотеки, и суперскорость не является обязательным требованием, вы можете использовать его функцию sniff.Требуется обратный звонок.Что-то вроде:

pkts_rxd = []
def process_and_send(pkt):
    pkts_rxd.append(pkt)
    sendp(pkt, 'eth1')
sniff(prn=process_and_send, iface='eth0', count=100)

Вы можете запустить анализатор в другом потоке или процессе с помощью count=0 и поместить полученные пакеты в очередь, если хотите, чтобы он работал вечно.Просто убедитесь, что вы положили str (pkt) в очередь.Я видел странные вещи, происходящие при размещении пакетов scapy на multiprocessing.Queue s.

Debian и Ubuntu оба имеют Scapy в своих репозиториях apt.Я не знаю о дистрибутивах rpm.Это довольно легко установить из источника, хотя: ./setup.py install.

0 голосов
/ 23 марта 2011

Может быть pylibpcap может это сделать.

0 голосов
/ 23 марта 2011

Вы должны попробовать scapy .

...