CorosyncとPacemakerを実行する2つのHAロードバランサー(hollywood
とwolfman
)があります。 eth1
インターフェイスはWANに接続され、eth0
インターフェイスはLANに接続され、仮想IPをバックエンドサーバーのゲートウェイとして使用します。 hollywood
のeth1
IPはxxx.xxx.195.45
であり、wolfman
のeth1
IPはxxx.xxx.195.46
です。 Corosyncのbindnetaddr
は、WANのネットワークアドレスと同じxxx.xxx.195.32
であり、Corosyncポートはデフォルトの5405
です。
両方のサーバーに関連するIPテーブルルールは次のとおりです。
*filter
--flush
:INPUT DROP
--append INPUT --protocol udp --destination-port 5404 --jump ACCEPT
--append INPUT --protocol udp --destination-port 5405 --jump ACCEPT
この設定はうまく機能しているようですが、最初に--in-interface eth1
と--source xxx.xxx.195.46
をwolfman
に、--source xxx.xxx.195.45
をhollywood
に追加しました。ほとんどの場合、これは機能しているように見えましたが、パッシブバランサーを再起動すると、ロードバランサー間の通信が停止し、これらのエラーがsyslogに書き込まれました。
[TOTEM]オペレーティングシステムまたはネットワークの障害のため、Totemはクラスターを形成できません。このメッセージの最も一般的な原因は、ローカルファイアウォールが正しく構成されていないことです。
したがって、すべてのCorosyncトラフィックがeth1
を介して2つのロードバランサー間に直接あるという私の単純な信念は間違っているか、何か他のことが問題を引き起こしているようです。
IPTablesでポート5404/5405
をクラスターのみにロックしたい。これを実現するにはどうすればよいですか?
編集:要求に応じてcorosync.conf
。これは、bindnetaddr
以外のすべてのデフォルトのUbuntuです。
# Please read the openais.conf.5 manual page
totem {
version: 2
# How long before declaring a token lost (ms)
token: 3000
# How many token retransmits before forming a new configuration
token_retransmits_before_loss_const: 10
# How long to wait for join messages in the membership protocol (ms)
join: 60
# How long to wait for consensus to be achieved before starting a new round of membership configuration (ms)
consensus: 3600
# Turn off the virtual synchrony filter
vsftype: none
# Number of messages that may be sent by one processor on receipt of the token
max_messages: 20
# Limit generated nodeids to 31-bits (positive signed integers)
clear_node_high_bit: yes
# Disable encryption
secauth: off
# How many threads to use for encryption/decryption
threads: 0
# Optionally assign a fixed node id (integer)
# nodeid: 1234
# This specifies the mode of redundant ring, which may be none, active, or passive.
rrp_mode: none
interface {
# The following values need to be set based on your environment
ringnumber: 0
bindnetaddr: xxx.xxx.195.32
mcastaddr: 226.94.1.1
mcastport: 5405
}
}
amf {
mode: disabled
}
service {
# Load the Pacemaker Cluster Resource Manager
ver: 0
name: pacemaker
}
aisexec {
user: root
group: root
}
logging {
fileline: off
to_stderr: yes
to_logfile: no
to_syslog: yes
syslog_facility: daemon
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
tags: enter|leave|trace1|trace2|trace3|trace4|trace6
}
}
マルチキャスト通信(Corosyncのデフォルト)を使用する場合は、IGMPトラフィックを許可する必要があり、Corosyncパケットは、他の回答よりも具体的なルールで許可できます。次のルールで十分です(OUTPUT
チェーンがトラフィックをブロックしないことを前提としています):
iptables -A INPUT -p igmp -i $corosync_interface -j ACCEPT
for src_addr in $ip_addr_self $ip_addr_partner1 $ip_addr_partner2; do
iptables -A INPUT -i $corosync_interface -s $src_addr -d $ip_addr_self \
-p udp --source-port $(($corosync_port - 1)) \
--destination-port $corosync_port -j ACCEPT
iptables -A INPUT -i $corosync_interface -s $src_addr -d $ip_addr_mcast \
-p udp --source-port $(($corosync_port - 1)) \
--destination-port $corosync_port -j ACCEPT
done
この例では、以下の変数が定義されていると想定されています。
$corosync_interface
:Corosyncが使用するネットワークインターフェイス$ip_addr_self
:CorosyncがローカルにバインドするIPアドレス(corosync.conf
でbindnetaddr
として指定)$ip_addr_partner1
、$ip_addr_partner2
:他のCorosyncノードのIPアドレス-クラスターに4つ以上のノードがある場合は、さらに追加できます。$ip_addr_mcast
:Corosyncに使用されるマルチキャストアドレス(corosync.conf
でmcastaddr
として指定)$corosync_port
:Corosyncが使用する(宛先)ポート(corosync.conf
ではmcastport
として指定)Corosyncが使用するインターフェースがOpen vSwitchブリッジのメンバーであるポートである1つのノードでは、マルチキャストパケットの一部が、IPアドレスがあったものではなく、ブリッジのインターフェースで受信されました。したがって、このインターフェイスでマルチキャストパケットを許可するルールを追加する必要がありました。
for src_addr in $ip_addr_self $ip_addr_partner1 $ip_addr_partner2; do
iptables -A INPUT -i $bridge_interface -s $src_addr -d $ip_addr_mcast -p udp --source-port $(($corosync_port - 1)) --destination-port $corosync_port -j ACCEPT
done
OUTPUT
チェーンがデフォルトでパケットを受け入れない場合は、IGMPトラフィックを許可し、Corosyncパケットの送信を許可するルールを追加する必要があります。
iptables -A OUTPUT -p igmp -o $corosync_interface -j ACCEPT
for dst_addr in $ip_addr_self $ip_addr_mcast $ip_addr_partner1 $ip_addr_partner2; do
iptables -A OUTPUT o $corosync_interface -s $ip_addr_self -d $dst_addr \
-p udp --source-port $(($corosync_port - 1)) \
--destination-port $corosync_port -j ACCEPT
done
デフォルトでは、CorosyncはIPマルチキャストを使用してノード間で通信します。
mcastaddr: 226.94.1.1
mcastport: 5405
マルチキャストトラフィックを許可するようにファイアウォールを構成します。
# iptables -A INPUT -p igmp -j ACCEPT
# iptables -A INPUT -m addrtype --dst-type MULTICAST -j ACCEPT
# iptables -A INPUT -p udp -m state --state NEW -m multiport --dports 5404,5405 -j ACCEPT
または ユニキャスト に切り替えます。