どんな時にスタティックルート設定が必要になるのか

社内のプライベート網につながっているサーバが一台あるとします。

そして、そのサーバは、会社のオフィスと離れた東京都内のデータセンターにあり、以下のように二つのネットワーク・インタフェースが付いているとします。

  • eth0 : 社内プライベート通信用
  • eth1 : グローバル通信用

そして、やりたいのは以下の作業です。

  • オフィスからサーバへの SSH 接続は、社内プライベート網経由で行う
  • グローバル経由で直接インターネットからファイルをダウンロードしたり、プロキシを使わずに yum update したい

こういう時に有効に使えるのが スタティックルート (静的ルート) です。

こういう構成でよく使われる設定方法として、プライベート側はデフォルトゲートウェイ無し+スタティックルートを設定し、デフォルトゲートウェイをグローバルに向ける 方法があります。

今回は、スタティックルートの設定方法について、以下の 2パターンをご紹介します。

  • スタティックルート設定 その1. CentOS 6 用 (設定ファイル)
  • スタティックルート設定 その2. CentOS 7 用 (nmcli コマンド)

デフォゲをグローバル側に向ける理由やりとり

後輩後輩

先輩!

先輩先輩

うん?

後輩後輩

デフォゲをグローバルに向けないと行けないのはなぜですか?

先輩先輩

うむ。。いい質問だね

例えばさー

後輩後輩

はい

先輩先輩

社内環境だと 「オフィス ⇔ サーバ」 間の通信経路って私たちが知ってるじゃん

後輩後輩

はい、それはそうですけど

先輩先輩

そう。 プライベート網に関しては、私たちがその通信経路を判断できるわけさ

後輩後輩

ふむ。。

先輩先輩

ただね。 グローバルに関してはどうなん?

後輩後輩

それは。。

先輩先輩

グローバル IP は日本に限らず、全世界の人が使っているでしょう?

プライベート側だと私たち SE さんがサーバ側で通信経路の制御が出来るんだけど、グローバルだとパケットがどこから飛んでくるか分からないし、予想できないじゃん

後輩後輩

ふむふむ

先輩先輩

だからプライベート側の通信は、例えば、社内 DNS サーバとか、NTP サーバとか、社内網の特定セグメントとの通信に関しては、私たちが直接スタティックルートを書いて制御すれば OK~

それ以外のどこから飛んでくるか分からない通信に関してはグローバル側に向けることによって、グローバル側の通信が出来るようにするわけさ~

後輩後輩

先輩、、 ♥。♥

先輩先輩

おい! 目がハート型になってるぞ!

スタティックルートの目的と設定の概要

このように、スタティックルートの目的は、特定のセグメント・サブネット、もしくは特定の IP に対して、その通信経路 (Destination) を決定させることです。

社内のオフィスから遠隔地にあるサーバへ Ping 疎通、もしくは SSH 接続しようとした時に、ネットワーク的につながっている状態であれば、そのパケットはサーバに届きます。

オフィスからの SSH 接続によってサーバに届いたパケットは、当然パケットを返そうとしますが、サーバ側で戻りの経路が何も設定されてない状態だとそのパケットを返すことが出来ません。 (サーバは、戻りの経路を知らない)

例えば、オフィスにあるクライアント側の Windows 端末 (サーバに Ping を打つマシン) に以下の IP アドレス・サブネット が設定されているとします。

クライアント側の IP アドレス情報Raw Code(S)Raw Code(T)
C:\> ipconfig
Windows IP 構成

・・・

イーサネット アダプター ローカル エリア接続:

   接続固有の DNS サフィックス . . . :
   IPv4 アドレス . . . . . . . . . . : 10.240.10.10
   サブネット マスク . . . . . . . . : 255.255.255.0
   デフォルト ゲートウェイ . . . . . : 10.240.10.1

・・・

そして、クライアントがサーバに Ping を打った時に、サーバ側で Echo Reply を返すようにするためには、以下のようにスタティックルート・デフォルトゲートウェイを設定します。

eth0 : プライベート側

eth1 : グローバル側

Device
Network/Subnet
Gateway
Default Gateway
Static Route
(Destination → Gateway)
eth0
(ens160)
10.10.10.0/24
10.10.10.1
10.0.0.0/8 → 10.10.10.1
eth1
(ens192)
200.200.200.0/27
200.200.200.1
200.200.200.1

こうすることによって、社内プライベート網 10. 台のセグメント である 10.0.0.0/8 宛ての通信は、全て eth0 (ens160) が返すようになります。

ちなみに、ルータ側のフィルタ (IN・OUT) と サーバ側のファイアウォール (iptables) は論外とします。

