2017.03

Debian 2枚挿しNICのルーティングについて考える

同一セグメントと異なるセグメントの検証

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


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

サーバーマシンに2つのネットワークインターフェイスを設定する。

[1] 同一セグメント間のルーティング
[2] 異なるセグメント間のルーティング

それぞれのケースについて考えてみる。

< 環 境 >

route1
--同一セグメントの環境--
[serverA]
eth0   eth1
 address 192.168.1.254/24 address 192.168.1.101/24
 gateway 192.168.1.1
[PC31]   [PC51]
 address 192.168.1.31/24 address 192.168.1.51/24
 gateway 192.168.1.1 gateway 192.168.1.101
[router]
 address 192.168.1.1

route2
--異なるセグメントの環境--
[serverB]
eth0   eth1
 address 192.168.1.254/24 address 192.168.20.101/24
 gateway 192.168.1.1
[PC31]   [PC51]   
 address 192.168.1.31/24 address 192.168.20.51/24
 gateway 192.168.1.1 gateway 192.168.20.1
[router]
 address 192.168.1.1

まずは、検証結果から。

・パケットを受け取ったインターフェイスから返すというのが基本。
・ところが、同一セグメント間を受け渡す環境にある場合は、
  優先順位の高いインターフェイスから返すことになるので、
  ルーティング調整が必要となる。
・ネットワークインターフェイス間で相互にパケットを受け渡しするには、
  IPフォワードとNAT(IPアドレス変換)機能を与えルータ化する。


[1] 同一セグメント間のルーティング

▼検証:同一セグメントの環境

それぞれのパッケトの流れを確認するためにPingを打ってみる

PC31からping 192.168.1.1    PC51からping 192.168.1.1 
.101 .101 
.254 .254 
.51 .31 
ServerAからping 192.168.1.1 
.31 
.51 

更に詳しく、送信元アドレスを指定( -Iオプション)

ServerA:192.168.1.101からping 192.168.1.1    ServerA:192.168.1.254からping 192.168.1.1 
.31    .31 
.51    .51 

送信元物理インターフェイスを指定( -Iオプション)

ServerA:eth0からping 192.168.1.1    ServerA:eth1からping 192.168.1.1 
.31    .31 
.51    .51 

ping

eth0から優先的にpingを出していて、*1.pingキャプチャー
インターフェースに優先順位があるのがわかる。
このため、優先順位の低いインターフェイスから発信するには、
明示的に物理インターフェイスを指定をしなければならない。

▼ルーティングテーブルの確認

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

▼一時的なルーティングの設定

serverA[ServerAで設定]
$ sudo ip route add 192.168.1.51 dev eth1
---PC51へのルートはeth1から流す
---設定は再起動するとリセットされる
$ ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.254
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.101
192.168.1.51 dev eth1

pc51_02これで、ServerAとPC51の相互通信がOK。
しかし、PC31とPC51,PC51とrouterはまだ不通。

▼ServerAのIPフォワード設定   *forward

インターフェイス間を相互に受け渡しして転送する
serverA[ServerAで設定]
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
---設定ファイル編集 IPフォワード機能ON
---コメントアウト"#"外し有効化
$ sudo sysctl --load=/etc/sysctl.conf
---ロードして反映させる
---オプション"-p"でもOK
$ sudo iptables -A FOREARD -p icmp --icmp-type echo-reply -j ACCEPT
$ sudo iptables -A FOREARD -p icmp --icmp-type echo-request -j ACCEPT
---pingの通過(FORWARD)を許可する
$ sudo netfilter-persistent save
---iptablesのルールを更新保存する

▼一時的ルーティング

pc31[PC31で設定] PC51へのルート
$ sudo ip route add 192.168.1.51 via 192.168.1.254
---PC51へのルートは192.168.1.254経由で流す
pc51[PC51で設定] PC33 & routerへのルート
$ sudo ip route add 192.168.1.1 via 192.168.1.101
$ sudo ip route add 192.168.1.33 via 192.168.1.101
pc51_03これで、PC31とPC51との相互通信がOK。
しかし、PC51とrouterは不通のまま。

▼ServerAのNAT設定

routerを直に編集しなくとも、ServerAにNATのルールを与えれば良い。
IPアドレスを変換して受け渡す。

serverA[ServerAで設定]
$ sudo iptables -t NAT -A POSTROUTING -o eth0 -p icmp -j SNAT --to-source 192.168.1.254
---戻りパケットは逆SNATで特に設定しなくとも良い
---"-j SNAT --to-source 192.168.1.254"は、"-j MASQUERADE"でも可

