プロが教える店舗&オフィスのセキュリティ対策術

iptables用に使用するIPアドレス一覧を持っています。
これは1つのアドレスをあらわす表記と、ネットワークアドレスを表す一般的な「/ビット」表記が可能です。

それを、tcprules で使用するためにアドレス表記を変換したいのですが、簡易な関数やツールはありますでしょうか。

(例)
 iptables用
  192.168.0.1
  192.168.0.0/16
  192.168.0.0/18
 tcprules用
  192.168.0.1
  192.168.
  192.168.0-63.

(参考)
 http://www.emaillab.org/djb/tools/ucspi-tcp/tcpr …

A 回答 (1件)

ご希望の形式で出力されれものはないような気がします。


下記のようなコマンドイメージで実行して、その表示結果からご希望の形式に直すというのは駄目ですか?

Perl(非標準モジュール Net::CIDR使用)

○192.168.0.0/16
%perl -e 'use Net::CIDR;print join("\n", Net::CIDR::cidr2octets("192.168.0.0/16"))."\n"'
192.168

○192.168.0.0/18
%perl -e 'use Net::CIDR;print join("\n", Net::CIDR::cidr2octets("192.168.0.0/18"))."\n"'
192.168.0
192.168.1
192.168.2
192.168.3
192.168.4
192.168.5
192.168.6
192.168.7
192.168.8
192.168.9
192.168.10
192.168.11
192.168.12
192.168.13
192.168.14
192.168.15
192.168.16
192.168.17
192.168.18
192.168.19
192.168.20
192.168.21
192.168.22
192.168.23
192.168.24
192.168.25
192.168.26
192.168.27
192.168.28
192.168.29
192.168.30
192.168.31
192.168.32
192.168.33
192.168.34
192.168.35
192.168.36
192.168.37
192.168.38
192.168.39
192.168.40
192.168.41
192.168.42
192.168.43
192.168.44
192.168.45
192.168.46
192.168.47
192.168.48
192.168.49
192.168.50
192.168.51
192.168.52
192.168.53
192.168.54
192.168.55
192.168.56
192.168.57
192.168.58
192.168.59
192.168.60
192.168.61
192.168.62
192.168.63
 
Net::CIDRモジュールはCPANからダウンロード出来ます。
 

参考URL:http://search.cpan.org/~mrsam/Net-CIDR-0.10/CIDR …

この回答への補足

iptables と tcprules でルール設定している例はある程度あるのではないかと思うのですが、知られたアドレス変換関数は無いのでしょうかねぇ。

教えて頂いたモジュールを使って以下のようにして実現できました。

どうもありがとうございました。
----------------------------------------
$ echo $(./conv_ip_fw_tcp "192.168.0./17")
192.168.0-127.
$
----------------------------------------
#!/usr/bin/perl

use strict;
use Net::CIDR;

my $addr_in = $ARGV[0]; # input
my $addr_out; # output
my @list1; # CIDR return

eval{ @list1 = Net::CIDR::cidr2octets( $addr_in );};
die "CIDR ERROR:$@\n" if($@);
my $list1_len = @list1;

if($list1_len == 1){
$addr_out = $list1[0];
}
elsif($list1_len > 1){
my $addr_fr = shift @list1;
my @list_to = split(/\./, pop @list1);
my $addr_to = pop @list_to;
$addr_out = $addr_fr.'-'.$addr_to;
}
my @list2 = split(/\./, $addr_out);
my $list2_len = @list2;

$addr_out .= '.' if($list2_len != 4);
print $addr_out;
----------------------------------------

補足日時:2005/05/12 22:39
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!