makoto_fujimotoのblog

株式会社進角
代表 藤本信のブログです
どうぞよろしくお願いします

ロードバランサ(LB)配下にあるサーバ間で通信したい場合にルーティングがうまくいかないことがあります。そのような場合にhostの名前解決ルールの定義によって解決する方法です。


--FW---LB---SW--+--WebServer1(192.168.150.11)  ↑
+--WebServer2(192.168.150.12) この間でFQDNによる
+--WebServer3(192.168.150.13) 通信が出来ない
+--WebServer4(192.168.150.14) ↓
LB
 ext: 210.*.*.123
 lan: 192.168.150.1
FQDN
 www.shinkaku.jp 210.*.*.123

WebServer間でFQDNによるHTTPリクエストを送る場合、宛先が一旦名前解決されてグローバルIPアドレスとなりますので直近のスイッチ経由でパケットは送られません。そしてロードバランサはExternalのインターフェースからWANに向かってしかパケットを送りませんのでLAN側からのリクエストには応答できません。

そこでサーバサイドから見たネットワークに少しおまじないを加えてあげます。


(1) まずhostsにローカルIPアドレスのFQDNを記載します
# vi /etc/hosts
------------------------
192.168.150.11 www.shinkaku.jp
192.168.150.12 www.shinkaku.jp
192.168.150.13 www.shinkaku.jp
192.168.150.14 www.shinkaku.jp
------------------------
これだけではまだhostsが使用されません

(2) 名前解決ルールを設定
# vi /etc/host.conf
------------------------
order hosts,bind
multi on
------------------------
1行目:名前解決にhostsファイルが優先されます。
2行目:同じFQDNが複数あった場合、複数のIPアドレスを返す設定です。

これらの設定でLBを介さずにサーバ間通信が出来るようになりますが、LBが持つ高度なヘルスチェックやフェイルオーバーならびにL7機能の恩恵を受けることはできません。


(追記:2014.4.30)
よく考えたらサーバでbind(named)を動かしてリゾルバDNSとしてローカルを参照するようにすれば同じようなことが出来そうですね。何と言ってもDNSラウンドロビンが使えるのである程度の負荷分散にもなります。

プライベートアドレスのサーバからルータ経由でメールを送信する場合、相手先のメールサーバによっては送信元が信用できないと判定されて届かない場合があります。

そのような場合はプロバイダから割与えられているアカウントを使用し、サブミッションポート(587)でSMTP認証を行った上で送信する方法があります。これはパソコンのメーラーからメールを送るプロセスと基本的に同じです。

以下はCentOSのPostfixにて設定を行った際の手順メモです。

# cd /etc/postfix

# vi main.cf

変更
#mydomain = domain.tld
mydomain = shinkaku.jp

変更
#myorigin = $mydomain
myorigin = $mydomain

変更
inet_interfaces = localhost
inet_interfaces = all

追加
# リレーホストのための設定
relayhost = [bzmail.plala.or.jp]:587
# リレーホスト先のbzmail.plala.or.jpのSMTP-AUTHのための設定
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth_conf
smtp_sasl_mechanism_filter = CRAM-MD5

sasl認証ファイルの作成
# vi smtp_auth_conf
bzmail.plala.or.jp UserID:password

sasl認証ファイルのハッシュ化
# postmap smtp_auth_conf

パッケージの追加
# yum install cyrus-sasl-md5

postfixの再起動
# service postfix restart

送信テスト
# /usr/lib/sendmail -t email
Subject: test
test
[Ctrl+d]

これでメールが届けば完了ですが、いくつかのドメインや端末宛てに送信テストすることをおススメします。

1台のサーバーで複数のネットワークカードを使用して冗長構成などを行う場合、スタティックルーティング設定だけではパケットの経路が定まらない場合があります。この様なケースではポリシーベースルーティング(ルーティングルール)設定を行う必要があるようです。マルチホーミングとも呼ばれています。

以下のようなネットワーク構成を例にCentOSの設定方法を説明します。
rule_route

