CentOS7のマルチホーム化

サイトの存在を隠しつつも、sftpサーバを公開し、後輩と1G以上のファイルのやりとりしたい。
パブリック側のIPアドレスを教えてしまうと、どこのサーバだろうかとブラウザで開いたりするとサイトの存在がわかってしまう。
このサーバをホストしているConoHaではIPアドレス1個0.5円/時間(350円/月)で、短期間なら安く済むので、IPアドレスを追加し、そのIPアドレスでsftpサーバを公開しようと思う。

ここでは、新NICを1枚追加し、それに新しいIPアドレスを割り当てる。
(NIC2枚構成、1枚には既存のIPアドレス、もう1枚には新しいIPアドレスを割り当てる。)

デフォルトゲートウェイは既存のNIC側なので、外部から新IPアドレスにアクセスがあると
その応答はデフォルトゲートウェイから送信されるので、正常に通信できない。
(送信元から見ると応答がないように見える。)

一方で、ポリシールーティングという技術があり、特定のIPアドレスやポート等を条件にして、ルーティングを制御することができる。

ここでは、ポリシールーティングを使って、既存NICから送信する場合は既存NICのゲートウェイを、新NICから送信する場合は新NICのゲートウェイを使うようにポリシーを作成してルーティングを制御する。

前提

環境

  • CentOS7を使用する。
  • これまではifconfigやnetstat等を提供するnet-toolsを使用していたが、CentOS7からはipコマンド等のiproute2が標準になっているので、それを使用する。
  • CentOS7の元になるrhel7のネタだが、ポリシールーティングの設定方法は次の内容を参考にした。rule-eth*でルーティングの条件を定義、そこで使うルート情報をroute-eth*で定義する。
    How to make routing rules persistent, when I want packets to leave the same interface they came in?
  • CentOS7から、ネットワークの管理機能は、NetworkManagerデーモンが担うとのこと。上記のrule-eth*を実行するためには、NetworkManagerのdispatcher機能を有効にする必要がある。
    RHEL7: ネットワークガイド: 1.3. NETWORKMANAGER について
    Is it possible to set up Policy Based Routing with NetworkManager in RHEL 7?
  • (参考)NetworkManagerは従来のifcfg タイプの設定ファイルもサポートするそうだが、この辺の設定ファイルを実行できるようにするためには、dispatcher機能を有効にする必要がある。ドキュメントの記載はないが、次のファイルで前述のrule-eth0/eth1を実行している。

    /etc/NetworkManager/dispatcher.d/10-ifcfg-rh-routes.sh

手順

次の環境で設定する前提で手順を説明する。
新NICの設定は、nmtui等で設定済みとする。

  • 既存NIC(eth0)
    IPアドレス: 1.1.1.10/24、ゲートウェイ: 1.1.1.254

  • 新NIC(eth1)
    IPアドレス: 2.2.2.20/24、ゲートウェイ: 2.2.2.254

NetworkManagerのdispatcherの有効化

[code gutter=”false”]# yum -y install NetworkManager-config-routing-rules

# systemctl enable NetworkManager-dispatcher.service
# systemctl start NetworkManager-dispatcher.service
[/code]

ルートの定義

main_gw, sub_gwというルートを追加する。
[code gutter=”false” highlight=”14,15″]# cd /etc/iproute2/
# cat rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1inr.ruhep
201 main_gw
202 sub_gw
[/code]

NIC毎の設定

ポリシールーティングのルールやルートを定義する。
定義内容の意味はrhel7のマニュアルを参考にした。
RHEL7: ネットワークガイド: 2.2. ネットワーク設定ファイルの編集

[code gutter=”false” highlight=”4,6,9,11″]# cd /etc/sysconfig/network-scripts/

# cat route-eth0
default via 1.1.1.254 table main_gw
# cat rule-eth0
from 1.1.1.10 table main_gw

# cat route-eth1
default via 2.2.2.254 table sub_gw
# cat rule-eth1
from 2.2.2.20 table sub_gw

# systemctl restart network.service
[/code]

設定内容が反映されたかを確認する。
[code gutter=”false” highlight=”2-5,9,10″]# ip route show
default via 1.1.1.254 dev eth0 proto dhcp metric 100
default via 2.2.2.254 dev eth1 proto static metric 101
1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.10 metric 100
2.2.2.0/24 dev eth1 proto kernel scope link src 2.2.2.20 metric 101

# ip rule show
0:from all lookup local
32764: from 2.2.2.20 lookup sub_gw
32765: from 1.1.1.10 lookup main_gw
32766: from all lookup main
32767: from all lookup default
[/code]

ちなみに、NetworkManagerのdispatcherが有効になっていないと、ip rule showの表示内容に反映されない。また、次のエラーが表示される。
[code gutter=”false”]# cat /var/log/messages|grep NetworkManager

… NetworkManager[xxx]: <warn> [xxx] ifcfg-rh: ‘rule-‘ file is present; you will need to use a dispatcher script to apply these routes

[/code]