インフラエンジニアの井上です。
この記事は TECHSCORE Advent Calendar 2016 の 24 日目の記事です。
CentOS7のネットワーク設定仕方を考える場面がありましたので、記録として書きます。
きっかけについて
複数のネットワークインターフェースを持つCentOS7のサーバを構築した際に、確認した話です。
CentOS7では、NetworkManagerを介したネットワーク設定が作法とされています。
私は、これまでは設定ファイルを直接書き換えてきましたがCentOS7の作法に従って
少し複雑なネットワーク設定を伴った、NetworkManagerを介した設定をしてみることにしました。
通常通信ができない例について
前提は以下の通りです。
- サーバは複数(今回の例では3つ)のネットワークに接続されている
- サーバのデフォルトゲートウェイはインターネット側のゲートウェイに向いている
- 通信相手の端末(以下、PCと表記)とサーバは違うネットワークセグメントに所属している
- PCとサーバの間にはルータ(ルータAと定義)が存在する
- サーバにはデフォルトゲートウェイしか設定されていない
- PCからのサーバへリクエストを送信して、応答を受け取りたい
図にすると以下のイメージになります。
それぞれのIPアドレスなどの情報は以下の表の前提通りです。
追加ルーティングを設定しない場合、赤矢印のような通信となり、青矢印の通信はできません。
これは、サーバがPCが所属するネットワークの情報を持っていないため、デフォルトゲートウェイ側に応答を流す為です。
対策には以下の2つの方法あります。
- サーバ上で、routeコマンドを発行し、PCへの経路を定義する
- スタティックルートをサーバに設定する
前者は、一時的に通信が行えるようになります。しかし、再起動を行った場合、再度、コマンドを発行するまで通信ができません。
そのため、後者を選択します。今回、CentOS7での作法に従いNetworkManagerを介した設定を実施します。
実施した手順について
手順は次の通りです。
- nmcliコマンドでルーティングを対象とするネットワークインターフェースのUUIDを調べます。
「nmcli connection show」とコマンドを発行し、ネットワークインターフェースのUUID一覧を取得します。
12345[root@foobar ~]# nmcli connection show名前 UUID タイプ デバイスeth0 9eXXXXX2-05b2-3XX4-993f-edf89cd9c88a 802-3-ethernet eth0eth1 2d837115-4f89-XXXX-ab9c-24XXXXa520531 802-3-ethernet eth1eth2 2XXXX458-8bdf-XXXX-95fc-664XXXX5aef9 802-3-ethernet eth2
- 前項で取得したUUIDを指定してルーティングを行うためのコマンドを発行します。フォーマットは次の通りです。
1nmcli connection modify uuid デバイスのUUID ipv4.routes "目的のネットワークセグメント 経路のルータのIP"
今回のケースの場合、以下のコマンドを発行します。
1nmcli connection modify uuid 2XXXX458-8bdf-XXXX-95fc-664XXXX5aef9 ipv4.routes "172.16.1.0/24 172.16.0.254"
コマンドを実行後、ネットワークサービスを再起動すれば、通信が可能となります。
複数の追加ルーティングを行うために
上記では、ルーティングを1つだけ追加する方法を記載しました。
ここでは、補足として、2つ以上ルーティングを追加する方法を記載します。
ルーティングを設定するコマンドのオプションである「ipv4.routes」を「 +ipv4.routes」(+が増えた)に書き換え、追加のルーティングを行うためのコマンドを発行します。
以下は、上記前提において、172.16.2.0/24のネットワークがルータAの先にある場合のコマンド発行例です。
1 |
nmcli connection modify uuid 2XXXX458-8bdf-XXXX-95fc-664XXXX5aef9 +ipv4.routes "172.16.2.0/24 172.16.0.254" |
反映確認には「nmcli device show インターフェース名」を実行します。実行結果の「IP4.ルート」の項目に2つめの設定が確認できます。
設定確認方法として以下があります。
- 「ip route show」コマンドを発行してルーティングテーブルを確認
- 「ip route get IPアドレス」というコマンドを発行して、目的のIPアドレスへの通信は「どのインターフェースを使って、どのIPアドレスを経路とするか」を確認
後者の実行例と結果は以下の通りです(目的の通信相手が172.16.2.1の場合)。
1 2 |
[root@foobar ~]# ip route get 172.16.2.1 172.16.2.1 via 172.16.0.254 dev eth1 src 172.16.0.1 |
最後に
設定ファイルの編集のみで、対応せず、柔軟に新しい手法を学び利用していきたいと考えます。