6

http://kernelnewbies.org/Linux_3.0#head-c5bcc118ee946645132a834a716ef0d7d05b282eによると 、特権のないユーザーとして ping を実行できるようになりました。

https://github.com/jedie/python-pingを使用して、210行目を次のように変更しました

current_socket = socket.socket(socket.AF_INET、socket.SOCK_DGRAM、socket.IPPROTO_ICMP)

root として「echo 1000 1000 > /proc/sys/net/ipv4/ping_group_range」

私のグループは1000です

通常のユーザーとして自分自身としてping.pyを実行できます.tcpdumpでエコー要求とエコー応答を確認できます

18:33:24.840291 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 269)
    127.0.0.1 > 127.0.0.1: ICMP echo request, id 38, seq 0, length 249
18:33:24.840309 IP (tos 0x0, ttl 64, id 37939, offset 0, flags [none], proto ICMP (1), length 269)
    127.0.0.1 > 127.0.0.1: ICMP echo reply, id 38, seq 0, length 249

しかし、ping.py は応答を認識せず、タイムアウトを示します。

これを機能させる方法はありますか?

編集:

問題を絞り込んでいます。

print "c", icmp_header, address, self.own_id
if icmp_header["packet_id"] == self.own_id: # Our packet

問題は、icmp_header["packet_id"] が常に 8247 であり、self.own_id が ping.py の pid であることです。8247 は 16 進数では 2037 であり、これはダンプで何度も確認できます。

これは、ネットワーク上の ping の完全なダンプです。

19:25:15.513285 00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 283: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 269)
  127.0.0.1 > 127.0.0.1: ICMP echo request, id 70, seq 2, length 249
    0x0000:  4500 010d 0000 4000 4001 3bee 7f00 0001  E.....@.@.;.....
    0x0010:  7f00 0001 0800 d932 0046 0002 5b36 362c  .......2.F..[66,
    0x0020:  2036 372c 2036 382c 2036 392c 2037 302c  .67,.68,.69,.70,
    0x0030:  2037 312c 2037 322c 2037 332c 2037 342c  .71,.72,.73,.74,
    0x0040:  2037 352c 2037 362c 2037 372c 2037 382c  .75,.76,.77,.78,
    0x0050:  2037 392c 2038 302c 2038 312c 2038 322c  .79,.80,.81,.82,
    0x0060:  2038 332c 2038 342c 2038 352c 2038 362c  .83,.84,.85,.86,
    0x0070:  2038 372c 2038 382c 2038 392c 2039 302c  .87,.88,.89,.90,
    0x0080:  2039 312c 2039 322c 2039 332c 2039 342c  .91,.92,.93,.94,
    0x0090:  2039 352c 2039 362c 2039 372c 2039 382c  .95,.96,.97,.98,
    0x00a0:  2039 392c 2031 3030 2c20 3130 312c 2031  .99,.100,.101,.1
    0x00b0:  3032 2c20 3130 332c 2031 3034 2c20 3130  02,.103,.104,.10
    0x00c0:  352c 2031 3036 2c20 3130 372c 2031 3038  5,.106,.107,.108
    0x00d0:  2c20 3130 392c 2031 3130 2c20 3131 312c  ,.109,.110,.111,
    0x00e0:  2031 3132 2c20 3131 332c 2031 3134 2c20  .112,.113,.114,.
    0x00f0:  3131 352c 2031 3136 2c20 3131 372c 2031  115,.116,.117,.1
    0x0100:  3138 2c20 3131 392c 2031 3230 5d         18,.119,.120]
19:25:15.513300 00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 283: (tos 0x0, ttl 64, id 37971, offset 0, flags [none], proto ICMP (1), length 269)
  127.0.0.1 > 127.0.0.1: ICMP echo reply, id 70, seq 2, length 249
    0x0000:  4500 010d 9453 0000 4001 e79a 7f00 0001  E....S..@.......
    0x0010:  7f00 0001 0000 e132 0046 0002 5b36 362c  .......2.F..[66,
    0x0020:  2036 372c 2036 382c 2036 392c 2037 302c  .67,.68,.69,.70,
    0x0030:  2037 312c 2037 322c 2037 332c 2037 342c  .71,.72,.73,.74,
    0x0040:  2037 352c 2037 362c 2037 372c 2037 382c  .75,.76,.77,.78,
    0x0050:  2037 392c 2038 302c 2038 312c 2038 322c  .79,.80,.81,.82,
    0x0060:  2038 332c 2038 342c 2038 352c 2038 362c  .83,.84,.85,.86,
    0x0070:  2038 372c 2038 382c 2038 392c 2039 302c  .87,.88,.89,.90,
    0x0080:  2039 312c 2039 322c 2039 332c 2039 342c  .91,.92,.93,.94,
    0x0090:  2039 352c 2039 362c 2039 372c 2039 382c  .95,.96,.97,.98,
    0x00a0:  2039 392c 2031 3030 2c20 3130 312c 2031  .99,.100,.101,.1
    0x00b0:  3032 2c20 3130 332c 2031 3034 2c20 3130  02,.103,.104,.10
    0x00c0:  352c 2031 3036 2c20 3130 372c 2031 3038  5,.106,.107,.108
    0x00d0:  2c20 3130 392c 2031 3130 2c20 3131 312c  ,.109,.110,.111,
    0x00e0:  2031 3132 2c20 3131 332c 2031 3134 2c20  .112,.113,.114,.
    0x00f0:  3131 352c 2031 3136 2c20 3131 372c 2031  115,.116,.117,.1
    0x0100:  3138 2c20 3131 392c 2031 3230 5d         18,.119,.120]

AFAICT、icmp ヘッダーが間違ってパックされている可能性があります。しかし、それはただの乱暴な刺し傷です。私はもう少し後でそれを見つめます。それまでの間、助けていただければ幸いです。

4

1 に答える 1

4

考慮しなかったことが 2 つあります。

  • この新しいタイプのソケットでメッセージを受信する場合、IP ヘッダーは含まれません。変更するコードは RAW ソケット (受信したメッセージに IP ヘッダーを含めます) を使用することを想定しているため、かなりの数を変更する必要があります。
    • 306行目はICMPヘッダーを抽出しますpacket_data[20:28]が、もちろんIPヘッダーが含まれていないため、20バイトのオフセットは意味がありません. これはなる必要がありますpacket_data[0:8]
    • 行 310 で、コードはパケットの先頭から IP ヘッダーを抽出しようとしますが、そこにはありません。したがって、このコードは実際にガベージを抽出します。TTL などの情報を知りたい場合は、追加のオプションを設定できます (機能を有効にしたパッチに付属のドキュメントを参照してください)。
  • この新しい機能により、カーネルはソケット バインディング メカニズムを通じて ICMP ID を制御します。カーネルに ID を選択させる (暗黙のバインド) か、ID を設定する (明示的なバインド) ことができます。カーネルは自由な ID を選択することを保証するため、暗黙のバインドだけに頼る方がよいでしょう。

    309 行目で、コードは id と を照合して、返信が私たちのものかどうかを確認しself.own_idます。しかし、暗黙的なバインドを使用すると、カーネルが ID を選択します。self.own_idを使用して、カーネルが割り当てた識別子に設定できます

    self.own_id = current_socket.getsockname()[1]
    

    self.send_one_ping(これを221行目の直後に置いてください)

    self.own_idしかし実際には、カーネルは、私たちが見るはずの応答だけを見ることをすでに確認しているので、とにかくチェックする必要さえありません。

于 2012-12-24T16:53:48.263 に答える