openvpn: Невозможно пропинговать клиента, когда он подключен из локальной сети

У нас есть сервер openvpn (я полагаю, на нашем маршрутизаторе) и мобильные клиенты, которые подключаются к Интернету из отдаленных мест, а иногда и из нашего офиса. Эти системы являются автономными, поэтому настраивать их по-разному перед подключением к офисной сети не стоит. Мы хотели бы подключить к ним SSH через их имена хостов avahi независимо от того, где они физически находятся.

Правильно мы можем пинговать и SSH, когда они подключены к Интернету за пределами нашей сети. Когда они подключены изнутри нашей локальной сети, иногда hostname.local решает в 192.168.10.3 (и пинг и SSH не работают), а иногда и 192.168.1.211 (и ping и ssh работают).

При мониторинге wireshark на мобильном клиенте запросы ping на адрес 192.168.10.3 действительно появляются, но не отвечают.

Как мы можем настроить наших клиентов, чтобы они могли быть доступны при подключении изнутри нашей сети?

вывод ifconfig на клиенте (подключен к VPN через локальную сеть нашего офиса):

eth0      Link encap:Ethernet  HWaddr 00:04:4b:a7:fa:e5  
          inet addr:192.168.1.223  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::7a45:f5b1:1b87:c6f0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8964 errors:0 dropped:0 overruns:0 frame:0
          TX packets:771 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1847719 (1.8 MB)  TX bytes:160760 (160.7 KB)
          Interrupt:42 

tap0      Link encap:Ethernet  HWaddr ce:d4:a6:18:48:21  
          inet addr:192.168.10.3  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::ccd4:a6ff:fe18:4821/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1381 errors:0 dropped:0 overruns:0 frame:0
          TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:214474 (214.4 KB)  TX bytes:7149 (7.1 KB)

вывод route на клиенте (подключен к VPN через локальную сеть нашего офиса):

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
default         192.168.10.1    0.0.0.0         UG    50     0        0 tap0
default         192.168.1.1     0.0.0.0         UG    100    0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth1
192.168.1.0     *               255.255.255.0   U     100    0        0 eth0
192.168.2.0     *               255.255.255.0   U     0      0        0 eth1
192.168.10.0    *               255.255.255.0   U     50     0        0 tap0

Последовательный эхо-запрос от другого компьютера в той же локальной сети к нашему мобильному клиенту. По какой-то причине авахи .local имена непредсказуемо преобразуются в IP-адрес VPN или другой. В любом случае, пинг до VPN-IP (второй) просто зависает:

[15:51:25]~$ ping liber0.local
PING liber0.local (192.168.1.223) 56(84) bytes of data.
64 bytes from 192.168.1.223: icmp_seq=1 ttl=64 time=4.00 ms
64 bytes from 192.168.1.223: icmp_seq=2 ttl=64 time=6.09 ms
64 bytes from 192.168.1.223: icmp_seq=3 ttl=64 time=38.8 ms
^C
--- liber0.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 4.003/16.302/38.805/15.935 ms
[15:51:29]~$ ping liber0.local
PING liber0.local (192.168.10.3) 56(84) bytes of data.
^C
--- liber0.local ping statistics ---
27 packets transmitted, 0 received, 100% packet loss, time 26629ms

Файл конфигурации OpenVPN:

client
dev tap
proto udp
remote <redacted>
float
resolv-retry infinite 
nobind
persist-key 
persist-tun 
verb 3
ca <redacted>.pem 
cert <redacted>.pem
key <redacted>.key
cipher AES-256-CBC
auth SHA256

1 ответ

Решение

Ключевым намеком было то, что ICMP-пакеты поступили на клиент, подключенный к VPN, но не получили ответа. Оказалось, что по умолчанию rp_filter (фильтр обратного пути) строго проверяет и отбрасывает пакеты. добавление net.ipv4.conf.default.rp_filter = 2 в /etc/sysctl.conf устанавливает для rp_filter потерю проверки обратного пути, и все работает.

Другие вопросы по тегам