カスタム検索
このエントリーをはてなブックマークに追加
tomo.gif (1144 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)To previous pageTo home pageMailing to me

IPルータの実験

Modified: 25 January 2006

Linuxのルーティングのドキュメント
http://www.linux.or.jp/JF/JFdocs/Adv-Routing-HOWTO/


IPフォワードを有効にする方法 - CentOS3 (25 January 2006)

CentOS3で実験

IPフォワードのテスト
ちょっと複雑にしてみる
- ポリシールーティングの必要性
ポリシールーティングの設定

サーバーの死活状態を調べるスクリプト
ZONEファイルを書き換えるスクリプト


IPフォワードを有効にする方法 - CentOS3 

"/etc/sysctl.conf" を開いて、"net.ipv4.ip_forward" を "1" にして保存します。

# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

以下のコマンドで反映させます。

# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
#

多くの情報では以下のコマンドで設定するよう書かれていますが、CentOS3では、設定できません。

# echo 1 > /proc/sys/net/ipv4/ip_forward

IPフォワードのテスト 

"ipr00"から、ネットワーク(192.168.4.0/24)、"ipr01"、ネットワーク(192.168.5.0/24)を経由しての、"ipr03"のPING応答を確認します。


"ipr00"の設定

"192.168.5.0"へのパケットが、"192.168.0.0/24"でなく、"192.168.4.0/24"に出て行くように設定します。

# route add -net 192.168.5.0 gw 192.168.4.211 netmask 255.255.255.0

設定を確認します。

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.5.0     192.168.4.211   255.255.255.0   UG    0      0        0 eth1
192.168.4.0     *               255.255.255.0   U     0      0        0 eth1
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
default         192.168.0.254   0.0.0.0         UG    0      0        0 eth0
# 


"ipr01"の設定

IPフォワードを有効にする方法」で、IPフォワードを有効にします。

この設定を行うと、恒久的に設定が有効になります。


"ipr03"の設定

"192.168.4.0"へのリターンパケットが、"192.168.0.0/24"でなく、"192.168.5.0/24"に出て行くように設定します。

# route add -net 192.168.4.0 gw 192.168.5.211 netmask 255.255.255.0

設定を確認します。

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.5.0     *               255.255.255.0   U     0      0        0 eth1
192.168.4.0     192.168.5.211   255.255.255.0   UG    0      0        0 eth1
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
default         192.168.0.254   0.0.0.0         UG    0      0        0 eth0
# 

起動時に自動起動させるためには、以下の内容で、"/etc/sysconfig/static-routes" を作ります。

any net 192.168.4.0 netmask 255.255.255.0 gw 192.168.5.211


"ipr00(
192.168.4.210)"からPINGしてみる

# ping 192.168.5.213
PING 192.168.5.213 (192.168.5.213) 56(84) bytes of data.
64 bytes from 192.168.5.213: icmp_seq=0 ttl=63 time=9.44 ms
64 bytes from 192.168.5.213: icmp_seq=1 ttl=63 time=1.93 ms
64 bytes from 192.168.5.213: icmp_seq=2 ttl=63 time=131 ms
         :
#

"ipr01"で確認してみる。"eth1"が、"192.168.4.211"です。"eth1"を通過していることが確認できました。

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
19:46:03.649232 IP 192.168.4.210 > 192.168.5.213: icmp 64: echo request seq 6
19:46:03.683459 IP 192.168.5.213 > 192.168.4.210: icmp 64: echo reply seq 6
19:46:04.580890 IP 192.168.4.210 > 192.168.5.213: icmp 64: echo request seq 7
19:46:04.604346 IP 192.168.5.213 > 192.168.4.210: icmp 64: echo reply seq 7
         :
# 

"ipr01"で確認してみる。"eth2"が、"192.168.5.21"です。"eth2"を通過していることが確認できました。

# tcpdump -i eth2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 96 bytes
19:46:09.941418 IP 192.168.4.210 > 192.168.5.213: icmp 64: echo request seq 12
19:46:09.966915 IP 192.168.5.213 > 192.168.4.210: icmp 64: echo reply seq 12
19:46:10.797947 IP 192.168.4.210 > 192.168.5.213: icmp 64: echo request seq 13
19:46:10.826143 IP 192.168.5.213 > 192.168.4.210: icmp 64: echo reply seq 13
          :
# 

"ipr03"で確認してみる。"eth1"が、"192.168.5.213"です。"eth1"を通過していることが確認できました。

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
19:51:06.258661 IP 192.168.4.210 > 192.168.5.213: icmp 64: echo request seq 0
19:51:06.342739 IP 192.168.5.213 > 192.168.4.210: icmp 64: echo reply seq 0
19:51:07.609178 IP 192.168.4.210 > 192.168.5.213: icmp 64: echo request seq 1
     :
