====== OpenVPN и маршруты в клиентские сети ======
Иногда при использовании OpenVPN бывает необходимо попадать с сервера в клиентские сети. Например, к серверу OpenVPN подключается два клиента с подсетями 192.168.100.0/24 и 192.168.101.0/24 и с сервера необходимо добавить маршруты в подсети этих клиентов. Стандартными настройками это не делается, нужно прикручивать скрипты.
Устанавливаем утилиту ipcalc:
sudo apt install ipcalc
Создаем скрипты /etc/openvpn/client-connect.sh и /etc/openvpn/client-disconnect.sh
/etc/openvpn/client-connect.sh
#!/bin/bash
# Скрипт выполняется при подключении каждого клиента
# Логируем запуск
logger -t openvpn "Client $common_name connected with IP $ifconfig_pool_remote_ip"
# Проверяем CCD файл клиента
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
# Ищем iroute директивы
while IFS= read -r line; do
if [[ "$line" =~ ^iroute[[:space:]]+([0-9\.]+)[[:space:]]+([0-9\.]+) ]]; then
network="${BASH_REMATCH[1]}"
netmask="${BASH_REMATCH[2]}"
# Конвертируем в CIDR
cidr=$(ipcalc "$network" "$netmask" | grep 'Netmask' | awk {'print $4'})
if [ -n "$cidr" ]; then
# Добавляем маршрут на сервере
sudo ip route add "$network/$cidr" via "$ifconfig_pool_remote_ip" dev "$dev" 2>/dev/null
# Логируем действие
logger -t openvpn "Added route $network/$cidr via $ifconfig_pool_remote_ip (client: $common_name)"
# Выводим в лог OpenVPN
echo "$(date): Added route $network/$cidr via $ifconfig_pool_remote_ip for client $common_name"
fi
fi
done < "/etc/openvpn/ccd/$common_name"
fi
exit 0
/etc/openvpn/client-disconnect.sh
#!/bin/bash
# Скрипт выполняется при отключении клиента
# Проверяем CCD файл клиента
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
while IFS= read -r line; do
if [[ "$line" =~ ^iroute[[:space:]]+([0-9\.]+)[[:space:]]+([0-9\.]+) ]]; then
network="${BASH_REMATCH[1]}"
netmask="${BASH_REMATCH[2]}"
cidr=$(ipcalc "$network" "$netmask" | grep 'Netmask' | awk {'print $4'})
if [ -n "$cidr" ]; then
# Удаляем маршрут
sudo ip route del "$network/$cidr" 2>/dev/null
# Логируем
logger -t openvpn "Removed route $network/$cidr (client: $common_name disconnected)"
fi
fi
done < "/etc/openvpn/ccd/$common_name"
fi
exit 0
Так же необходимо добавить в конфиг OpenVPN несколько строк, которые добавят вызов скриптов при подключении/отключении клиента.
script-security 3 # или 2, если 3 не работает
client-connect /etc/openvpn/client-connect.sh
client-disconnect /etc/openvpn/client-disconnect.sh
Добавляем в конфигурационный файл клиента:
ifconfig-push 172.16.1.10 255.255.255.0
iroute 192.168.100.0 255.255.255.0
172.16.1.10 - IP который будет назначен клиенту при подключении
iroute 192.168.100.0 255.255.255.0 - добавляет адрес подсети клиента, который и будет добавляется в маршруты