3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

Solaris10のスタティックルートとICMPリダイレクト

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

127.0.0.1 127.0.0.1 UH 1 28 lo0

スタティックルートを削除するには以下コマンドを使います。

# 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するとなぜか勝手にルーティングが増殖します。

再起動してもダメでした。その時のルーティングは以下のような状態でした。

bash-3.00# 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

...(省略)...

127.0.0.1 127.0.0.1 UH 18 642 lo0

こちらで意図して設定してないルーティングはのフラグは 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

私的備忘録兼つぶやき:Solaris10 静的ルートの追加と削除

富士通:ネットワークの設定/表示:ルーティング情報の設定