at_yasu's blog

ロード的なことを

ICMPのデータ

Pingで使われているICMPのデータ範囲は、適当な(randomな)データになっているので、それを利用してみるテスト。

要は、Pingでファイルを飛ばすって事。


というのも、PerlのNet::PingではICMPのデータ部はrandomで埋められちゃってる。そのデータ部をrandomな羅列ではなく、ファイルの中身にしてPingを飛ばしてみる。

以下、結果とファイルの内容をPing/ICMPで飛ばすコード。


まず送信側のコマンドと出力の一部。

[negro: ~/perls][0:04] $ sudo ./ping_file.pl a-yasui.info netCheck.pl
data:#!/usr/bin/perl -w

# ex ./netCheck.pl [127.0.0.1 [...and more ip]]

use strict;
use Net::Ping;

# regex
my $__n  = qr/[0-9]/i;
my $__tn = qr/$__n{1,3}/i;
my $__ip = qr/$__tn\.$__tn\.$__tn\.$__tn/i;

# default
...


一方で、受信側。まだプログラムはできていないから、tcpdumpで表示。

[top: ~][0:01] $ tcpdump -AxxXX -s 1032 -i fxp0  icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on fxp0, link-type EN10MB (Ethernet), capture size 1032 bytes
00:01:56.163880 IP 192.168.24.51 > top.a-yasui.info: ICMP echo request, id 7272, seq 1, length 1032
        0x0000:  0000 4c87 4d50 0011 2438 0e52 0800 4500  ..L.MP..$8.R..E.
        0x0010:  041c dbcf 0000 4001 e88f c0a8 1833 c0a8  ......@......3..
        0x0020:  18fe 0800 54e2 1c68 0001 2321 2f75 7372  ....T..h..#!/usr
        0x0030:  2f62 696e 2f70 6572 6c20 2d77 0a0a 2320  /bin/perl.-w..#.
        0x0040:  6578 202e 2f6e 6574 4368 6563 6b2e 706c  ex../netCheck.pl
        0x0050:  205b 3132 372e 302e 302e 3120 5b2e 2e2e  .[127.0.0.1.[...
        0x0060:  616e 6420 6d6f 7265 2069 705d 5d0a 0a75  and.more.ip]]..u
        0x0070:  7365 2073 7472 6963 743b 0a75 7365 204e  se.strict;.use.N
        0x0080:  6574 3a3a 5069 6e67 3b0a 0a23 2072 6567  et::Ping;..#.reg
        0x0090:  6578 0a6d 7920 245f 5f6e 2020 3d20 7172  ex.my.$__n..=.qr
        0x00a0:  2f5b 302d 395d 2f69 3b0a 6d79 2024 5f5f  /[0-9]/i;.my.$__
        0x00b0:  746e 203d 2071 722f 245f 5f6e 7b31 2c33  tn.=.qr/$__n{1,3
        0x00c0:  7d2f 693b 0a6d 7920 245f 5f69 7020 3d20  }/i;.my.$__ip.=.
        0x00d0:  7172 2f24 5f5f 746e 5c2e 245f 5f74 6e5c  qr/$__tn\.$__tn\
        0x00e0:  2e24 5f5f 746e 5c2e 245f 5f74 6e2f 693b  .$__tn\.$__tn/i;
        0x00f0:  0a0a 2320 6465 6661 756c 740a 406d 6169  ..#.default.@mai

以下、プログラムコード。

#!/usr/bin/perl -wT
use strict;
use Net::Ping;

our $_DATA_SEGMENT_SIZE = 1024;


sub usage { die "$0 [IP] [File path] : ". join("",@_); }

my $file = '';
my $host = '';

$host = shift @ARGV or usage("none average [host]");
$file = shift @ARGV or usage("none average [file]");

usage("none file ${file}") unless -e $file;

my $icmp_obj = Net::Ping->new('icmp', 5, $_DATA_SEGMENT_SIZE);

open (FILE, "<:raw", $file) or die $!;

my $data = join "" ,<FILE>;

close(FILE);

if (length($data) <  $_DATA_SEGMENT_SIZE) {
    $icmp_obj->{"data"} = $data;
    print "${host} not reachable ", scalar(localtime()),"\n"
        unless $icmp_obj->ping($host);
    print "data:${data}\n";
}
else {
    for (my $i = 0; $i < length($data)% $_DATA_SEGMENT_SIZE; $i++) {
        my $p = substr $data, $_DATA_SEGMENT_SIZE, $i;
        $icmp_obj->{"data"} = $p;
        print "${host} not reachable ", scalar(localtime()),"\n"
            unless $icmp_obj->ping($host);
    }
}

print "end\n";

join "",がちょっとあれだけど、大体こんなものかな?

Enjoy !!