当通过多播地址 226.94.1.1(端口 5405)和 226.94.1.2(端口 5406)将 Corosync 与两个环一起使用时,需要哪些 iptables 规则才能允许两个节点进行最佳通信,而不会提供任何不当访问权限并使规则过于宽松?
我目前有:
iptables -A INPUT -p udp -m multiport --dports 5404,5405,5406 -j ACCEPT
这是否允许 Corosync/Pacemaker 设置两个环所需的所有通信?
我听到过这样的争论:
iptables -I INPUT 1 -m pkttype --pkt-type multicast -j ACCEPT
是必需的。但是,如果我上面列出的第一条规则已经存在,我似乎无法复制这种帮助的情况。
Red Hat 文档似乎支持第一种方法。有些 IBM 文档支持第二种方法,但这是否只是一条规则过于宽松的案例,因为第一种方法同样可以完成工作,而且不会打开不必要的端口?
我更倾向于第一条规则就足够了,但想就此事获得更多意见。
答案1
Red Hat 和 IBM 的文档指定的规则实际上允许比实际需要更多的数据包。
多播 IP 数据包与单播 IP 数据包实际上没有太大区别,唯一的区别(除了它们在第 2 层发送和路由的方式之外)是目标地址,该地址必须在 224.0.0.0/4 范围内。
作为在 Server Fault 上描述,可以对单个 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 地址(按bindnetaddr
指定corosync.conf
)$ip_addr_partner1
,$ip_addr_partner2
:其他 Corosync 节点的 IP 地址 - 如果集群有三个以上的节点,则可以添加更多节点。$ip_addr_mcast
:用于 Corosync 的多播地址(按mcastaddr
指定corosync.conf
)$corosync_port
:Corosync 使用的(目标)端口(如mcastport
中指定corosync.conf
)
对于多个环,可以使用相同的方法,但更改接口名称、IP 地址和端口号以匹配各自的定义。
与文档中指定的规则相比,上述规则仅限于特定接口、源地址和源端口,而目标端口仅限于单个端口。实际上,Corosync 不会将数据包发送到多个目标端口,它只是使用不同的端口(目标端口减一)来发送数据和接收数据。