StaticRoute設定をした話

# はじめに
この度、所属プロジェクトでStaticRoute設定をしたので、記載します。
環境はCentOS7.9です。
```bash
$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
```

# StaticRouteとは？

管理者が宛先ネットワークへの最適なルートを設定したルートのことです。
Linuxの世界では`/etc/sysconfig/network-scripts/route-ethX`に記載することによる永続的な設定（再起動した後でも継続して設定される）と`route`コマンドや`ip`コマンドによる一時的な変更をする方法の2通りの設定方法があります。

# 事前確認
まずは`netstat`コマンドで現在のルーティングの状態を確認してみましょう。
```bash:コマンド
$ netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         100.64.200.223  0.0.0.0         UG        0 0          0 eth2
100.64.102.0    0.0.0.0         255.255.254.0   U         0 0          0 eth5

~中略～

172.31.196.128  172.30.245.254  255.255.255.128 UG        0 0          0 eth0
```
最初の`Destination`は宛先ネットワークを、そして`Gateway`はパケットを転送するルータ、`Genmask`はサブネットを示しています。
`Flags`のU フラグは送信経路が up 状態であること、G フラグは送信経路がゲートウェイ（以降、GWと記載する。）へのものであることを示します。H フラグは宛先がネットワークではなく、完全指定のホストアドレス（/32）であることを示しています。
`MSS`は Maximum Segment Size を表します。`Window`は TCP window sizeを示します。この２つはよく知らない、且つ気にしたこともないです。

最後の `Iface`は、ルーティングインターフェースを示します。

設定内容についても少し触れます。最初の`0.0.0.0 `が宛先アドレスがない場合に使用できる経路の「デフォルトルート」となります。つまりそれ以降の`Destination`列の宛先で該当するものがなければ、`100.64.200.223`のGatewayに割り振られることとなります。
デフォルトルート設定は`/etc/sysconfig/network`に設定されます。設定中身は以下の通りで`GATEWAY=`で設定を行います。
```bash:/etc/sysconfig/network
NETWORKING=yes
NOZEROCONF=yes
NETWORKING_IPV6=no
IPV6FORWARDING=no
IPV6_AUTOCONF=no
GATEWAY=100.64.200.223
```

# ルーティングの追加（永続設定）

コマンドで一時的に追加しただけでは、サーバー再起動などをしてしまうと消えてしまいます。
そこで再起動してもルーティングが消えない永続設定をします。
`/etc/sysconfig/network-scripts/route-ethX`に記載することで永続設定をすることができます。
### 既存設定ファイルの確認

```bash:既存ファイルの設定内容確認 
$ ll /etc/sysconfig/network-scripts/route-eth*
-rw-r--r-- 1 root root 283  7月 30 17:35 /etc/sysconfig/network-scripts/route-eth0
-rw-r--r-- 1 root root  35  7月 30 17:35 /etc/sysconfig/network-scripts/route-eth1
-rw-r--r-- 1 root root  70  7月 30 17:35 /etc/sysconfig/network-scripts/route-eth4

$ cat /etc/sysconfig/network-scripts/route-eth0
172.21.201.0/24 via 172.30.245.254
172.31.195.0/25 via 172.30.245.254
172.31.196.0/25 via 172.30.245.254
172.31.195.128/25 via 172.30.245.254
172.31.196.128/25 via 172.30.245.254
172.21.225.0/24 via 172.30.245.254
172.21.237.0/24 via 172.30.245.254
172.30.77.0/26 via 172.30.245.254

$ cat /etc/sysconfig/network-scripts/route-eth1
100.65.204.0/22 via 100.64.207.254

$ cat /etc/sysconfig/network-scripts/route-eth4
100.65.195.0/25 via 100.64.195.254
100.64.195.0/25 via 100.64.195.254
```

### 今回追加したいこと
`172.31.224.0/23`のアドレス帯向けの通信を
`172.30.245.254`のGWを通す形でスタティックルート設定をしたい。