それぞれのNICには異なるサブネットの固定IPアドレスが設定されていて、デフォルトゲートウェイが未設定になっていることを前提とします。またL3スイッチにより各VLAN間のルーティングが設定されていることも前提とします。

1. HOST Aにスタティックルーティングを追加
# vi /etc/sysconfig/network-scripts/route-eth0
192.168.102.0/24 via 192.168.101.1 dev eth0
192.168.103.0/24 via 192.168.101.1 dev eth0

# service network restart

# route
------------
Destination    Gateway        Genmask         Flags Metric Ref    Use Iface
192.168.102.0  192.168.101.1  255.255.255.0   UG    0      0        0 eth0
192.168.101.0  *              255.255.255.0   U     0      0        0 eth0
192.168.103.0  192.168.101.1  255.255.255.0   UG    0      0        0 eth0
ink-local      *              255.255.0.0     U     1002   0        0 eth0
------------

2. HOST BにHOST Aへの経路(スタティックルーティング)を追加
# vi /etc/sysconfig/network-scripts/route-eth0
192.168.101.0/24 via 192.168.102.1 dev eth0

# vi /etc/sysconfig/network-scripts/route-eth1
192.168.101.0/24 via 192.168.103.1 dev eth1

# service network restart
経路に問題がある旨のメッセージが出ます。宛先のネットワークが重複しているので一方の経路定義しか有効になりません。
ping結果
HOST A → HOST B (192.168.102.20) OK
HOST A → HOST B (192.168.103.20) NG

3. ルーティングルールの設定
いろいろ調べた結果、ルーティングに条件設定を行う方法が分かりましたので、以下にHOST Bへの設定手順を説明します。

経路テーブルIDの登録
# vi /etc/iproute2/rt_tables
以下の行を追加
200     rule102
201     rule103

ルールファイルの作成
# vi /etc/sysconfig/network-scripts/rule-eth0
from 192.168.102.20 table rule102
「192.168.102.20からの要求があったらrule102に従いなさい」というルールを定義

# vi /etc/sysconfig/network-scripts/rule-eth1
from 192.168.103.20 table rule103
「192.168.103.20からの要求があったらrule103に従いなさい」というルールを定義

ルーティングファイルの修正
# vi /etc/sysconfig/network-scripts/route-eth0
192.168.101.0/24 dev eth0 src 192.168.102.20 table rule102  ...(1)
default via 192.168.102.1 table rule102  ...(2)
(1) 「192.168.101.0/24ゾーンを参照する元ホストがeth0の192.168.102.20だったらrule102に従いなさい」というポリシーを定義
(2) 「rule102のデフォルトゲートウェイは192.168.102.1ですよ」という意味

# vi /etc/sysconfig/network-scripts/route-eth1
192.168.101.0/24 dev eth1 src 192.168.103.20 table rule103
default via 192.168.103.1 table rule103


ネットワークの再起動
# service network restart
エラーが出なければ矛盾は解消されたはずです。
双方のサーバからそれぞれのIPアドレスに対してpingが通れば完了です。

4. まとめ
通常のルーティングテーブルにはルール設定情報は反映されません
# route
------------
Destination    Gateway        Genmask         Flags Metric Ref    Use Iface
192.168.102.0  *              255.255.255.0   U     0      0        0 eth0
192.168.103.0  *              255.255.255.0   U     0      0        0 eth1
ink-local      *              255.255.0.0     U     1002   0        0 eth0
ink-local      *              255.255.0.0     U     1003   0        0 eth1
------------

ルーティングルールの確認方法はこちらになります
# ip rule
0:      from all lookup local
32764:  from 192.168.102.31 lookup rule102
32765:  from 192.168.103.31 lookup rule103
32766:  from all lookup main
32767:  from all lookup default

# ip route show rule102
192.168.101.0/24 dev eth0  scope link  src 192.168.102.20
default via 192.168.102.1 dev eth0

# ip route show rule103
192.168.101.0/24 dev eth1  scope link  src 192.168.103.20
default via 192.168.103.1 dev eth1

↑このページのトップヘ