Имеется OpenVPN сервер.
Его установка и настройка описаны в постах OpenVPN: настройка OpenVPN Access Server и AWS VPC peering: OpenVPN сервер расположен в одной AWS VPC, Bitwarden – в другой. Между этими VPC поднят VPC Peering, и OpenVPN должен роутить трафик между клиентом и Bitwarden.
Проблема в том, что при доступе к Bitwarden (см. Bitwarden: менеджер паролей организации — установка self-hosted версии на AWS EC2) возникает ошибка “ERR_ADDRESS_UNREACHABLE/No route to host“:
[simterm]
$ curl https://accounts.example.com curl: (7) Failed to connect to accounts.example.com port 443: No route to host
[/simterm]
Проверяем IP ресурса:
[simterm]
$ dig accounts.example.com +short ec2-63-***-***-138.eu-west-1.compute.amazonaws.com. 172.31.41.159
[/simterm]
172.31.41.159 – резолвится на приватный IP, тут всё хорошо (см. AWS: VPC peering DNS resolution и настройки DNS для OpenVPN AS)
Проверяем NAT правила пользователя – есть ли правило роутинга в сеть 172.31.16.0/20:
Проверяем локальные маршруты:
[simterm]
$ route -n | grep 172.27.248.1 10.0.1.0 172.27.248.1 255.255.255.0 UG 101 0 0 tun0 10.0.3.0 172.27.248.1 255.255.255.0 UG 101 0 0 tun0 10.0.5.0 172.27.248.1 255.255.255.0 UG 101 0 0 tun0 10.0.10.0 172.27.248.1 255.255.255.0 UG 101 0 0 tun0 172.27.224.0 172.27.248.1 255.255.240.0 UG 101 0 0 tun0 172.31.16.0 172.27.248.1 255.255.240.0 UG 101 0 0 tun0
[/simterm]
172.31.16.0 172.27.248.1
Вот наш маршрут – вроде всё правильно?
Проверяем хосты в этой сети:
[simterm]
$ ipcalc 172.31.16.0/20 Address: 172.31.16.0 10101100.00011111.0001 0000.00000000 Netmask: 255.255.240.0 = 20 11111111.11111111.1111 0000.00000000 Wildcard: 0.0.15.255 00000000.00000000.0000 1111.11111111 => Network: 172.31.16.0/20 10101100.00011111.0001 0000.00000000 HostMin: 172.31.16.1 10101100.00011111.0001 0000.00000001 HostMax: 172.31.31.254 10101100.00011111.0001 1111.11111110 Broadcast: 172.31.31.255 10101100.00011111.0001 1111.11111111 Hosts/Net: 4094 Class B, Private Internet
[/simterm]
И обращаем внимание на HostMax: 172.31.31.254, тогда как наш Bitwarden находится в сети 172.31.41.0/24.
Решение – в настройках NAT-роутинга в OpenVPN задать сеть как либо 172.31.31.0/18, либо 172.31.41.0/24.
Меняем на to 172.31.41.0/24, перепоключаемся, проверяем маршруты теперь:
[simterm]
$ route -n | grep 172.27.248.1 ... 172.31.41.0 172.27.248.1 255.255.255.0 UG 101 0 0 tun0
[/simterm]
Проверяем curl:
[simterm]
$ curl -I https://accounts.example.com HTTP/1.1 200 OK Server: nginx/1.10.3 ...
[/simterm]
Готово.