OpenVPN: ошибки No route to host и ERR_ADDRESS_UNREACHABLE — причина и решение

Автор: | 10/14/2019
 

Имеется 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«:

curl https://accounts.example.com
curl: (7) Failed to connect to accounts.example.com port 443: No route to host

Проверяем IP ресурса:

dig accounts.example.com +short
ec2-63-***-***-138.eu-west-1.compute.amazonaws.com.
172.31.41.159

172.31.41.159 — резолвится на приватный IP, тут всё хорошо (см. AWS: VPC peering DNS resolution и настройки DNS для OpenVPN AS)

Проверяем NAT правила пользователя — есть ли правило роутинга в сеть 172.31.16.0/20:

Проверяем локальные маршруты:

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

172.31.16.0 172.27.248.1

Вот наш маршрут — вроде всё правильно?

Проверяем хосты в этой сети:

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

И обращаем внимание на 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, перепоключаемся, проверяем маршруты теперь:

route -n | grep 172.27.248.1
...
172.31.41.0     172.27.248.1    255.255.255.0   UG    101    0        0 tun0

Проверяем curl:

curl -I https://accounts.example.com
HTTP/1.1 200 OK
Server: nginx/1.10.3
...

Готово.