|||||||||||||||||||||

なんぶ電子

- 更新: 

WindowsやDebianでルーティング

Windowsのrouteコマンド

ネットの世界で、ルーティングというとルーターを想像しますが、これはルーターに限った機能ではなく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コマンドで確認できます。

# 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コマンドの出力結果の意味」を参考にさせていただきました。

  • セレクタ

    セレクタには通常「from all」が入っています。これはすべての通信を対象にするものです。allの代わりに「IPアドレス/マスク長」として送信元による条件を加えたり、fromをtoにして宛先アドレス毎に変更したり、先頭に「not」を付けて反転させたりできます。詳しくは「man ip route」で表示されます。

  • アクション

    アクションには通常「lookup テーブルID」が入っています。これは指定されたルーティングテーブルを参照する指示です。

ルーティングポリシーの追加や削除するには次のようにします。ここでは優先順位=50、テーブルID=110のテーブルを追加し、使われていないdefaultテーブルを削除してみたいと思います。ポリシーから削除しても各テーブルに設定済みのルールは消えません。

# ip rule add table 100 pri 50
# ip rule del teble default

ルーティングテーブル操作(Debian)

Debianでルーティングテーブルを操作するには、ipコマンドを利用します。ルーティングの追加や修正には管理者権限が必要です。

ipコマンド全体としての書式は次のようになります。

ip [オプション] オブジェクト [サブコマンド]

ipコマンドのオプションとして代表的なものは「-4」「-6」などのIPのバージョンを絞り込むものがあります。

ルーティングの設定では、オブジェクトにrouteを指定してサブコマンドにaddやdeleteを指定して引数をあたます。

先ほどのルーティングポリシーはオブジェクトにruleを指定していました。またよくインターフェースの確認に使う「ip a(address)」もそのコマンド体系のひとつです。

ルーティングを設定するコマンドは全体として次のようになります。

ip route <cmd> [<table <ID>] <dst> via <gw> dev <int>
  • 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 の行を追加し後に実行したいコマンドを記述するなどといった方法をとって再起動時に設定を復旧させます。


参考にさせていただきましたサイトの皆様、ありがとうございました。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告