无法更改udp传出包的源IP地址(浮动IP)

我无法使用起搏器和corosync使群集工作。 这是我的硬件configuration:

  • networking:192.168.3.0/255.255.255.0
  • 网关:192.168.3.1
  • node1(Ubuntu Server 12.04 x64)静态IP:192.168.3.34
  • node2(Ubuntu Server 12.04 x64)静态IP:192.168.3.35

这个networking在防火墙后面。

我有两个通过udp与外部设备通信的资源:

  • resource1 – > udp端口16500
  • resource2 – > udp端口16501

我使用的起搏器命令:

crm configure primitive res1-srv upstart:resource1 \ op monitor interval=10s timeout=120 on-fail="restart" \ meta is-managed="true" failure-timeout=300 migration-threshold=5 allow-migrate=true crm configure primitive res2-srv upstart:resource2 \ op monitor interval=10s timeout=120 on-fail="restart" \ meta is-managed="true" failure-timeout=300 migration-threshold=5 allow-migrate=true 

资源1和资源2彼此不相关,并且每个群集(在节点1或节点2上)中每个节点只能有一个活动实例。

我创build了2个浮动IP地址,每个进程一个:

  • res1-ipin – > 192.168.3.130
  • res2-ipin – > 192.168.3.131

我做了这个使用:

 crm configure primitive res1-ipin ocf:heartbeat:IPaddr2 \ params ip="192.168.3.130" cidr_netmask="24" op monitor interval="10s" meta is-managed="true" crm configure primitive res2-ipin ocf:heartbeat:IPaddr2 \ params ip="192.168.3.131" cidr_netmask="24" op monitor interval="10s" meta is-managed="true" 

在防火墙上,pipe理员configuration了2条NAT规则:

  • [公共IP]:16500 – > 192.168.3.130:16500
  • [公共IP]:16501 – > 192.168.3.130:16501

我为他们每个人做了一个小组:

 crm configure group resource1 res1-ipin res1-srv crm configure group resource2 res2-ipin res2-srv 

所以我可以有不同的节点中的每个资源。 起搏器pipe理这些资源没有问题。

传入的udp数据包可以正常工作,两种资源都可以轻松处理。

但是,由于源IP地址是节点的静态IP地址,因此传出的udp数据包不会通过防火墙。 这里是一个例子:

  • resource1在node1上运行 – >出站IP地址和端口是192.168.3.34:16500
  • resource2在节点2上运行 – >出站IP地址和端口是192.168.3.35:16501

他们都被防火墙阻止。 而且我没有权限在防火墙上configuration新规则(我不能要求pipe理员configuration它们,他认为防火墙不允许这样做)。

我尝试使用iptables在每个节点上configurationNAT:

 iptables -t nat -A POSTROUTING -p udp --sport 16500 -j SNAT --to-source 192.168.3.130:16500 iptables -t nat -A POSTROUTING -p udp --sport 16501 -j SNAT --to-source 192.168.3.131:16501 

当我这样做时,resource1和resource2写在他们的日志上,他们不能发送数据包:

 Client ERROR *** Terminal nro:XXX writing 1Operation not permitted 

我不知道该怎么办。 我也尝试添加资源ocf:heartbeat:IPsrcaddr,但它崩溃:

 IPsrcaddr[6200]: ERROR: command 'ip route replace 192.168.3.0/24 dev eth0 src 192.168.3.130' failed 

我知道使用2个浮动IP地址不会有任何好处。

如果有人能指出我做错了什么,我将非常感激。

提前致谢

IPsrcaddr资源代理应该为此工作。 configurationIPsrcaddr资源,如下所示:

 # crm configure crm(live)configure# primitive res1_srcaddr IPsrcaddr \ params ipaddress=192.168.3.130 crm(live)configure# primitive res2_srcaddr IPsrcaddr \ params ipaddress=192.168.3.131 

然后跳到您的编辑器中,并将新的IPsrcaddr资源添加到IPaddr2资源之后的相应组:

 crm(live)configure# edit ...snip... group resource1 res1-ipin res1_srcaddr res1-srv group resource2 res2-ipin res2_srcaddr res2-srv ...snip... crm(live)configure# verify crm(live)configure# commit 

如果您仍然看到与IPsrcaddr有关的错误,您可以尝试手动运行该命令,以更好地了解它失败的原因。

您甚至可以尝试修改IPsrcaddr资源代理以更好地适应您的节点; 这是一个相对简单的资源代理:

 # vi /usr/lib/ocf/resource.d/heartbeat/IPsrcaddr 

尝试这个。

 vi /usr/lib/ocf/resource.d/heartbeat/IPsrcaddr 

去掉

 NETWORK=`ip route list dev $INTERFACE scope link match $ipaddress|grep -o '^[^ ]*'` 

并用其replace

 NETWORK=`ip route list dev $INTERFACE scope link match $ipaddress|grep -o '^[^ ]*'|head -1`