无法将 UDP 传出包的源 IP 地址更改为浮动 IP

无法将 UDP 传出包的源 IP 地址更改为浮动 IP

我无法使用 pacemaker 和 corosync 使集群正常工作。这是我的硬件配置:

  • 网络: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

该网络位于防火墙后面。

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

  • 资源1 -> udp 端口​​ 16500
  • 资源2 -> 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

resource1 和 resource2 彼此不相关,并且集群上(在 node1 或 node2 上)每个资源必须只有一个活动实例。

我创建了 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"

在防火墙上管理员配置了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

因此我可以将每个资源放在不同的节点中。起搏器可以毫无问题地管理这些资源。

传入的 UDP 数据包运行完美,两个资源都可以毫无问题地处理它们。

但是,传出的 udp 数据包不会通过防火墙,因为源 ip 地址是节点的静态 ip 地址。以下是示例:

  • resource1 在 node1 上运行 -> 传出 ip 地址和端口是 192.168.3.34:16500
  • resource2 在 node2 上运行 -> 传出 ip 地址和端口是 192.168.3.35:16501

这两个都被防火墙拦截了。而且我没有权限在防火墙上配置新规则(我不能要求管理员配置它们,他说防火墙不允许这样做)。

我尝试使用 iptables 在每个节点上配置 NAT:

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

当我这样做时,资源 1 和资源 2 在其日志中写道它们无法发送数据包:

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 地址不会有什么好处。

如果有人能指出我做错的事情我将非常感激。

提前致谢

答案1

资源代理IPsrcaddr应该可以完成这个任务。配置IPsrcaddr资源如下:

# 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

答案2

尝试这个。

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

消除

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

并将其替换为

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

相关内容