Правила безопасных IPTables для Corosync
У меня есть два распределителя нагрузки HA (hollywood
а также wolfman
) работает Corosync и Pacemaker. eth1
интерфейсы подключены к глобальной сети, а eth0
интерфейсы к локальной сети, используя виртуальный IP в качестве шлюза для внутренних серверов. eth1
IP из hollywood
является xxx.xxx.195.45
и eth1
IP из wolfman
является xxx.xxx.195.46
, bindnetaddr
в Corosync есть xxx.xxx.195.32
, так же, как сетевой адрес WAN, и порт 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
, В большинстве случаев это работало, но перезагрузка пассивного балансировщика иногда приводила к потере связи между балансировщиками нагрузки и записи этих ошибок в системный журнал:
[TOTEM] Totem не может сформировать кластер из-за ошибки операционной системы или сети. Наиболее распространенной причиной этого сообщения является то, что локальный брандмауэр настроен неправильно.
Так что, похоже, либо мое упрощенное убеждение, что весь трафик Corosync находится непосредственно между двумя балансировщиками нагрузки, eth1
неправильно, или что что-то другое вызывает проблемы.
Я хотел бы заблокировать порт 5404/5405
вниз в IPTables просто кластер. Что мне нужно сделать, чтобы это произошло?
Редактировать: corosync.conf
как просили. Это все Ubuntu по умолчанию, кроме bindnetaddr
,
# 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
}
}
2 ответа
При использовании многоадресной связи (по умолчанию для 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
: IP-адрес, с которым Corosync связывается локально (указывается какbindnetaddr
вcorosync.conf
)$ip_addr_partner1
,$ip_addr_partner2
: IP-адреса других узлов Corosync - можно добавить больше, если в кластере более трех узлов.$ip_addr_mcast
: адрес многоадресной рассылки, используемый для Corosync (указывается какmcastaddr
вcorosync.conf
)$corosync_port
: порт назначения, используемый Corosync (указывается какmcastport
вcorosync.conf
)
На одном узле, где интерфейс, используемый Corosync, является портом, который является членом моста Open vSwitch, некоторые многоадресные пакеты были получены на интерфейсе моста вместо того, который имел 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
или переключиться на одноадресную передачу.