
📦 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
残った質問については、バグとして報告してください(「質問」としてタグ付けされます)。
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: PypackerをWindows 3.11/XP/7/8/mobileなどで使うと問題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()
# これにより全レイヤーが解析される
packet_print = "%s" % pkt
packet_found = pkt[Telnet]
# 代替: 複数値のインデックス表記を使用。これは一致しないレイヤーで解析を停止します:
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()
# IPおよびTCPのチェックサム計算(およびその他の更新)を無効にする(このパケットインスタンスのみ)
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