OPENVPN: Запуск в фоновом режиме, настройка маршрутизации, фаервола и другие мелочи

Бредистория

Год назад, может раньше, по совету товарищей, я переполз с PPTP VPN на Openvpn. За это время узнал несколько хинтов, которые, периодически нужны либо по работе, либо кому-нибудь.
Эталонный конфиг, который буду модифицировать, лежит здесь

Проблема с установкой, требует модуль PAM

Windows: не актуально
Linux: да
Решение:
Собрать из исходников, предварительно переконфигурировав командой
./configure --disable-plugin-auth-pam

Автоматический ввод пароля

Windows: да
Linux: да, за исключением старых версий, которые приходилось пересобирать со специальным ключом. Если вдруг такое попалось, то обновить.
Решение:
В конфиг соединения надо добавить строку auth-user-pass /path/to/auth/file
где
/path/to/auth/ — путь к файлу авторизации
file — имя файла
Для Windows будет что-то типа C:\path\to\file.txt

Файл авторизации — простой текстовый файл в котором содержатся две строки: первая — логин, вторая — пароль:

содержимое файла file:
username
pa$$w05D

Запуск в фоновом режиме

Windows: не актуально
Linux: да
Решение:
В конфиг соединения надо добавить строку daemon

Выполнение пользовательских скриптов

Windows: не актуально, во всяком случае, мне не встречалось
Linux: да
Для чего надо: например, для того, чтобы при установке/разрыве соединения, настроить маршрутизацию или iptables (фаерволл)

Решение:
1. Надо разрешить Openvpn выполнять пользовательские скрипты, добавив в конфиг следующую строку:

script-security 2

2. Прописать путь к скрипту в одном или нескольких нужных параметров конфига, например:

up '/home/kvakushka/scripts/ovpn-routes up'
down '/home/kvakushka/scripts/ovpn-routes down'

Вообще, таких параметров довольно много, почти на все случаи жизни:
down <command> — выполнить команду когда интерфейс TUN/TAP выключится.
up-restart <command> — выполнить команду после каждого реконнекта
route-up <command> — выполнить команду после установки сетевых маршрутов.
up-delay <seconds> — подождать установленное количество секунд перед запуском команды указанной в up. Пример: up-delay 120
down-pre <command> — выполнить команду перед тем, как интерфейс TUN/TAP выключится.
up <command>— выполнить команду после запуска устройства TUN/TAP.
ipchange <command> — выполнить команду, если ip сервера изменился.
client-connect <command> — выполнить команду, после того, как клиент подключился.
client-disconnect <command> — выполнить команду, после того, как клиент отключился.
learn-address <command> — выполнить указанную команду, если IP удаленной стороны стал другим.

Надо уточнить, что скриптам up и down Openvpn передает параметры командной строки, несущие информацию о соединении:

[1..N]: Параметры, указанные пользователем в конфигурационном файле, т.е. в вышеприведенном примере, скрипту ovpn-routes при вызове после того, как поднимется тоннель, будет передано первым параметром «up«, а при разрыве соединения — «down«.
Очень полезный горшочек, позволяющий в одном скрипте обрабатывать несколько событий.
[2]: Имя сетевого устройства (тоннеля). Например, tun0
[3]: MTU сетевого интерфейса
[4]: MTU соединения
Можно использовать для сложной маршрутизации между несколькими каналами и поиска более выгодного маршрута.
[5]: IP-адрес клиента
[6]: IP-адрес клиента на стороне сервера
[7]: init, если скрипт был вызван во время запуска/останова Openvpn или restart, если скрипт был вызван при перезапуске (обрыве соединения, например).

Пример скрипта

#!/bin/bash

#заводим переменные с понятными именами
MAIN_STAT=$1 #up/down
DEV_NAME=$2
TUN_MTU=$3
LINK_MTU=$4
LOCAL_IP=$5
REMOTE_IP=$6
ADD_STAT=$7 #init/restart

#директория с iptables и ip
ACPATH="/usr/sbin/"

# [...]

#скрипт вызван при поднятии тоннеля
if [ "$MAIN_STAT" = "up" ]; then
     #установка маршрута по умолчанию для VPN
    "$ACPATH"ip route del default
    "$ACPATH"ip route add default via $REMOTE_IP dev $DEV_NAME src $LOCAL_IP
     #настройка IPTABLES
     #разрешение транзитного трафика
    "$ACPATH"iptables -P FORWARD ACCEPT
    exit
fi

#скрипт вызван при отключении тоннеля
if [ "$MAIN_STAT" = "down" ]; then 
    #запрет транзитного трафика 
    "$ACPATH"iptables -P FORWARD DROP
   #установка маршрута по умолчанию без VPN
    "$ACPATH"ip route del default
    "$ACPATH"ip route add default via 10.10.1.1 dev eth1 src 10.10.20.55
fi

В примере настраивается маршрут по умолчанию, для случая соединения через VPN и напрямую, а также отключается транзитный трафик, если соединение идет не через VPN.

Пример модифицированного конфига соединения Openvpn
Скрипт ovpn-routes

Источники

1. Основные команды и параметры OpenVPN Копия
2. Установка и настройка клиента OpenVPN в Ubuntu Копия

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*