Ao usar a comunicação multicast (o padrão para o Corosync), o tráfego IGMP deve ser permitido e os pacotes Corosync podem ser permitidos com regras muito mais específicas do que na outra resposta. As regras a seguir são suficientes (supondo que a cadeia OUTPUT
não bloqueie nenhum tráfego):
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
Neste exemplo, as seguintes variáveis são assumidas como definidas:
-
$corosync_interface
: a interface de rede usada pelo Corosync
-
$ip_addr_self
: o endereço IP ao qual o Corosync se vincula localmente (especificado como bindnetaddr
in corosync.conf
)
-
$ip_addr_partner1
, $ip_addr_partner2
: os endereços IP dos outros nós do Corosync - mais podem ser adicionados se o cluster tiver mais de três nós.
-
$ip_addr_mcast
: o endereço multicast usado para o Corosync (especificado como mcastaddr
in corosync.conf
)
-
$corosync_port
: a porta (destino) usada pelo Corosync (especificada como mcastport
in corosync.conf
)
Em um nó, onde a interface usada pelo Corosync é uma porta que é membro de uma ponte Open vSwitch, alguns dos pacotes de multidifusão foram recebidos na interface da ponte em vez daquela que tinha o endereço IP. Portanto, eu tive que adicionar uma regra adicional que permitisse pacotes multicast nessa interface:
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
Se a cadeia OUTPUT
não aceitar os pacotes por padrão, é necessário adicionar regras que permitam o tráfego IGMP e que permitam o envio de pacotes 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