Маршрутизация OpenVPN в Linux работает для отдельных IP-адресов, но не для всего трафика.

Маршрутизация OpenVPN в Linux работает для отдельных IP-адресов, но не для всего трафика.

Я пытаюсь настроить домашний VPN перед поездкой на праздники.

У меня есть сервер OpenVPN, использующий настройку TAP, который успешно работает, и я могу подключиться к нему с помощью клиента.

Однако у меня возникли проблемы с маршрутизацией клиентского трафика через него.

У меня эта redirect-gatewayопция не работает. Пока что я отказываюсь от нее и пытаюсь настроить маршруты вручную.

Мой подход заключался в том, чтобы сначала запустить DHCP-клиент (dhcpcd) на интерфейсе tap, а затем попытаться добавить маршруты вручную.

# dhcpcd tap0
dhcpcd-9.4.1 starting
...
tap0: rebinding lease of 192.168.1.137
tap0: probing address 192.168.1.137/24
tap0: leased 192.168.1.137 for 86400 seconds
tap0: adding route to 192.168.1.0/24
forked to background, child pid 11185

Маршруты, которые устанавливает клиент DHCP, отлично работают для внутренних IP-адресов. Я могу пинговать/ssh-компьютеры в своей домашней сети. Я тестирую это с помощью привязанного сотового соединения.

# ip route
default via 192.168.149.13 dev wlan0 proto dhcp src 192.168.149.193 metric 600
192.168.1.0/24 dev tap0 proto dhcp scope link src 192.168.1.137 metric 1052
192.168.149.0/24 dev wlan0 proto kernel scope link src 192.168.149.193 metric 600

# ping 192.168.1.136 # another IP on my network
PING 192.168.1.136 (192.168.1.136) 56(84) bytes of data.
64 bytes from 192.168.1.136: icmp_seq=1 ttl=64 time=104 ms
64 bytes from 192.168.1.136: icmp_seq=2 ttl=64 time=83.5 ms
...

Если я вручную добавлю IP-маршруты для интернет-хостов, используя IP-адрес шлюза моей домашней сети, я смогу получить к ним доступ через OpenVPN.

(обратите внимание, что 175.55.55.55 — это мое привязанное сотовое соединение, а 72.33.33.33 — мой домашний IP)

# curl -4 https://icanhazip.com
175.55.55.55

# host -t a icanhazip.com
icanhazip.com has address 104.18.115.97
icanhazip.com has address 104.18.114.97

# ip route add 104.18.115.97 via 192.168.1.1
# ip route add 104.18.114.97 via 192.168.1.1

# curl -4 https://icanhazip.com
72.33.33.33

Проблема в том, что я не знаю, как это обобщить на весь трафик.

Я попытался добавить маршруты для передачи трафика через VPN:

# ip route add 0.0.0.0/1 via 192.168.1.1 dev tap0
# ip route add 128.0.0.0/1 via 192.168.1.1 dev tap0

Когда я снова пытаюсь зайти на icanhazip.com, время ожидания истекает, а в журналах клиента OpenVPN появляется следующая запись:

2022-12-15 15:27:38 us=127602 Recursive routing detected, drop tun packet to [AF_INET]72.33.33.33:2445
2022-12-15 15:27:38 us=122602 Recursive routing detected, drop tun packet to [AF_INET]72.33.33.33:2445
2022-12-15 15:27:38 us=147702 Recursive routing detected, drop tun packet to [AF_INET]72.33.33.33:2445

Я могу предоставить журнал или конфигурации клиента (или сервера), если это поможет, но я думаю, что это, скорее всего, проблема маршрутизации.

решение1

О, конечно.

@TomYan помог мне разобраться.

Клиент OpenVPN взаимодействовал с сервером OpenVPN через wlan0устройство.

Когда я переопределил wlan0маршрут как маршрут по умолчанию (или фактически по умолчанию, используя адреса 0.0.0.0/1и 128.0.0.0/1) и попытался отправить весь трафик через tap0устройство VPN, это включало и трафик OpenVPN.

Сообщение о «рекурсивной маршрутизации» действительно было верным.

Если бы я использовал TCP, я бы, вероятно, заметил проблему раньше, поскольку соединение просто бы прервалось по тайм-ауту, как только я бы указал эти маршруты.

Решение состоит в том, чтобы явно добавить маршрут с одним адресом, который позволит клиенту OpenVPN по-прежнему подключаться к серверу.

Итак, сразу после DHCP маршруты имеют:

# ip route
default via 192.168.149.13 dev wlan0 proto dhcp src 192.168.149.193 metric 600
192.168.1.0/24 dev tap0 proto dhcp scope link src 192.168.1.137 metric 1052
192.168.149.0/24 dev wlan0 proto kernel scope link src 192.168.149.193 metric 600

Мой адрес сервера OpenVPN — 72.33.33.33, поэтому я вручную добавлю к нему маршрут через шлюз wlan0, упомянутый в настройках по умолчанию выше:

# ip route add 72.33.33.33 via 192.168.149.13 dev wlan0

И теперь мои два маршрута-перехватчика будут работать:

# ip route add 0.0.0.0/1 via 192.168.1.1 dev tap0
# ip route add 128.0.0.0/1 via 192.168.1.1 dev tap0
# curl -4 https://icanhazip.com
73.33.33.33

Связанный контент