我已经能够在两台 Hetzner 机器之间成功设置 IPSEC,这两台机器都只有公共 IP 地址。然而,我不成功在 EC2 实例和 Hetzner 机器之间配置 IPSEC,因为 EC2 实例具有私有 IP,该 IP 经过某种形式的 NAT 来获取公共 IP。
我正在使用 ipsec-tools + racoon 并尝试遵循以下文档:
- https://www.mad-hacking.net/documentation/linux/networking/ipsec/nat-vpn.xml
- https://www.netbsd.org/docs/network/ipsec/#sample_vpn
为了使事情简单化,我尝试将浣熊从图片中取出并对加密密钥进行硬编码。
我该如何让它工作?也许更重要的是,我该如何深入了解发生了什么?“连接断开”到底在哪里?
/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它应该可以工作。
我发现您的设置中有一个问题与 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 上添加一条通往Ec2PvtIP
via 的路线Ec2PubIP
。
此外,如果隧道内部地址完全独立于端点地址,我会发现这更容易,也更不容易混淆。例如,我将dummy0 = 10.0.1.1/32
在 EC2 和dummy0 = 10.0.1.2/32
Hetzner 上创建并适当配置隧道:
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
希望有帮助:)