EC2 实例与另一台具有公共 IP 的服务器之间的 IPSEC

EC2 实例与另一台具有公共 IP 的服务器之间的 IPSEC

我已经能够在两台 Hetzner 机器之间成功设置 IPSEC,这两台机器都只有公共 IP 地址。然而,我不成功在 EC2 实例和 Hetzner 机器之间配置 IPSEC,因为 EC2 实例具有私有 IP,该 IP 经过某种形式的 NAT 来获取公共 IP。

我正在使用 ipsec-tools + racoon 并尝试遵循以下文档:

为了使事情简单化,我尝试将浣熊从图片中取出并对加密密钥进行硬编码。

我该如何让它工作?也许更重要的是,我该如何深入了解发生了什么?“连接断开”到底在哪里?

/etc/ipsec-tools.conf在 EC2 实例上

flush;
spdflush;

# ec2 -> het
spdadd Ec2PvtIP HetznerIP any -P out ipsec  esp/tunnel/Ec2PubIP-HetznerIP/require;
# het -> ec2
spdadd HetznerIP Ec2PvtIP any -P in  ipsec  esp/tunnel/HetznerIP-Ec2PubIP/require;


## Using EC2 Public IP

add Ec2PubIP HetznerIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;
add HetznerIP Ec2PubIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;

## Using EC2 Private IP

# ec2 -> het
add Ec2PvtIP HetznerIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;
# het -> ec2
add HetznerIP Ec2PvtIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;

/etc/ipsec-tools.conf在 Hetzner 机器上

flush;
spdflush;

# het -> ec2
spdadd HetznerIP Ec2PvtIP any -P out ipsec  esp/tunnel/HetznerIP-Ec2PubIP/require;
# ec2 -> het
spdadd Ec2PvtIP HetznerIP any -P in  ipsec  esp/transport/Ec2PubIP-HetznerIP/require;

### Using EC2 Public IP

add HetznerIP Ec2PubIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;
add Ec2PubIP HetznerIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;

### Using EC2 Private IP
# het -> ec2
add HetznerIP Ec2PvtIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;
# ec2 -> het
add Ec2PvtIP HetznerIP esp 0x74fce30b -E aes-cbc 0xf46c3187e253e5b25b8f8525da056080 -A hmac-sha256 0x9e7c6f6c7a1ccdd7634bb0a9eeaea5a8ed7bdfed89fd3f7dc86b2e8a522ae6e8 ;

更多信息

  • 为了暂时减少移动部件的数量,我已经在 iptables 级别和 Amazon 安全组级别为我的 EC2 实例启用了所有流量。
  • Hetzner 根本没有私有 IP。它只有公共 IP。
  • 我的目的不是在所有服务器之间建立私有网络(使用私有 IP),因为假设一旦服务器之间的所有流量都通过 IPSEC 加密,它们也可以通过公共 IP 进行通信。然而,EC2 在我的多云设置中显得格格不入,因为它会强制您使用公共/私有 IP。

答案1

只要你的安全组本地防火墙在您的 Linux 机器上允许访问协议 ESP它应该可以工作。

安全组 - ESP

我发现您的设置中有一个问题与 SPD 有关。EC2 不知道其公共 IP,Hetzner 不知道其私有 IP。此外,您transport在 Hetzner 上安装了第二个 SPD。您必须正确组合。

在 EC2 上

# EC2 only knows its private IP - the tunnel must reflect that
spdadd Ec2PvtIP HetznerIP any -P out ipsec  esp/tunnel/Ec2PvtIP-HetznerIP/require;
spdadd HetznerIP Ec2PvtIP any -P in  ipsec  esp/tunnel/HetznerIP-Ec2PvtIP/require;

关于赫茨纳

# ESP is between the Public IPs, SPD uses the EC2 Private IP
spdadd HetznerIP Ec2PvtIP any -P out ipsec  esp/tunnel/HetznerIP-Ec2PubIP/require;
# This must be tunnel too, not transport
spdadd Ec2PvtIP HetznerIP any -P in  ipsec  esp/tunnel/Ec2PubIP-HetznerIP/require;

然后,您必须在 Hetzner 上添加一条通往Ec2PvtIPvia 的路线Ec2PubIP


此外,如果隧道内部地址完全独立于端点地址,我会发现这更容易,也更不容易混淆。例如,我将dummy0 = 10.0.1.1/32在 EC2 和dummy0 = 10.0.1.2/32Hetzner 上创建并适当配置隧道:

spdadd 10.0.1.1 10.0.1.2 esp/tunnel/Ec2PvtIP-HetznerIP/require;
...

路由也更加明确:

root@ec2 ~ # ip route add 10.0.1.2 via HetznerIP src 10.0.1.1

或者使用自由天鹅/开放的Swan而不是ipsec 工具像这样的简单配置应该可以在具有公共 IP 的 EC2 实例上运行,包括密钥交换和路由管理:

# On EC2
conn hetzner
    left=%defaultroute
    leftsubnet=10.0.1.1/32
    right=HetznetIP
    rightsubnet=10.0.1.2/32
    authby=secret
    auto=start

经过多年使用ipsec 工具我已经切换到自由天鹅并发现它更容易使用。


更新:根据您的更新“我的意图不是在所有服务器之间建立私有网络(具有私有 IP),因为假设一旦服务器之间的所有流量都通过 IPSEC 加密,它们也可以通过公共 IP 进行通信。”你应该尝试运输更多:esp/transport/.../require。在任何情况下都应保持一致 - 不能在 SPD 之间tunnel混合使用。transport

希望有帮助:)

相关内容