# 

ちょっと複雑にしてみる - ポリシールーティング 

"ipr03"から"ipr00"への経路を複数設けてみた。

経路1は、"ipr03"の"192.168.5.213"から、"ipr01"の"192.168.5.211"、"ipr01"の"192.168.4.211"を経由して、"ipr00"の"192.168.4.210"に行くルートであり、

経路2は、"ipr03"の"192.168.6.213"から、"ipr02"の"192.168.6.212"、"ipr02"の"192.168.4.212"を経由して、"ipr00"の"192.168.4.210"に行くルートである。

"ipr00"から"ipr01"をゲートウエイとして"ipr03"にPINGしても、"ipr00"から"ipr02"をゲートウエイとして"ipr03"にPINGしても、応答するように設定したい。

複数の経路があると、通常の"route"コマンドでは設定できません。つまり、"ipr03"は、どちらに応答パケットを返すかを固定的に決めることはできません。

"ipr01"から来たパケットの応答は、"ipr01"へ返し、"ipr02"から来たパケットの応答は、"ipr02"へ返すように、来たほうへ返す処理が必要となります。

このルーティング方法を、ポリシールーティングと呼ぶそうです。


ポリシールーティングの設定 

"ipr03"の設定準備

機能がカーネルに組み込まれているかどうかを確認する。

以下のように表示されればOKである。

# ip rule
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
# 

"/etc/iproute2/rt_tables"に、独自のテーブル名("ipr")を追加します。

 ルーティングテーブルは、256個持つことができ、値の小さいものから評価されるそうです。

#
# reserved values
#
#255    local
#254    main
#253    default
#0      unspec
#
# local
#
#1      inr.ruhep

10 ipr

設定確認をします。

 未登録だとエラーが出ますので、エラーが出なければOKです。

# ip route show table ipr
# 


"ipr03"の設定

まず通常のルートを設定します。
"192.168.4.0/24"から来たパケットは、"ipr01"の"192.168.5.211"に返します。

# route add -net 192.168.4.0 gw 192.168.5.211 netmask 255.255.255.0

ただし、"192.168.6.212"から来たパケットは、"192.168.6.211"に返す、という設定をします。

# ip route add default via 192.168.6.212 table ipr
# ip rule add from 192.168.6.212 table ipr
# ip route flush cache

起動時に自動設定するには、"/etc/sysconfig/static-routes"を以下の内容で作ります。

any net 192.168.4.0 netmask 255.255.255.0 gw 192.168.5.211

以下は、自動起動設定の方法がわからないので、"/etc/rc.local" に記述しました。(ご存知の方お教えください)

ip route add default via 192.168.6.212 table ipr
ip rule add from 192.168.6.212 table ipr
ip route flush cache


"ipr00"の設定

# route add -net 192.168.5.0 gw 192.168.4.211 netmask 255.255.255.0
# route add -net 192.168.6.0 gw 192.168.4.212 netmask 255.255.255.0

設定を確認します。

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.6.0     192.168.4.212   255.255.255.0   UG    0      0        0 eth1
192.168.5.0     192.168.4.211   255.255.255.0   UG    0      0        0 eth1
192.168.4.0     *               255.255.255.0   U     0      0        0 eth1
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
default         192.168.0.254   0.0.0.0         UG    0      0        0 eth0
# 

起動時に自動設定するには、"/etc/sysconfig/static-routes"を以下の内容で作ります。

any net 192.168.5.0 netmask 255.255.255.0 gw 192.168.4.211
any net 192.168.6.0 netmask 255.255.255.0 gw 192.168.4.212


動作確認

まずは、どちらのルートでも応答が帰ってきましたので、成功です。

# ping 192.168.6.213
PING 192.168.6.213 (192.168.6.213) 56(84) bytes of data.
64 bytes from 192.168.6.213: icmp_seq=0 ttl=63 time=307 ms
64 bytes from 192.168.6.213: icmp_seq=1 ttl=63 time=367 ms
64 bytes from 192.168.6.213: icmp_seq=2 ttl=63 time=5.54 ms
      :
# ping 192.168.5.213
PING 192.168.5.213 (192.168.5.213) 56(84) bytes of data.
64 bytes from 192.168.5.213: icmp_seq=0 ttl=63 time=16.7 ms
64 bytes from 192.168.5.213: icmp_seq=1 ttl=63 time=6.34 ms
64 bytes from 192.168.5.213: icmp_seq=2 ttl=63 time=3.73 ms
      :
# 

ルートも確認してみます。

