Debian rule tableの編集について

ソースルーティング&優先順位を定める

### First, please visit -----------
Introduction & INDEX コチラから
------------------------------ ###


注記) 2017.9
   Debian9 stretchのリリースで、ネットワークインターフェイス(NIC)の命名方法が新しくなりました。
   ens0やenp1s1(ethernet)、wlp3s0(wlan)のような名称を生成し、お使いのマシン環境で異なるようです。
   確認方法: $ ip a
   本ページ中のNIC名称: eth0 を新しい名称に読み替えてください。
   なお、固定IPアドレスの設定方法について(Debian9 stretch Xfce)は、コチラもご参考ください。

Linuxのルーティングでは、複数のテーブルを持つことで通信経路を制御できる。
それぞれのテーブルに対し送信先、送信元、インターフェイスや優先順位を指定して
ルールを適用する。

▼ デフォルトテーブルと表示内容
$ sudo ip rule list

PrioritySelectorAction
0:  from all lookup local
32766:from alllookup main
32767:from alllookup default

デフォルトでは、local,main,defaultの3つのルールテーブルが用意されていてる。

priority:数値が低いほど優先順位が高い
Selector:from PREFIX(source/送信元 PREFIX all=0.0.0.0/0=0/0)
to PREFIX(destination/送信宛先)
iif NAME(incoming device e.g.eth1)
oif(outgoing device),tos,fwmark
Action:local,main,default,TABLE_IDを適用する

Priority値に従い優先度が高いルール順に、
SelectorにマッチしたパッケットはActionで指定するテーブルが適用される。

3つのデフォルトテーブルについて、"man ip rule"から。
*Priority:0の"local table(ID 255)"は、
  ローカルループバックやブロードキャストアドレスのテーブルで、
  一番優先度が高く、削除できない。
*Priority:32766の"main table(ID 254)は、
  通常のルートテーブル("ip route show"や"netstat -nr"で表示される)で、
  削除もしくは他のルールを上書きできる。
*Priority:32767の"default table(ID 253)は、
  中身が空で、他のどのルールにも当てはまらなかった場合の予備テーブル。
  削除できる。

▼ ルールテーブルの操作(追加・削除)
< コマンド : ip rule >
$ sudo ip rule add from 192.168.10.0/24 table 200 prio 100
---送信元ネットワークアドレス192.168.10.0/24からのパッケットは、
   TABLE_ID:100 優先順位:300のテーブルを
   適用する、というルールを追加する

$ ip rule list
0:  from all  lookup local
300:from 192.168.10.0/24  lookup 100
32766:from all  lookup main
32767:from all  lookup default

$ sudo ip rule del table 100
---TABLE_ID:100のルールテーブルを削除する

▼ ルールテーブルの中にルーティングを定義する
< コマンド : ip route >
$ ip route add table 100 default via 192.168.10.1 dev eth1
$ ip route add table 100 192.168.10.0/24 dev eth1 src 192.168.10.101
---TABLE_ID:100のテーブルに新たなルーティングを定義する

$ ip route show table 100
---TABLE_ID:100のルーティング情報を表示する

▼ TABLE_IDに名前を与える
編集File : /etc/iproute2/rt_tables
e.g.
100  miyagi_table

▼ 同一セグメントのこんな環境では、ど〜なの?

Q.困ったケース:router側のeth0からのping通信が、
                疎通できないだけど。。

$ ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.101
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.254
192.168.1.51 dev eth1

A1.応答(echo reply)ができればいいのなら、
   こんな感でしょうか。
$ sudo ip rule add from 192.168.1.254 table 200 prio 100
$ sudo ip route add table 200 dev eth0 src 192.168.1.254
---LANポートeth0:192.168.1.254から出るパケットは、
   main tableより優先するTABLE_ID:200を適用する

A2.受発信とも常に通信経路を優先するなら、こんな感かな。
$ sudo ip rule add from 0/0 table 200 prio 100
$ sudo ip route add table 200 default via 192.168.1.1 dev eth0
$ sudo ip route add table 200 192.168.1.0/24 dev eth0 src 192.168.1.254
$ sudo ip route add table 200 192.168.1.51/32 dev eth1 src 192.168.1.101
---これでうまく通信するなら"/etc/network/interfaces"に追記
post-up ip rule add from 0/0 table 200 prio 100
post-up ip route add table 200 default via 192.168.1.1 dev eth0
post-up ip route add table 200 192.168.1.0/24 dev eth0 src 192.168.1.254
post-up ip route add table 200 192.168.1.51/32 dev eth1 src 192.168.1.101
post-down ip rule del table 200

Copyright(C) green-pen miyagi