Назад | Перейти на главную страницу

IPSEC между экземпляром EC2 и другим сервером с общедоступным IP

Мне удалось успешно настроить IPSEC между двумя машинами Hetzner, каждая из которых имела только общедоступные IP-адреса. Однако я был неудачный при настройке IPSEC между экземпляром EC2 и машиной Hetzner, потому что у экземпляра EC2 есть частный IP-адрес, который проходит через некоторую форму NAT для получения общедоступного IP-адреса.

Я использую ipsec-tools + racoon и пытаюсь следовать этим документам:

Чтобы упростить задачу, я попытался убрать 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 ;

Больше информации

Пока ваш Группа безопасности и локальный брандмауэр на вашем Linux-компьютере разрешите доступ для протокол ESP он должен работать.

Одна проблема, которую я вижу в вашей настройке, связана с SPD. EC2 не знает о своем публичном IP, а Hetzner не знает о своем частном IP. Также у тебя есть transport во втором СПД по Хетцнеру. Вам нужно будет правильно смешать.

На 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 через 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 между СПД.

Надеюсь, это поможет :)