# traceroute 192.168.5.213
traceroute to 192.168.5.213 (192.168.5.213), 30 hops max, 38 byte packets
 1  192.168.4.211 (192.168.4.211)  118.056 ms  4.296 ms  3.823 ms
 2  192.168.5.213 (192.168.5.213)  191.520 ms  6.631 ms  5.945 ms
# traceroute 192.168.6.213
traceroute to 192.168.6.213 (192.168.6.213), 30 hops max, 38 byte packets
 1  192.168.4.212 (192.168.4.212)  5.930 ms  4.005 ms  4.468 ms
 2  192.168.6.213 (192.168.6.213)  135.457 ms  86.672 ms  187.934 ms
# 

サーバーの死活状態を調べるスクリプト 

以下のスクリプトを実行すると、死活状態を、簡単な文字列("UP"または"DOWN")で出力できます。

#!/bin/sh

IPA=192.168.0.211
PING='ping -w 2 -c 1'

TARGET="UP"

checkalive() {
        $PING $IPA || $PING $IPA || $PING $IPA
}
checkalive > /dev/null 2>&1 || TARGET="DOWN"

echo $TARGET

実行してみます。ping応答があれば、"UP"と表示されます。

# sh check-alive.sh
UP
#

サーバーをとめて実行してみます。ping応答がないので、"DOWN"と表示されます。

# sh check-alive.sh
DOWN
#

ZONEファイルを書き換えるスクリプト 

ここでは、Perlによる方法と、M4を使う方法を紹介していますが、「ダイナミックDNSの実験」を参考に、BINDの動的更新機能を使うのがお勧めです。


Perlで書き換える方法

以下のPerlプログラム("changezone.pl")を作ります。

#!/usr/bin/perl

open(SF, "tomohisa.src") || die "Can't open: $!\n";
open(OF, "> tomohisa.com") || die "Can't open newfile: $!\n";
while(<SF>) {
    my $line = $_;
    if($ARGV[0] eq 'DOWN') {
        $line =~ s/WEB_IP/192.168.0.212/g;
    } else {
        $line =~ s/WEB_IP/192.168.0.211/g;
    }
    print OF $line;
}
close(OF);
close(SF);

以下のようなソースファイルを作成します。

$TTL    3D
tomohisa.com. IN SOA ipr09.tomohisa.com. info.ipr09.tomohisa.com. (
                        2006010100      ; serial
                        28800           ; refresh
                        14400           ; retry
                        3600000         ; expiry
                        38400 )         ; minimum

tomohisa.com.           IN NS   ipr09.tomohisa.com.

tomohisa.com.           IN A    192.168.0.219
web.tomohisa.com.       IN A    WEB_IP

以下のコマンドを実行する。

# perl changezone.pl UP

以下のように書き換えられます。

        :
web.tomohisa.com.       IN A    192.168.0.211
        :

以下のコマンドを実行する。

# perl changezone.pl DOWN

以下のように書き換えられます。

        :
web.tomohisa.com.       IN A    192.168.0.212
        :


Makeファイルで書き換える方法

最初の3行にマクロ定義(M4)を行っています。条件によって、"WEB_IP"をIPアドレスに書き換えます。

ソースファイルを作成します。

ifdef(`DOWN',
`define(`WEB_IP', `192.168.0.212')',
`define(`WEB_IP', `192.168.0.211')')
$TTL    3D
tomohisa.com. IN SOA ipr09.tomohisa.com. info.ipr09.tomohisa.com. (
                        2006010100      ; serial
                        28800           ; refresh
                        14400           ; retry
                        3600000         ; expiry
                        38400 )         ; minimum

tomohisa.com.           IN NS   ipr09.tomohisa.com.

tomohisa.com.           IN A    192.168.0.219
web.tomohisa.com.       IN A    WEB_IP

以下のファイルを作成し、"Makefile"というファイル名で保存します。

M4OPT =
SRC = tomohisa.src
all: tomohisa.com

tomohisa.com: ${SRC}
        cat ${SRC} | m4 ${M4OPT} > $@

DOWN:
        touch ${SRC}
        ${MAKE} M4OPT=-DDOWN

UP:
        touch ${SRC}
        ${MAKE} M4OPT=-DUP

以下のコマンドを実行する。

make UP

以下のように書き換えられます。

        :
web.tomohisa.com.       IN A    192.168.0.211
        :

以下のコマンドを実行する。

make DOWN

以下のように書き換えられます。

        :
web.tomohisa.com.       IN A    192.168.0.212
        :

To previous pageTo home pageMailing to meJump to Top of pageline.gif (927 ツバツイツト)line.gif (927 ツバツイツト)tomo.gif (1144 ツバツイツト)
カスタム検索



このエントリーをはてなブックマークに追加