web-dev-qa-db-ja.com

Corosyncの安全なIPTablesルール

CorosyncとPacemakerを実行する2つのHAロードバランサー(hollywoodwolfman)があります。 eth1インターフェイスはWANに接続され、eth0インターフェイスはLANに接続され、仮想IPをバックエンドサーバーのゲートウェイとして使用します。 hollywoodeth1 IPはxxx.xxx.195.45であり、wolfmaneth1 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.46wolfmanに、--source xxx.xxx.195.45hollywoodに追加しました。ほとんどの場合、これは機能しているように見えましたが、パッシブバランサーを再起動すると、ロードバランサー間の通信が停止し、これらのエラーが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
        }
}
6
jetboy

マルチキャスト通信(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.confbindnetaddrとして指定)
  • $ip_addr_partner1$ip_addr_partner2:他のCorosyncノードのIPアドレス-クラスターに4つ以上のノードがある場合は、さらに追加できます。
  • $ip_addr_mcast:Corosyncに使用されるマルチキャストアドレス(corosync.confmcastaddrとして指定)
  • $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
1

デフォルトでは、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

または ユニキャスト に切り替えます。

1
quanta