
📦 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
남은 질문이 있으면 버그로 등록해 주세요("questions"로 태그됩니다).
Q: pypacker는 얼마나 빠른가요?
A: 위 결과를 참조하세요. 자신의 머신에서 자세한 결과를 보려면 테스트를 실행하세요:
python tests/test_pypacker.py PerfTestCase
Q: 어떤 프로토콜이 지원되나요?
A: 현재 최소 지원 프로토콜은 다음과 같습니다: 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
Q: [xyz]를 지원할 계획이 있나요?
A: 새 기능은 제가 필요하거나 사람들이 기여함으로써 Pypacker에 추가됩니다. 특정 기능을 향후 릴리스에서 지원할 공식적인 계획은 없습니다. 기여에 대한 일반적인 지침은 HACKING 파일에서 확인할 수 있습니다.
Q: 이 프로젝트에 어떻게 기여할 수 있나요?
A: 버그/기능 요청은 Gitlab 버그 트래커를 사용하세요. 새로 등록하기 전에 이미 알려진 버그가 있는지 버그 트래커를 읽어 보세요. 패치는 풀 리퀘스트를 통해 보낼 수 있습니다.
Q: Windows 3.11/XP/7/8/mobile 등에서 Pypacker에 xyz 문제가 있습니다. 고칠 수 있나요?
A: 기본 기능은 모든 OS에서 작동해야 합니다. 선택적 기능은 문제를 일으킬 수 있습니다 (예: 인터셉터).
Q: Pypacker는 어떤 라이선스로 배포되나요?
A: GPLv2 라이선스입니다 (자세한 내용은 LICENSE 파일 참조).
Q: copy.deepcopy(some_packet) 호출 시 "TypeError: can't pickle Struct objects" 예외가 발생합니다.
A: Struct 객체를 pickle할 수 있도록 다음 해결 방법을 시도해 보세요:
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를 사용하세요 (전체 패킷 파싱에 대해 CPython보다 약 3배 빠름)
더 높은 성능을 위해 자동 필드를 비활성화하세요 (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