Solaris10で静的ルートを追加する方法です。
一時的(再起動するまで)に追加する方法は以下のとおりです。
# route add 10.0.12.0/24 192.168.0.24
add net 10.0.12.0/24: gateway 192.168.0.24
永続的に追加する場合、以下のように -p オプションを付けます。
# route -p add 10.0.12.0/24 192.168.0.24
add net 10.0.12.0/24: gateway 192.168.0.24
add persistent net 10.0.12.0/24: gateway 192.168.0.24
-pオプションをつけると、/etc/inet/static_routes ファイルに設定が追加されます。
ただ、このファイルは手で直接触ってはいけないようです。
# cat /etc/inet/static_routes
# File generated by route(1M) - do not edit.
10.0.12.0/24 192.168.0.24
ルートを確認するには Solaris の場合、netstat -rn を使います。
# netstat -rn
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ---------- ---------
192.168.0.0 192.168.0.1 U 1 2 e1000g0
10.0.12.0 192.168.0.24 UG 1 0
224.0.0.0 192.168.0.101 U 1 0 e1000g0
スタティックルートを削除するには以下コマンドを使います。
# route delete 10.0.12.0/24 192.168.0.24
delete net 10.0.12.0/24: gateway 192.168.0.24
永続的にスタティックルートを削除するには、-pをつけます。
# route -p delete 10.0.12.0/24 192.168.0.24
delete net 10.0.12.0/24: gateway 192.168.0.24
delete persistent net 10.0.12.0/24: gateway 192.168.0.24
さて、あるSolarisサーバにスタティックルートを設定し運用してましたが、ネットワーク構成の変更に伴い静的ルーティングを削除しました。
しかし、netstat -rnするとなぜか勝手にルーティングが増殖します。
再起動してもダメでした。その時のルーティングは以下のような状態でした。
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ---------- ---------
default 192.168.0.1 UG 1 3094
192.168.0.0 192.168.0.11 U 1 8 e1000g0
192.168.1.5 192.168.0.2 UGHD 1 1
192.168.1.6 192.168.0.2 UGHD 1 1
192.168.1.7 192.168.0.2 UGHD 1 1
192.168.1.10 192.168.0.2 UGHD 1 1
192.168.1.11 192.168.0.2 UGHD 1 1
192.168.1.12 192.168.0.2 UGHD 1 1
192.168.1.13 192.168.0.2 UGHD 1 1
...(省略)...
こちらで意図して設定してないルーティングはのフラグは UGHD になっています。
フラグの意味については、FreeBSDの資料になりますが、静的ルーティングを見ると、以下の意味でした。
U:使用可能
H:ホスト単位の設定
G:ゲートウェイ
D:ICMP redirectによって経路が自動的に変更された
S:手動で経路追加された
ここで怪しいと思ったのは Flags のDである ICMP リダイレクトというものです。
恥ずかしながら、今までICMP Redirectというものを知りませんでした。
ICMPリダイレクトについては、ICMP(Internet Control Message Protocol)その5や
@IT:基礎から学ぶWindowsネットワーク 2.ICMPメッセージ(2)、@IT:ICMPリダイレクト使用時のファイアウォール設定に注意などでどういうものか詳しく説明されています。
要は、同じセグメントに複数のルータがある場合、デフォルトゲートウェイとなっているルータがクライアントに「このルートは別のルータ通したほうがよいよ」ということを教え、クライアントは自身のルーティングテーブルのその情報を追加するわけですね。
Solarisだと上記のフラグでICMPリダイレクトによって追加されたルートということがわかりますが、WindowsOSの場合、route print コマンドでサブネットマスクが 255.255.255.255 になっているものがICMPリダイレクトによって追加されたルートになるようです。
また、Windowsの場合、以下のコマンドでどれくらいICMP Redirectパケットを受け取ったかがわかります。
netstat -s -p icmp
ICMPv4 Statistics
Received Sent
Messages 3498388 3477291
Errors 848 0
Destination Unreachable 30481 187
Time Exceeded 2 131
Parameter Problems 0 0
Source Quenches 0 0
Redirects 438 0 ←ここの数
Echos 3185110 291863
Echo Replies 281510 3185110
Timestamps 0 0
Timestamp Replies 0 0
Address Masks 0 0
Address Mask Replies 0 0
Solarisの場合、以下コマンドでICMPリダイレクトを無視するかどうかがわかります。
bash-3.00# ndd -get /dev/ip ip_ignore_redirect
0
0ならICMP redirectを無視しない、1なら無視ということでしょう。
以下のようにするとICMPリダイレクトを無視する設定に出来ます。
bash-3.00# ndd -set /dev/ip ip_ignore_redirect 1
また、ICMPリダイレクトによって作られた経路情報の保持期間は以下のコマンドでわかります。
bash-3.00# ndd -get /dev/ip ip_ire_redirect_interval
60000
ただ時間の単位がわからなかったんですよね。
おそらくミリ秒じゃないかなと思うんですが。。
このあたりのパラメータが、/dev/ip ドライバの設定パラメーター[nddコマンド][NICドライバ、TCP/IPパラメータ関連] - Solaris Userが参考になります。
nddコマンドについては、Solarisネットワークチューニングが参考になります。
今回は、同じセグメント内にルータ一つとL3スイッチが1つ有り、デフォルトゲートウェイになっているL3スイッチが気をきかせすぎてもう一つのルータ向けの通信を検知するとICMPリダイレクトパケットを流していたようです。
こう考えると、一つのセグメントには一つのゲートウェイだけ持たすのがシンプルでいいですね。
参考:
ルーティング設定 | hajichan.net technical version