使用 Strongswan IPSec 在公有云中实现 Keepalived VRRP

使用 Strongswan IPSec 在公有云中实现 Keepalived VRRP

我正在尝试在某个公共云中使用 Keepalived 主动-被动模式为 PostgreSQL 设置 VRRP 故障转移。此云的已知限制是它不能开箱即用地使用 VRRP(LAN 内的主机无法 ping 通安装在其他主机上的 VIP)。

最初,我的网络如下所示:

172.16.1.3 ---- | 172.16.1.4 | ---- | 172.17.1.4 |
IPSec gateway     PG Primary          PG Standby
                  (Keepalived)        (Keepalived)

* Keepalived VIP = 192.168.2.100
* "--" is VPC LAN

Keepalived 在 PG Primary 上安装 VIP 192.168.2.100。如果 Primary 节点发生故障,VIP 将移至 Standby 节点。但是,VPC 网络中的任何主机都无法联系到此安装的 VIP(我收到确认,这是云提供商的限制)。

我认为使用 Strongswan 在 VPC 网络中安装 IPSec 覆盖可能有助于克服这一限制,因为 Strongswan 可以与虚拟 IP。现在网络看起来是这样的:

172.16.1.3 ==== | 172.16.1.4 | ---- | 172.17.1.4 | ==== 172.16.1.3 
IPSec gateway     PG Primary          PG Standby        IPSec gateway
                  (Keepalived)        (Keepalived)

* Keepalived VIP = 192.168.2.100
* "--" is VPC LAN, "==" is IPsec over VPC LAN

IPSec 网关连接到两个 PostgreSQL 节点。

这是/etc/swanctl/conf.d/connections.conf172.16.1.3 的摘录(省略了 conn-defaults 和 children-defaults)。

connections {
      pg1 : conn-defaults, children-defaults {
              remote_addrs = 172.16.1.4
              remote {
                      id = pg1
              }
              children {
                      net-net {
                              local_ts = 172.16.1.3/32
                              remote_ts = 192.168.2.0/24
                      }
              }
      }
      pg2 : conn-defaults, children-defaults {
              remote_addrs = 172.17.1.4
              remote {
                      id = pg2
              }
              children {
                      net-net {
                              local_ts = 172.17.1.3/32
                              remote_ts = 192.168.2.0/24
                      }
              }
      }
}

这是 172.16.1.4 和 172.17.1.4 上的 connections.conf(它们大部分相同):

connections {
        gw : conn-defaults, children-defaults {
                remote_addrs = 172.16.1.3
                remote {
                        id = gw
                }
                children {
                        net-net {
                                local_ts = 192.168.2.0/24
                                remote_ts = 172.16.1.3/32
                        }
                }
        }
}

因此,我能够成功地从 Gateway 查询 VIP 上的 PostgreSQL(网关的客户端也可以这样做),但前提是 VIP 安装在 PG Primary(172.16.1.4)上。我猜那是因为在/etc/swanctl/conf.d/connections.confGateway 上 pg1 连接是在 pg2 连接之前定义的。

如果我更改 .conf 文件中的连接顺序或终止与 pg1 的 IPsec 连接,我也能连接到安装在 PG Standby (172.17.1.4) 上的 VIP。如果它们共享相同的流量选择器 ( local_ts),是否有任何方法可以在两个主机上查找 VIP 地址?

相关内容