Мне удалось успешно настроить IPSEC между двумя машинами Hetzner, каждая из которых имела только общедоступные IP-адреса. Однако я был неудачный при настройке IPSEC между экземпляром EC2 и машиной Hetzner, потому что у экземпляра EC2 есть частный IP-адрес, который проходит через некоторую форму NAT для получения общедоступного IP-адреса.
Я использую ipsec-tools + racoon и пытаюсь следовать этим документам:
Чтобы упростить задачу, я попытался убрать racoon с изображения и жестко запрограммировать ключи шифрования.
Как мне заставить это работать? И, наверное, что более важно, как мне заглянуть под капот и посмотреть, что происходит? Где именно "разрыв связи"?
/etc/ipsec-tools.conf
на экземпляре EC2flush;
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
на машине Hetznerflush;
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 ;
Пока ваш Группа безопасности и локальный брандмауэр на вашем Linux-компьютере разрешите доступ для протокол ESP он должен работать.
Одна проблема, которую я вижу в вашей настройке, связана с SPD. EC2 не знает о своем публичном IP, а Hetzner не знает о своем частном IP. Также у тебя есть transport
во втором СПД по Хетцнеру. Вам нужно будет правильно смешать.
# 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
через 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
В качестве альтернативы используйте LibreSwan / OpenSwan скорее, чем ipsec-инструменты где такая простая конфигурация должна работать на экземпляре EC2 с общедоступным IP, включая обмен ключами и управление маршрутами:
# 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-инструменты Я теперь переключился на LibreSwan и с ним стало намного легче работать.
Обновить: Основываясь на вашем обновлении «Я НЕ намерен создавать частную сеть (с частными IP-адресами) между всеми серверами, учитывая предположение, что после того, как весь трафик между серверами зашифрован через IPSEC, они могут также общаться через общедоступные IP-адреса». ты должен попробовать с транспорт Больше: esp/transport/.../require
. В любом случае будьте последовательны - смешивать нельзя tunnel
и transport
между СПД.
Надеюсь, это поможет :)