この例では、ドカンと 10.0.0.0/8 に対するルートを設定しているのですが、もっと細かく、10.240.10.0/24 → 10.10.10.1 のように特定セグメントに対して経路を設定することもできるし、10.240.10.10/32 → 10.10.10.1 のようにピンポイントで特定の IP アドレスに対して経路を設定することも出来るので、環境に合わせて設定してください。

スタティックルート設定 その1. CentOS 6 用 (設定ファイル)

CentOS 6 スタティックルート設定 構成図

以下は、CentOS 6 で普通に設定ファイルをいじってスタティックルートを設定する例です。

デバイスに IP アドレスも何も設定されてない状態から始めます。

Step 1. 設定前のデバイス状態確認

まずは、デバイスの状態を確認します。

eth0eth1 に IP アドレスはまだ設定されていません。

デバイス状態確認Raw Code(S)Raw Code(T)
# ip a
・・・
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:50:56:95:f5:a5 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:50:56:95:e2:ab brd ff:ff:ff:ff:ff:ff

Step 2. プライベート側・グローバル側 : IP アドレス設定

プライベート側 eth0 とグローバル側 eth1 の IP アドレスを設定します。

/etc/sysconfig/network-scripts/ifcfg-eth0Raw Code(S)Raw Code(T)
DEVICE=eth0
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
USERCTL=no
IPADDR=10.10.10.10
NETWORK=10.10.10.0
NETMASK=255.255.255.0
PEERDNS=no
/etc/sysconfig/network-scripts/ifcfg-eth1Raw Code(S)Raw Code(T)
DEVICE=eth1
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
USERCTL=no
IPADDR=200.200.200.10
NETWORK=200.200.200.0
NETMASK=255.255.255.224
PEERDNS=no

Step 3. プライベート側 : スタティックルート設定

プライベート側のスタティックルートを設定します。

この例では、10.0.0.0/8 から接続がきた場合には、eth0 経由で、ゲートウェイは 10.10.10.1 ですよーと。 経路を設定してあげます。

ちなみに、複数設定したい場合には、一行単位で経路を追加してください。

/etc/sysconfig/static-routesRaw Code(S)Raw Code(T)
any net 10.0.0.0 netmask 255.0.0.0 gw 10.10.10.1 dev eth0

Step 4. グローバル側 : デフォルトゲートウェイ設定

後は、サーバのデフォゲをグローバルに向けます。

こうすることによって、グローバルからの接続は、全てグローバル側のゲートウェイである 200.200.200.1 へ返すようになります。

/etc/sysconfig/networkRaw Code(S)Raw Code(T)
NETWORKING=yes
HOSTNAME=localhost
GATEWAY=200.200.200.1

Step 5. 設定反映

設定が終わったらネットワークを再起動し、設定を反映させます。

ネットワーク再起動Raw Code(S)Raw Code(T)
# service network restart

Step 6. 設定確認

最後に、IP アドレス設定確認と経路が意図した通りになっているか確認します。

IP アドレス設定確認Raw Code(S)Raw Code(T)
# ip a
・・・
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:95:f5:a5 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.10/24 brd 10.10.10.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:95:e2:ab brd ff:ff:ff:ff:ff:ff
    inet 200.200.200.10/27 brd 200.200.200.31 scope global eth1
ルーティングテーブル確認Raw Code(S)Raw Code(T)
# ip route
200.200.200.0/27 dev eth1  proto kernel  scope link  src 200.200.200.10
10.10.10.0/24 dev eth0  proto kernel  scope link  src 10.10.10.10
169.254.0.0/16 dev eth0  scope link  metric 1002
169.254.0.0/16 dev eth1  scope link  metric 1003
10.0.0.0/8 via 10.10.10.1 dev eth0
default via 200.200.200.1 dev eth1

スタティックルート設定 その2. CentOS 7 用 (nmcli コマンド)

CentOS 7 スタティックルート設定 構成図

以下は、CentOS 7 の nmcli コマンドを使って、スタティックルートを設定する例です。

同じく、デバイスに IP アドレスも何も設定されてない状態から始めます。

Step 1. 設定前のデバイス状態確認

まずは、デバイスの状態を確認します。

ens160ens192 に IP アドレスはまだ設定されていません。

デバイス状態確認Raw Code(S)Raw Code(T)
# nmcli d
デバイス  タイプ    状態                       接続
ens160    ethernet  接続中(IP 設定を取得中)  ens160
ens192    ethernet  接続中(IP 設定を取得中)  ens192
lo        loopback  管理無し                   --

# nmcli d show
GENERAL.デバイス:                       ens160
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           00:50:56:95:91:EE
GENERAL.MTU:                            1500
GENERAL.状態:                           70 (接続中(IP 設定を取得中))
GENERAL.接続:                           有線接続 1
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/0
WIRED-PROPERTIES.キャリア:              オン

