
📦 Самая быстрая и простая библиотека для манипуляции пакетами для Python
Это Pypacker: самая быстрая и простая библиотека для работы с пакетами низкого уровня на Python. Примеры использования см. ниже.
Если вы хотите поддержать этот проект, вы можете
через PayPal.
Несколько примеров:
pip/pypi больше не поддерживается из-за сложного механизма аутентификации, извините.
Смотрите:
Сами протоколы (см. layerXYZ) обычно не имеют подробной документации, поскольку они описаны в соответствующих RFC/официальных стандартах.
Тесты выполняются следующим образом:
cd pypackerexport PYTHONPATH=$(pwd):$PYTHONPATHpython tests/test_pypacker.pyРезультаты теста производительности:
Hardware: Intel CPU, 4 Cores @ 3.2 GHz
Python: CPython v3.10
nr = new results on this machine
Rounds per test: 10000
=====================================
>>> Packet parsing (Ethernet + IP + UDP + DNS): Search UDP port
Time diff: 0.1409761905670166s
nr = 70933 p/s
>>> Packet parsing (Ethernet + IP + TCP + HTTP): Search TCP port
Time diff: 0.3157649040222168s
nr = 31669 p/s
>>> Packet parsing (Ethernet + IP + TCP + HTTP): Reading all header
Time diff: 0.5989120006561279s
nr = 16696 p/s
>>> Parsing first layer (IP + ICMP)
Time diff: 0.014587163925170898s
nr = 685534 p/s
>>> Creating/direct assigning (IP only header)
Time diff: 0.02884364128112793s
nr = 346696 p/s
>>> bin() without change (IP)
Time diff: 0.013646364212036133s
nr = 732795 p/s
>>> Output with change/checksum recalculation (IP)
Time diff: 0.07719659805297852s
nr = 129539 p/s
>>> Basic/first layer parsing (Ethernet + IP + TCP + HTTP)
Time diff: 0.019113540649414062s
nr = 523189 p/s
>>> Changing Triggerlist element value (Ethernet + IP + TCP + HTTP)
Time diff: 0.017654895782470703s
nr = 566415 p/s
>>> Changing dynamic field (Ethernet + IP + TCP + HTTP)
Time diff: 0.006037473678588867s
nr = 1656321 p/s
>>> Direct assigning and concatination (Ethernet + IP + TCP + HTTP)
Time diff: 0.2050457000732422s
nr = 48769 p/s
.>>> Performance test pypacker vs. dpkt vs. scapy
Comparing pypacker, dpkt and scapy performance (parsing Ethernet + IP + TCP + HTTP)
nr = new results on this machine
Rounds per test: 10000
>> Testing pypacker parsing speed
nr = 194382 p/s
>> Testing dpkt parsing speed
Could not execute dpkt tests: ModuleNotFoundError("No module named 'dpkt'")
>> Testing scapy parsing speed
nr = 2775 p/s
Если остались вопросы, пожалуйста, создайте ошибку (будет помечена как "вопрос").
В: Насколько быстр Pypacker?
О: Смотрите результаты выше. Для подробных результатов на вашей машине выполните тесты:
python tests/test_pypacker.py PerfTestCase
В: Какие протоколы поддерживаются?
О: В настоящее время минимально поддерживаемые протоколы: Ethernet, Radiotap, IEEE80211, ARP, DNS, STP, PPP, OSPF, VRRP, DTP, IP, ICMP, PIM, IGMP, IPX, TCP, UDP, SCTP, HTTP, NTP, RTP, DHCP, RIP, SIP, Telnet, HSRP, Diameter, SSL, TPKT, Pmap, Radius, BGP
В: Планируется ли поддержка [чего-то]?
О: Новые возможности добавляются в Pypacker по мере необходимости или по вкладу сообщества — нет формальных планов по добавлению поддержки конкретных функций в будущие релизы. Общие рекомендации по вкладу можно найти в файле HACKING.
В: Как я могу внести вклад в этот проект?
О: Пожалуйста, используйте трекер ошибок Gitlab для сообщений об ошибках/запросах функций. Перед созданием нового запроса ознакомьтесь с уже известными проблемами. Патчи можно отправлять через pull request.
В: Возникла проблема xyz с Pypacker на Windows 3.11/XP/7/8/mobile и т.д. Можете это исправить?
О: Базовые функции должны работать на любой ОС. Опциональные могут вызывать проблемы (например, interceptor).
В: Под какой лицензией выпущен Pypacker?
О: Лицензия GPLv2 (см. файл LICENSE для получения дополнительной информации).
В: Вызов copy.deepcopy(some_packet) вызывает исключение "TypeError: can't pickle Struct objects".
О: Попробуйте следующий обходной путь для возможности сериализации объектов Struct:
import struct, copyreg
def pickle_struct(s):
return struct.Struct, (s.format,)
copyreg.pickle(struct.Struct, pickle_struct)
pkt_eth, pkt_ip, pkt_tcp, pkt_http = pkt[
None,
(None, lambda b: b.__class__ in [ip.IP, ip6.IP6]),
(tcp.TCP, lambda c: c.dport==80),
http.HTTP
]
...
pkt = Ethernet() + IP() + TCP()
# This parses ALL layers
packet_print = "%s" % pkt
packet_found = pkt[Telnet]
# Alternative: Use multi-value index-notation. This will stop parsing at any non-matching layer:
packet_found = pkt[Ethernet,IP,TCP,Telnet]
Используйте PyPy (~в 3 раза быстрее CPython при полном парсинге пакетов)
Для ещё большей производительности отключите автообновление полей (влияет на вызов bin(...)):
pkt = ip.IP(src_s="1.2.3.4", dst_s="1.2.3.5") + tcp.TCP()
# Disable checksum calculation (and any other update) for IP and TCP (only THIS packet instance)
pkt.sum_au_active = False
pkt.tcp.sum_au_active = False
bts = pkt.bin(update_auto_fields=False)
sysctl -w net.core.rmem_max=12582912
sysctl -w net.core.rmem_default=12582912
sysctl -w net.core.wmem_max=12582912
sysctl -w net.core.wmem_default=12582912
sysctl -w net.core.optmem_max=2048000
sysctl -w net.core.netdev_max_backlog=5000
sysctl -w net.unix.max_dgram_qlen=1000
sysctl -w net.ipv4.tcp_rmem="10240 87380 12582912"
sysctl -w net.ipv4.tcp_wmem="10240 87380 12582912"
sysctl -w net.ipv4.tcp_mem="21228 87380 12582912"
sysctl -w net.ipv4.udp_mem="21228 87380 12582912"
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_sack=1