WindowsやDebianでルーティング
ネットの世界で、ルーティングというとルーターを想像しますが、これはルーターに限った機能ではなくDebianやWindowsなどのOSにも備わっています。なので、用途によってはWindowsやDebian上で求めているルーティングが実現できることもあります。ここでは、それらの機能について書き残しておきます。
ちなみにDebianOSを使ってインターネットルーターを作成した記事もリンク先で紹介していますので、合わせてお読みいただければと思います。
Windowsのルーティングテーブル操作
windowsではPowerShellから「route print」というコマンドを実行することで、ルーティング周辺の情報を確認することができます。
インタフェース一覧では現在のNICの情報を表示しています。このリストの最初の数値をインターフェース番号として、ルート設定時に使用します。
IPv4ルートテーブルが、現在PCに設定してあるルーティングテーブルになります。
ネットワーク宛先とネットマスクで構成されている条件に一致した場合、ゲートウェイで設定してあるアドレスに送信します。複数NICがあった場合にどこから発信するかがインターフェースのエントリーに記されています。NICに設定しているIPアドレスが表示されています。
0.0.0.0となっているのがデフォルトゲートで、他のルールに一致しなかった場合のルールです。
メトリックは複数の条件に一致した際の優先順位となります。値が小さい方が優先されます。
同様にIPv6用のテーブルも保持しています。
IP Forward(Windows10)
デフォルトだと複数NICがあった際、それぞれのNIC間の通信はできないようになっています。
そこで、@IT:「Windowsのレジストリを設定してIPルーティングを有効にする」を参考に、レジストリの修正をします。
「HKLM¥SYSTEM¥CurrentControlSet¥Services¥Tcpip¥Parameters」の「IPEnableRouter」としてREG_DWORD値1を設定します。
ルーティングテーブルの操作(Windows)
route -hコマンドで表示さるように、主なルーティングテーブルの操作は次のようになります。このIFの項目に渡すのが先ほどroute printで表示したインターフェース番号になります。routeコマンドは管理者権限が必要です。
ROUTE [-f] [-p] [-4|-6] command [destination] [MASK netmask] [gateway] [METRIC metric] [IF interface]
主なオプションの説明は次の通りになっています。
- -f
ルーティングテーブルをクリアします。
- -p
通常コマンドで加えたルーティングテーブルは再起動時にはクリアされますが、それを永続します。
- -4,-6
それぞれ、IPv4,IPv6の使用を強制するオプションです。
- command
上記書式におけるcommandにはルートを表示するPRINT、ルートに加えるADD、削除するDELETE、変更するCHANGEがあります。
- destination
宛先を設定します。
- MASK
MASKに続いてサブネットマスクを設定します。255.255.255.0といった形式で指定します。
- gateway
ゲートウェイを指定します。
- interface
データを送出するインターフェースを、インターフェース番号で指定します。
- METRIC
優先順位を数値で設定します。低い方が優先順位が高いです。
他のコマンド(Windows)
- ipconfig
NICやそれに設定されたIPアドレスの情報を表示します。/allオプションをつけると詳細情報が表示されます。
- ping
引数にIPアドレスを指定して疎通確認に使う、おなじみのコマンドです。
- tracert
指定したIPまでのルートの各ゲートウェイにpingを実行し、目的地まで疎通を確認します。ネットワーク中のどこで接続できなくなるのか判定するのに使います。
- arp -a
認識しているIPアドレスとマックアドレスの結びつけ一覧(ARPテーブル)を出力します。 IPv6(ND)を出力したい場合は、MURA's HomePageによると、IPv6版のarp -aは「netsh interface ipv6 show neighbors」だということです。
ルーティングポリシー(Debian)
DebianにあるルーティングテーブルはWindowsより少し複雑になります。それはルーティングポリシーと呼ばれるものが存在して、ルーティングテーブルが複数の階層を構成しているためです。まずはそのルーティングポリシーについてみていきます。
ルーティングポリシーはip rule listコマンドで確認できます。
ID | セレクタ | アクション |
0: | from all | lookup local |
220: | from all | lookup 220 |
32766: | from all | lookup main |
32767: | from all | lookup default |
色付けした部分は、筆者が挿入した部分で、それぞれの意味を表しています。IDは文字通りID、セレクタは条件、アクションはセレクタに一致した場合のアクションが設定されています。
- ID
この例では、IDが、local、220、main、defaultというテーブルが表示されています。ルーティングポリシーを意識せずにルーティングを操作した場合は、mainテーブルに書き込まれます。
ルーティングをする際、このルーティングポリシーを参照し、優先順位の若いものから判定していき、ルート情報を得られた段階で検索は終了します。
localテーブルはカーネルが管理するテーブルで、localアドレスとbroadcastアドレスで構成されます。また、defaultテーブルは通常空の予備テーブルです。
それらのテーブルに設定されているルーティング情報を表示するには「ip route [show table テーブル名]」として表示させることができます。show table テーブル名の部分を省略するとmainテーブルを表示します。
ip route show table main none default via 192.168.11.1 dev wifi0 proto unspec metric 0 none 192.168.11.0/24 dev wifi0 proto unspec metric 256 none 192.168.11.2 dev wifi0 proto unspec metric 256 ...
この出力で表示される主なキーワードの意味するものは次の通りです。
- via
NEXT HOP値
- dev
送信されるイーサネットアダプタ名
- proto
staticだと静的ルーティング、kernelだとカーネルによるルーティングです。
- scope
linkの場合は直接接続、hostの場合は自身への接続
- src
送信元となるIPアドレス
これらの情報は、Qiita:「ip routeコマンドの出力結果の意味」を参考にさせていただきました。
- via
- セレクタ
セレクタには通常「from all」が入っています。これはすべての通信を対象にするものです。allの代わりに「IPアドレス/マスク長」として送信元による条件を加えたり、fromをtoにして宛先アドレス毎に変更したり、先頭に「not」を付けて反転させたりできます。詳しくは「man ip route」で表示されます。
- アクション
アクションには通常「lookup テーブルID」が入っています。これは指定されたルーティングテーブルを参照する指示です。
ルーティングポリシーの追加や削除するには次のようにします。ここでは優先順位=50、テーブルID=110のテーブルを追加し、使われていないdefaultテーブルを削除してみたいと思います。ポリシーから削除しても各テーブルに設定済みのルールは消えません。
# ip rule del teble default
ルーティングテーブル操作(Debian)
Debianでルーティングテーブルを操作するには、ipコマンドを利用します。ルーティングの追加や修正には管理者権限が必要です。
ipコマンド全体としての書式は次のようになります。
ipコマンドのオプションとして代表的なものは「-4」「-6」などのIPのバージョンを絞り込むものがあります。
ルーティングの設定では、オブジェクトにrouteを指定してサブコマンドにaddやdeleteを指定して引数をあたます。
先ほどのルーティングポリシーはオブジェクトにruleを指定していました。またよくインターフェースの確認に使う「ip a(address)」もそのコマンド体系のひとつです。
ルーティングを設定するコマンドは全体として次のようになります。
- cmd
deleteまたはadd
- table ID
先のポリシーで作成した任意のテーブルにルールを追加したい場合はtableのあとにIDを渡します。tableの表記を省略するとmainテーブルに適用されます。
- dst
宛先ネットワークアドレス 192.168.1.0/24という書式で記述します。
- gw
ゲートウェイアドレスです。
- int
インターフェース名(eth0など)もしくはインターフェースのIPアドレスです。
IP Forward(Debian)
Debianにおいても、NIC間の通信はデフォルトで禁止されています。許可するためには/etc/sysctl.confに設定を記述します。おそらくコメントアウトした状態で入っているので、解除するだけになっています。
/etc/syctl.conf
... # コメントアウトを解除(IPv4用) net.ipv4.ip_forward=1 ... # コメントアウトを解除(IPv6用) net.ipv6.conf.all.forwarding=1 ...
この設定はOSを再起動するか、「sysctl -p」を実行すると反映されます。
他のコマンド(Debian)
- ping
- ip a
NICの一覧を出すコマンドです。Windowsだとipconfig /allでDNS情報も得られますが、Debianでは表示されませんので、/etc/resolve.confを読みだして確認します。
- ip route get アドレス
アドレスを指定して、ルーティングポリシーのどのルールでデータが送出されるか確認することができます。
出力結果は次のようになります。
192.168.1.1 via 123.456.789.9 dev ens3 table 220 src 123.456.789.1 uid 0 - traceroute
Debianではデフォルトでtracertがありません。APTで「traceroute」をインストールして利用します。
- ip neigh
記憶しているIPとMACアドレスの組み合わせの表を出力します。こちらはIPv6(ND)も表示されます。こちらの情報はQuiita:「IPv6の近隣探索について:ついでにIPv6でarping的なことをするコマンドを紹介したい」を参考にさせていただきました。
ルーティングテーブルの永続化(Debian)
Debianにおいては、ルーティングポリシーやルーティングテーブルは再起動時には消えてしまいます。
そこで、「/etc/network/if-up.d」のインターフェース稼働時に、起動させるshスクリプトに記述するか、「/etc/network/interfaces」の対象インターフェースのエントリーにpost-up の行を追加し後に実行したいコマンドを記述するなどといった方法をとって再起動時に設定を復旧させます。
参考にさせていただきましたサイトの皆様、ありがとうございました。