3.4. マルチポートサービスとロードバランサー

マルチポートのロードバランサーサービスを作成する場合、LVS ルーターはどのトポロジーでも追加の設定が必要になります。HTTP (ポート 80) および HTTPS (ポート 443) などの異なる関連するプロトコルをバンドル化するファイアウォールマークを使用したり、FTP などの実際のマルチポートプロトコルを用いてロードバランサーを使用したりする場合、マルチポートサービスは人為的に作成されます。どちらの場合でも、LVS ルーターはファイアウォールマークを使用して異なるポートに送信されるパケットを認識しますが、同じファイアマークが付けられているため同様に処理する必要があります。また、ファイアウォールマークを永続性と組み合わせると、永続性パラメーターによって指定された期間内に接続が発生する限り、クライアントマシンからの接続は同じホストへルーティングされます。
実サーバー上で負荷を分散するために使用されるメカニズムである IPVS は、パケットに割り当てられたファイアウォールマークを認識しますが、IPVS 自体はファイアウォールを割り当てできません。ファイアウォールマークの割り当ては、ネットワークパケットフィルターである iptables が行う必要があります。Red Hat Enterprise Linux 7 のデフォルトのファイアウォール管理ツールは、firewalld で、iptables の設定に使用できます。iptables を直接使用することもできます。Red Hat Enterprise Linux 7 で iptables を使用する方法については、Red Hat Enterprise Linux 7 セキュリティーガイドを参照してください。

3.4.1. firewalld を使用したファイアウォールマークの割り当て

管理者は firewalldfirewall-cmd ユーティリティーを使用して、特定のポートに送信されるパケットにファイアウォールマークを割り当てることができます。
firewalld が稼働していることを確認する必要がある場合は、以下を実行します。
# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Tue 2016-01-26 05:23:53 EST; 7h ago
firewalld を開始するには、以下を入力します。
# systemctl start firewalld
システム起動時に firewalld が有効な状態で開始するようにするには、以下を実行します。
# systemctl enable firewalld
ここでは、HTTP と HTTPS をバンドルする方法を例を用いて説明しますが、FTP も一般的に使用されるクラスター化されたマルチポートプロトコルです。
ファイアウォールマークを使用する場合の基本ルールとして、Keepalived でファイアウォールマークを使用する各プロトコルには、ファイアウォールマークをネットワークパケットに割り当てるための同等のファイアウォールルールが必要になります。
ネットワークパケットのフィルタールールを作成する前に、すでに他のルールが存在しないか確認します。これを行うには、シェルプロンプトを開いて、root でログインして以下を入力します。
# firewall-cmd --list-rich-rules
リッチルールが存在しない場合は、プロンプトがすぐに再表示されます。
firewalld がアクティブでリッチルールが存在する場合は、ルールのセットが表示されます。
すでに存在するルールが重要である場合は、/etc/firewalld/zones/ の内容をチェックし、維持するルールを安全な場所にコピーしてから手順を続行します。コマンドを以下の形式で使用し、不必要なリッチルールを削除します。
firewall-cmd --zone=zone --remove-rich-rule='rule' --permanent
--permanent オプションを指定すると設定が永続化されますが、次回のシステム起動後にコマンドが反映されます。設定を即座に反映する必要がある場合は、--permanent オプションを省略してコマンドを繰り返し実行します。
最初に設定するロードバランサーに関連するファイアウォールルールは、Keepalived サービスの VRRP トラフィックを許可します。以下のコマンドを実行します。
# firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
ゾーンを省略すると、デフォルトのゾーンが使用されます。
以下のルールは、ファイアウォールマーク 80 をポート 80 および 443 上でフローティング IP アドレス n.n.n.n が宛先となる受信トラフィックに割り当てます。
# firewall-cmd --add-rich-rule='rule destination address="n.n.n.n" port=80 protocol=tcp mark set="80"' --permanent
# firewall-cmd --add-rich-rule='rule destination address="n.n.n.n" port=443 protocol=tcp mark set="80"' --permanent
ゾーンを省略すると、デフォルトのゾーンが使用されます。
firewalld のリッチ言語コマンドの使用に関する詳細は、Red Hat Enterprise Linux 7 セキュリティーガイド を参照してください。

3.4.2. iptables を使用したファイアウォールマークの割り当て

特定ポート宛のパケットにファイアウォールマークを割り当てる場合、管理者は iptables を使用できます。
ここでは、HTTP と HTTPS をバンドルする方法を例を用いて説明しますが、FTP も一般的に使用されるクラスター化されたマルチポートプロトコルです。
ファイアウォールマークを使用する場合の基本ルールとして、Keepalived でファイアウォールマークを使用する各プロトコルには、ファイアウォールマークをネットワークパケットに割り当てるための同等のファイアウォールルールが必要になります。
ネットワークパケットのフィルタールールを作成する前に、すでに他のルールが存在しないか確認します。これを行うには、シェルプロンプトを開いて、root でログインして以下を入力します。
/usr/sbin/service iptables status
iptables が実行されていない場合、すぐにプロンプトが再出現します。
iptables がアクティブな場合、ルールセットが表示されます。ルールが存在する場合、以下のコマンドを入力します。
/sbin/service iptables stop
既存のルールが重要な場合、/etc/sysconfig/iptables の内容を確認して、保存する価値のあるルールを安全な場所にコピーしてから継続します。
ファイアウォールルールの設定に関連する最初のロードバランサーは、Keepalived サービスの VRRP トラフィックを許可します。
/usr/sbin/iptables -I INPUT -p vrrp -j ACCEPT
以下のルールは、ファイアウォールマーク 80 をポート 80 および 443 上でフローティング IP アドレス n.n.n.n が宛先となる受信トラフィックに割り当てます。
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 -m multiport --dports 80,443 -j MARK --set-mark 80
初めてルールを発行する前に、root としてログインし、iptables のモジュールをロードする必要があります。
上述の iptables コマンドの n.n.n.n は、使用中の HTTP および HTTPS 仮想サーバーのフローティング IP で置き換える必要が あります。これらのコマンドは、該当するポート上の VIP が送信先となっている全トラフィックをファイアウォールマーク 80 に割り当てることと同様の効果があります。これが IPVS に認識され、適切に転送されます。

警告

上記のコマンドは即座に有効になりますが、システムを再起動すると保持されません。