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 を使用したファイアウォールマークの割り当て
管理者は
firewalld
の firewall-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 family="ipv4" destination address="n.n.n.n/32" port port="80" protocol="tcp" mark set="80"' --permanent # firewall-cmd --add-rich-rule='rule family="ipv4" destination address="n.n.n.n/32" port port="443" protocol="tcp" mark set="80"' --permanent # firewall-cmd --reload success # firewall-cmd --list-rich-rules rule protocol value="vrrp" accept rule family="ipv4" destination address="n.n.n.n/32" port port="80" protocol="tcp" mark set=80 rule family="ipv4" destination address="n.n.n.n/32" port port="443" protocol="tcp" mark set=80
ゾーンを省略すると、デフォルトのゾーンが使用されます。
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 に認識され、適切に転送されます。
警告
上記のコマンドは即座に有効になりますが、システムを再起動すると保持されません。