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 !!