### 追加作業
数台程度であれば、viで記載してもよいですが、コマンドで追記したほうが簡単です。
ブロードキャストやansibleでやれば一瞬で終わります。
```bash:
echo '172.31.224.0/23 via 172.30.245.254' >> /etc/sysconfig/network-scripts/route-eth0
```
networkの再起動をする。

```text:再起動
$ sudo /etc/init.d/network restart
```
再度ルーティングテーブル確認をする。
```bash:コマンド(grepかけてます)
$ netstat -nr | egrep Destination|^172.31.224.0
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
172.31.224.0  172.30.245.254  255.255.254.0  UG        0 0          0 eth0
```
追加されました。


## 一時的な追加
一時的な追加は`ip`コマンドでの追加となります。
```bash:コマンド
$ sudo ip route add 172.31.141.207/32 via 172.30.245.254 dev eth0
$
$ netstat -nr | grep 172.31.141.207
172.31.141.207  172.30.245.254  255.255.255.255 UGH       0 0          0 eth0
```
## 一時的な削除
一時的な削除は`ip`コマンドでの削除となります。

```bash:コマンド
$ netstat -nr | grep 172.31.141.207
172.31.141.207  172.30.245.254  255.255.255.255 UGH       0 0          0 eth0

$ sudo ip route del 172.31.141.207/32
$ netstat -nr | grep 172.31.141.207
### 何も出ない！
```

## そういえばどのethファイルで設定すればよいの？
既存の設定ファイルがあれば、route-ethXファイル内の`via`以降をみれば分かりますが、そのethに対して初めて設定する場合は記載がないので、分からないですよね。
その場合は`ifconfig`をたたいて確認しましょう。
```bash:ifconfig
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.30.245.15  netmask 255.255.255.0  broadcast 172.30.245.255
        ether fa:16:3e:9f:12:a7  txqueuelen 1000  (Ethernet)
        RX packets 32794093  bytes 2756994961 (2.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1787539  bytes 2649771082 (2.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.64.204.19  netmask 255.255.252.0  broadcast 100.64.207.255
        ether fa:16:3e:75:5e:11  txqueuelen 1000  (Ethernet)
        RX packets 135279103  bytes 12739714526 (11.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 73474995  bytes 9602836628 (8.9 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.64.200.207  netmask 255.255.255.128  broadcast 100.64.200.255
        ether fa:16:3e:ae:9a:06  txqueuelen 1000  (Ethernet)
        RX packets 131868206  bytes 10906997905 (10.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 49781970  bytes 4556337046 (4.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.64.193.169  netmask 255.255.255.128  broadcast 100.64.193.255
        ether fa:16:3e:2f:29:a0  txqueuelen 1000  (Ethernet)
        RX packets 149428083  bytes 10657969006 (9.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 50756402  bytes 4592856708 (4.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.64.195.160  netmask 255.255.255.128  broadcast 100.64.195.255
        ether fa:16:3e:33:0c:ab  txqueuelen 1000  (Ethernet)
        RX packets 326062375  bytes 39811374535 (37.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 422798714  bytes 39139274189 (36.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.64.102.161  netmask 255.255.254.0  broadcast 100.64.103.255
        ether fa:16:3e:81:69:0f  txqueuelen 1000  (Ethernet)
        RX packets 205280165  bytes 13208536531 (12.3 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 99787  bytes 197507781 (188.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 95564501  bytes 6893647458 (6.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 95564501  bytes 6893647458 (6.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```
例えば、`eth0`の`inet`のIPアドレス`172.30.245.15`となっています。`inet`はサーバ本体のアドレスとなります。このアドレスのGWは、172.30.245.254となります。
第３オクテットまで同じですね。
GWアドレスが正しいかは社内のNW図など、ドキュメントでも確認するとよいでしょう。
ifconfigの詳細パラメータは以下記事が参考になります。

https://qiita.com/pe-ta/items/aff8db72530c6baa11b2



# おわりに

もうStaticRouteは怖くない。
常に情報はアップデートしていこうと思います。