これで、PC51とrouterの相互通信がOK

▼恒常的なルーティングの設定

以上がうまく動作したら、恒常的なルーティングを固める。
serverA[ServerAで設定]
$ sudo systemctl restart networking.service
---ネットワークサービスをリセットする
$ sudo ifdown eth0
$ sudo ifdown eth1
---ネットワークインターフェイスを停止する

$ sudo vi /etc/network/interfaces
## 既存設定 lo,eth0,eth1
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.254
netmask 255.255.255.0
gateway 192.168.1.1
# The subnet interface
allow-hotplug eth1
iface eth1 inet static
address 192.168.1.101
netmask 255.255.255.0
## 恒常的に追加するルーティング
post-up ip route add 192.168.1.51 dev eth1
post-down ip route del 192.168.1.51 dev eth1
#---post-updown 続けてコマンドを書き込む
#---post-up デバイスが有効になった時の処理
#---post-down デバイスが無効になった時の処理
#---ネットワーク指定なら 192.168.1.0/24

$ sudo ifup eth0
$ sudo ifup eth1

pc31pc51[pc31.51で設定]
それぞれのマシンに同じような感で、"/etc/network/interfaces"を編集する。

▼ネットワークインターフェイス優先順位とは

物理インターフェイスの名称ルールとデバイス確認はコチラ

特に同一セグメントのルーティングの場合、どちらのインターフェイスに優先順位があるか。
大雑把に言えば読み込まれた順番らしい。
例えば次のようなルーティングテーブルのケース。

default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.254
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.101
先に立っているeth0の優先順位が上。
明示的なルールがなければ、パケットは通常eth0から出ようとする。
これに対し、eth1の優先順位を上にしたい場合は、eth1を先に読み込ませれば良い。

# ifdown eth0
# ifup eth0
---ifdown eth0,ifdown eth1,ifup eth1,ifup eth0を短縮した操作
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
ただし、この設定は再起動するとリセットされる。

もし、この順位がマシン起動の度に不安定なら、修正する簡単な方法を試してみる。
○"/etc/network/interfases"ファイルの編集
 ・優先順位が高い方をブート時に立ち上げる"auto"スタンザを用いる。
   allow-hotplug eth0 ---> auto eth0

更に、確実な設定としては"rule table"を編集する方法があるようだ。
テーブルを複数もつことができ、送信元を振り分けることや優先順位など、
より詳細で柔軟な操作することができる。
○"rule table"の編集でルーティングを定義する:コチラから


[2] 異なるセグメント間のルーティング

▼検証:異なるセグメントの環境

それぞれのパッケトの流れを確認するためにPingを打ってみる

PC31からping 192.168.1.1    PC51からping 192.168.1.1 
192.168.1.254 192.168.20.101 
192.168.20.51 192.168.1.31 
ServerBからping 192.168.1.1 
192.168.1.31 
192.168.20.51 

▼一時的なルーティング

pc31[PC31で設定]
$ sudo ip route add 192.168.20.51 via 192.168.1.254

pc31[PC51で設定]
特に必要なし

▼IP_Forwarding,NAT

serverB[ServerBで設定]
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
$ sudo sysctl -p
$ sudo iptables -A FOREARD -p icmp --icmp-type echo-reply -j ACCEPT
$ sudo iptables -A FOREARD -p icmp --icmp-type echo-request -j ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o eth0 -p icmp -j MASQUERADE
$ sudo netfilter-persistent save

▼恒常的にルートを設定する

pc31[PC31で設定]
$ sudo systemctl restart networking.service
---ネットワークサービスをリセットする
$ sudo ifdown eth0
---ネットワークインターフェイスを停止する
$ sudo vi /etc/network/interfaces
## 現状の設定
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.33
netmask 225.225.225.0
gateway 192.168.1.1
## PC51へのルーティング
post-up ip route add 192.168.20.51 via 192.168.1.254
down-down ip route del 192.168.20.51 via 192.168.1.254

$ sudo ifup eth0

▼結論

今回のようなケースでは、異なるセグメントに分けてしまった方が面倒がないようだ。


##### 参照

*1. tcpbumpやsyslogを用いてキャプチャすることで、この動きがよく見える。
tcpbumpは コチラ
syslogは コチラ


Copyright(C) green-pen miyagi