1

UDP パケットの作成と送信に pylibnet を使用しています。この方法で作成した UDP パケットはすべて無効なチェックサムを持っているようです。例:

# python
Python 2.4.3 (#1, Sep  3 2009, 15:37:12)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import libnet
>>> from libnet.constants import *
>>> 
>>> net = libnet.context(RAW4, 'venet0:0')
>>> ip = net.name2addr4('www.stackoverflow.com', RESOLVE)
>>> data = 'This is my payload.'
>>> udptag = net.build_udp(sp=54321, dp=54321, payload=data)
>>> packetlen = IPV4_H + UDP_H + len(data)
>>> iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip)
>>> 
>>> net.write() 

送信ホストで上記のパケットをキャプチャすると、無効なチェックサムが明らかになります。

# tcpdump -i venet0:0 -n -v -v port 54321
tcpdump: WARNING: arptype 65535 not supported by libpcap - falling back to cooked socket
tcpdump: listening on venet0:0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
08:16:10.303719 IP (tos 0x0, ttl  64, id 1, offset 0, flags [none], proto: UDP (17), length: 47) 192.168.55.10.54321 > 69.59.196.211.54321: [bad udp cksum 50c3!] UDP, length 0

ここで何か間違ったことをしていますか?

4

3 に答える 3

3

tcpdump のバグやチェックサムのオフロードとは関係ありません。Libnet は、ユーザー モードでもチェックサムを計算します (FYI)。問題は、UDP ヘッダーの長さを指定しなかったことに関係しています。これは pylibnet や libnet で自動的に計算されるわけではないので、とりあえず指定する必要があります。以下は、コードの修正版です。pylibnet にパッチを適用して、rc6 でヘッダーの長さを自動的に検出します。最新情報については、 http: //sourceforge.net/projects/pylibnet に注目してください。この問題を修正した新しいリリースをプッシュします。ところで、バグや機能のリクエストがありましたら、sourceforge の pylibnet ページからお気軽にご連絡ください。私のソフトウェアを使用している開発者から話を聞くのが大好きです :)


import libnet
from libnet.constants import *

net = libnet.context(RAW4, 'venet0:0')
ip = net.name2addr4('www.stackoverflow.com', RESOLVE)
data = 'This is my payload.'
udptag = net.build_udp(len=UDP_H+len(data), sp=54321, dp=54321, payload=data)
packetlen = IPV4_H + UDP_H + len(data)
iptag = net.autobuild_ipv4(len=packetlen, prot=IPPROTO_UDP, dst=ip)

net.write()
于 2010-01-15T13:21:33.103 に答える
1

pylibnetを更新して、ほとんどのヘッダーの長さフィールドの自動サイズ決定を含めました。このように、ヘッダーの長さを必要とするヘッダーの長さを指定するのを忘れた場合、自動的にそれを決定しようとします。チェックサムが悪い理由を理解するための頭痛の種を省きます;)

于 2010-01-22T03:41:35.507 に答える
1

チェックサムを計算するジョブは、通常、ユーザー空間ライブラリではなく、デバイス ドライバーまたはハードウェアで実行されます。物理デバイスが発信パケットのチェックサムを計算し、ホストの CPU サイクルを節約する「チェックサム オフロード」の結果を見ていると思います。多くの (すべてではないにしても) 最近のイーサネット アダプタはこれを行い、ドライバはチェックサムを計算しません。tcpdump はドライバ内のパケットをキャプチャしているため、パケットが物理デバイスに到達する前に、チェックサム フィールド (おそらくバッファに残っているもの) にゴミが入って文句を言います。

これをカバーする 2005 年から 2008 年の期間に Wireshark に対して報告されたいくつかの「バグ」があり、Wireshark (tcpdump またはそれに相当する Windoze の単なる GUI ラッパー) には、オフロード ケースのチェックサム検証を無効にするオプションが追加されました。

http://wiki.wireshark.org/TCP_Checksum_Verification

いずれにせよ、pylibnet (または libnet) がチェックサムを担当するとは思いません。

http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html#id4744523も参照してください。

于 2009-12-14T21:52:58.847 に答える