По характеру работы приходится часто подключаться к разным сетям, и в таком режиме оказалось совершенно невозможно работать через OpenVPN, через который пропускается весь интернет-трафик.
Проблема в том, что после даже кратковременного разрыва интернет-подключения доступ в интернет (а также и к OVPN-серверу) исчезает, и не восстанавливается, пока OVPN-подключение не будет разорвано.
1. До подключения к OpenVPN
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp0s25
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s25
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25
2. После подключения к OpenVPN
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.8.0.5 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp0s25
10.8.0.1 10.8.0.5 255.255.255.255 UGH 0 0 0 tun0
10.8.0.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
128.0.0.0 10.8.0.5 128.0.0.0 UG 0 0 0 tun0
10.20.30.40 192.168.0.1 255.255.255.255 UGH 0 0 0 enp0s25
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s25
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25
3. После переподключения к интернету
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.8.0.5 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 enp0s25
10.8.0.1 10.8.0.5 255.255.255.255 UGH 0 0 0 tun0
10.8.0.5 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
128.0.0.0 10.8.0.5 128.0.0.0 UG 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s25
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25
— исчез маршрут к OpenVPN-серверу
10.20.30.40 192.168.0.1 255.255.255.255 UGH 0 0 0 enp0s25
Лог клиента после восстановления доступа в интернет выглядит вот так:
Sat Oct 30 00:13:28 2021 us=753080 Recursive routing detected, drop tun packet to [AF_INET]10.20.30.40:443
Sat Oct 30 00:13:28 2021 us=753105 Recursive routing detected, drop tun packet to [AF_INET]10.20.30.40:443
Sat Oct 30 00:13:28 2021 us=753128 Recursive routing detected, drop tun packet to [AF_INET]10.20.30.40:443
Лог сервера после исчезновения маршрута у клиента, очевидно, никак не меняется.
Конфигурация клиента:
client
dev tun
proto udp
remote 10.20.30.40 443
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA256
key-direction 1
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
verb 4
<ca>
…
</ca>
<cert>
…
</cert>
<key>
…
</key>
<tls-crypt>
…
</tls-crypt>
Конфигурация сервера:
port 443
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh none
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
tls-crypt /etc/openvpn/server/ta.key
auth SHA256
cipher AES-256-GCM
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
Клиент — Ubuntu 20 (воспроизводится на чистой системе), сервер — Oracle Linux 8. Клиенты на Android с этим же сервером через официальный клиент OpenVPN работают без проблем.
P.S. Отличным решением могло бы быть использование OpenVPN через GUI, но, увы, NetworkManager игнорирует route net_gateway.