GENERAL.デバイス:                       ens192
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           00:50:56:95:27:A6
GENERAL.MTU:                            1500
GENERAL.状態:                           70 (接続中(IP 設定を取得中))
GENERAL.接続:                           有線接続 1
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/5
WIRED-PROPERTIES.キャリア:              オン

・・・ loopback デバイス省略 ・・・

Step 2. プライベート側 : IP アドレス設定、及びスタティックルート設定

プライベート側 ens160 に対して、IP アドレスとスタティックルートを設定します。

この例では、10.0.0.0/8 から接続がきた場合には、eth0 経由で、ゲートウェイは 10.10.10.1 ですよーと。 経路を設定します。

複数の経路を設定したい場合には、3 行目 をマネって設定してください。

ens160 : IP / 静的ルート設定Raw Code(S)Raw Code(T)
# nmcli c mod ens160 ipv4.addresses 10.10.10.10/24
# nmcli c mod ens160 ipv4.gateway ""
# nmcli c mod ens160 ipv4.routes "10.0.0.0/8 10.10.10.1"
# nmcli c mod ens160 ipv4.method manual

Step 2. グローバル側 : IP アドレス設定、及びデフォルトゲートウェイ設定

グローバル側 ens192 に対して、IP アドレスとデフォルトゲートウェイを設定します。

サーバのデフォルトゲートウェイをグローバルに向けることによって、グローバルからの接続は、全てグローバル側のゲートウェイである 200.200.200.1 へ返すようになります。

ens192 : IP / デフォゲ設定Raw Code(S)Raw Code(T)
# nmcli c mod ens192 ipv4.addresses 200.200.200.10/27
# nmcli c mod ens192 ipv4.gateway 200.200.200.1
# nmcli c mod ens192 ipv4.method manual

Step 3. 設定反映

設定が終わったらネットワークを再起動し、設定を反映させます。

ネットワーク再起動Raw Code(S)Raw Code(T)
# systemctl restart network

Step 4. 設定確認

最後に、IP アドレス設定の確認と経路が意図した通りになっていることを確認します。

IP / ルート設定確認Raw Code(S)Raw Code(T)
# nmcli d show
GENERAL.デバイス:                       ens160
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           00:50:56:95:91:EE
GENERAL.MTU:                            1500
GENERAL.状態:                           100 (接続済み)
GENERAL.接続:                           ens160
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/14
WIRED-PROPERTIES.キャリア:              オン
IP4.アドレス[1]:                        10.10.10.10/24
IP4.ゲートウェイ:
IP4.ルート[1]:                          dst = 10.0.0.0/8, nh = 10.10.10.1, mt = 100
IP6.ゲートウェイ:

GENERAL.デバイス:                       ens192
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           00:50:56:95:55:DD
GENERAL.MTU:                            1500
GENERAL.状態:                           100 (接続済み)
GENERAL.接続:                           ens192
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/15
WIRED-PROPERTIES.キャリア:              オン
IP4.アドレス[1]:                        200.200.200.10/27
IP4.ゲートウェイ:                       200.200.200.1
IP6.ゲートウェイ:

・・・ loopback デバイス省略 ・・・

# cat /etc/sysconfig/network-scripts/route-ens160
ADDRESS0=10.0.0.0
NETMASK0=255.0.0.0
GATEWAY0=10.10.10.1
ルーティングテーブル確認Raw Code(S)Raw Code(T)
# ip route
default via 200.200.200.1 dev ens192  proto static  metric 100
10.0.0.0/8 via 10.10.10.1 dev ens160  proto static  metric 100
10.10.10.0/24 dev ens160  proto kernel  scope link  src 10.10.10.10  metric 100
200.200.200.0/27 dev ens192  proto kernel  scope link  src 200.200.200.10  metric 100

終わりに

CentOS 6 と CentOS 7 に分けてご紹介しましたが、Ubuntu とか他のディストリビューションによって設定ファイルの書き方が異なったりするかもしれないですけど、設定のポイントさえ抑えておけば、他のディストリビューションでも普通に設定できると思います。

ちなみに、もっと細かく切る場合には以下のような感じで。

/etc/sysconfig/static-routesRaw Code(S)Raw Code(T)
#### for Office
any net 10.240.10.0 netmask 255.255.255.0 gw 10.10.10.1 dev eth0

#### for DNS
any net 10.10.20.0 netmask 255.255.255.0 gw 10.10.10.1 dev eth0

#### for NTP
any net 10.10.30.0 netmask 255.255.255.0 gw 10.10.10.1 dev eth0

以上、CentOS スタティックルート設定でした。