Вопрос или проблема
У меня есть клиент OpenVPN, подключенный к серверу OpenVPN.
На сервере есть следующие маршруты:
default via 10.109.185.65 dev eth0 proto dhcp src 10.109.185.84 metric 100
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
10.109.185.64/27 dev eth0 proto kernel scope link src 10.109.185.84
10.109.185.65 dev eth0 proto dhcp scope link src 10.109.185.84 metric 100
У клиента есть следующий адрес на виртуальном интерфейсе tun0
, созданном OpenVPN:
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.8.0.3/24 brd 10.8.0.255 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::3c55:91d1:e8cf:7c55/64 scope link flags 800
valid_lft forever preferred_lft forever
С сервера я могу пинговать клиента, выполнив ping 10.8.0.3
, и это работает нормально.
Затем я добавил второй IP-адрес к tun0
на клиенте, выполнив ip addr add 10.100.1.2/24 dev tun0
. Он отображается на интерфейсе tun0
как:
inet 10.100.1.2/24 scope global tun0
valid_lft forever preferred_lft forever
На сервере я добавил маршрут для этой подсети, выполнив ip route add 10.100.1.0/24 dev tun0
. Он отображается в списке маршрутов как:
10.100.1.0/24 dev tun0 scope link
Но попытка выполнить ping 10.100.1.2
на сервере не удалась.
Затем я заметил, что на сервере и клиенте были следующие правила iptables FORWARD:
ACCEPT all -- 10.8.0.0/24 anywhere
Так что я добавил еще одно правило FORWARD для подсети 10.100.1.0, выполнив iptables -A FORWARD -s 10.100.1.0/24
на сервере и клиенте.
Но попытка выполнить ping 10.100.1.2
на сервере по-прежнему не удалась.
Есть ли что-то еще, что мне нужно сделать, чтобы иметь возможность пинговать 10.100.1.2 с сервера?
Три вещи, которые следует учитывать:
1. Маршрутизация
Второй IP-диапазон (10.100.1.0/24
) будет напрямую связан с интерфейсом tun0
. Поэтому ваша машина будет знать, как добраться до сети 10.100.1.0/24
без необходимости добавлять какие-либо статические маршруты. Вскоре после добавления второго IP выполните следующую команду, и вы увидите, что маршрут был динамически добавлен в таблицу.
$ sudo ip route show
2. Точка-точка сеть
Когда вы создаете VPN-туннель, вы создаете сеть точка-точка, используя виртуальный сетевой адаптер (tun0
в данном случае) между VPN-сервером и клиентом. Присвоение второго или третьего адреса этой интерфейсу усложняет точка-точка.
3. Решение
Создайте новый виртуальный сетевой адаптер, которому вы присвоите второй желаемый IP-адрес. Никакие операторы маршрута не потребуются, если они не нужны. Также не потребуются дополнительные правила iptables
. (Вы должны удалить статические маршруты, которые вы создали ранее, а также удалить дополнительное правило iptables. Вам ничего из этого не нужно, чтобы ваша система работала)
С VPN-сервера:
$ lsmod | grep dummy
Вышеупомянутая команда проверяет, загружены ли в ядре сетевые драйверы (модули) “dummy”. Если не загружены, проверьте документацию здесь
$ sudo ip link add tun99 type dummy
$ sudo ip link set dev tun99 up
Вышеупомянутая команда создаст новый виртуальный сетевой адаптер с именем tun99
$ sudo ip address change dev tun99 10.100.1.1
Вышеупомянутая команда присвоит IP-адрес 10.100.1.1/32
вновь созданному сетевому адаптеру tun99
Поскольку это сеть точка-точка, операторы маршрутады не потребуются
С VPN-клиента:
$ sudo ip link add tun99 type dummy
$ sudo ip link set dev tun99 up
$ sudo ip address change dev tun99 10.100.1.2
Проверьте соединение, отправив запросы ping с VPN-клиента к IP-адресу VPN-сервера 10.100.1.1
$ ping 10.100.1.1
iptables -A FORWARD -s 10.100.1.0/24
Если эта команда не включала -j ACCEPT
, все, что вы сделали, это добавили счетчик трафика для измерения количества пакетов+байтов, соответствующих сети 10.100.1.0/24, достигающей этой точки в наборе правил. Если вы укажете правило без действия, оно просто останется там, посчитает пакеты, соответствующие правилу, и больше ничего не сделает.
Кроме того, опция -A
добавляет новое правило в конец существующего набора правил в таблице; правила обрабатываются по порядку, и если в качестве последнего правила таблицы было правило “запретить все” (что является общепринятой рекомендацией), никакие правила после него не будут иметь эффекта. Если это так, вы должны были вставить новое правило в более подходящее место.
Ответ или решение
Проблема: Невозможность выполнить ping на второй IP-адрес на интерфейсе другой машины
Введение
Связь между клиентом OpenVPN и сервером имеет свои особенности, которые могут повлиять на выполнение команд, таких как ping
. В данной ситуации клиент успешно пингует сервер, но при добавлении второго IP-адреса (10.100.1.2) в виртуальный интерфейс tun0 на клиенте, сервер не может пинговать этот адрес. Давайте рассмотрим возможные причины и решения этой проблемы.
1. Роутинг
При добавлении второго IP-адреса к интерфейсу tun0, ваши маршруты должны обновиться автоматически. Однако необходимо убедиться, что маршрут на сервере правильно настроен:
$ sudo ip route show
Убедитесь, что маршрут для подсети 10.100.1.0/24 присутствует. Если маршруты не динамически обновлены, вам может потребоваться вручную внести изменения.
2. Точка-точка
Следует помнить, что туннелирование через VPN создает точку-точку (point-to-point) соединение. Убедитесь, что для этой конфигурации используется уникальный адрес, и что оба IP-адреса (на клиенте и сервере) правильно настроены.
3. Правила iptables
Правила фильтрации пакетов (iptables) могут блокировать пакеты передаваемые между клиентом и сервером. Добавляя правило с помощью команды:
iptables -A FORWARD -s 10.100.1.0/24 -j ACCEPT
Убедитесь, что вы указываете действие -j ACCEPT
. Если это правило просто добавит счетчик, оно не разрешит пакеты, и следовательно, поток данных будет заблокирован.
Рекомендации по решению проблемы
-
Проверьте правила iptables. Убедитесь, что ваши правила корректны и что у вас нет запретов, которые могут блокировать трафик.
-
Создайте новый виртуальный интерфейс. Вместо добавления дополнительных IP-адресов к интерфейсу tun0, создайте новый виртуальный интерфейс. Это позволит избежать путаницы с маршрутизацией и не потребует дополнительных настроек маршрутов.
Пример для создания нового интерфейса
dummy
:# На сервере sudo ip link add tun99 type dummy sudo ip link set dev tun99 up sudo ip addr add 10.100.1.1/32 dev tun99 # На клиенте sudo ip link add tun99 type dummy sudo ip link set dev tun99 up sudo ip addr add 10.100.1.2/32 dev tun99
-
Проверьте настройки. После создания новых интерфейсов, проверьте связь между ними, выполнив команду
ping
с клиента на сервер.
ping 10.100.1.1
Заключение
Если несмотря на указанные действия проблема с ping сохраняется, стоит проверить иные аспекты настройки сети, включая конфигурации DHCP и правила NAT. Спустя несколько шагов настройки вы сможете убедиться, что ваша сеть функционирует правильно, и все необходимые пакеты свободно перетекают между клиентом и сервером. Не забывайте также перезагрузить iptables или перезапустить сетевые службы после внесения изменений, чтобы они вступили в силу.