OpenVPN является одним из самых популярных решений для создания корпоративных VPN-сетей и одним из самых функциональных.
А если мы говорим о сетях, то никак нельзя забывать про маршрутизацию, тем более что OpenVPN предоставляет для этого мощные инструменты.
Основная задача VPN – соединить сети, а значит нам нужно каким-то образом направить нужный трафик в туннель. Для этого предназначена опция конфигурационного файла route, она может использоваться как на сервере, так и на клиенте и создает локальные маршруты при поднятии туннельного интерфейса.
Например, если у нас за VPN доступно несколько сетей, то просто пропишем в конфигурационный файл:
route 192.168.101.0 255.255.255.0
route 192.168.102.0 255.255.255.0
Однако маршрутная информация не является чем-то незыблемым и постоянным, она может меняться и поэтому прописывать подобные директивы в конфигурацию клиента считается плохой практикой, лучше отправить их с сервера, для этого в серверную конфигурацию добавьте:
push "route 192.168.100.0 255.255.255.0"
Директива push означает, что указанная в кавычках опция должна быть отправлена клиенту и аналогична ее добавлению в клиентский конфигурационный файл.
Но таким образом мы распространим маршрут на всех клиентов, а как быть если нужно выборочно задать маршруты? Для этого следует использовать client-config-dir, технологию позволяющую назначить каждому клиенту специфические опции.
Мы не будем подробно на ней останавливаться, надеемся, что читатели про нее знают.
Таким образом мы можем отправить каждому клиенту собственный набор маршрутов, например первому:
push "route 192.168.100.0 255.255.255.0"
push "route 192.168.102.0 255.255.255.0"
И второму
push "route 192.168.100.0 255.255.255.0"
push "route 192.168.101.0 255.255.255.0"
Отлично, запускаем клиентов, проверяем таблицы маршрутизации – все маршруты добавлены. Но ничего не работает… Как же так?
Все просто. Мы настроили только внешнюю маршрутизацию, которая предписывает отправлять в туннель все пакеты к указанным сетям. Но OpenVPN не использует по умолчанию топологию точка-точка, вместо этого используется внутренняя подсеть и поэтому она не знает какому узлу внутренней сети отправлять тот или иной пакет.
Для настройки внутренней маршрутизации предназначена директива iroute (internal route) и она используется только в ccd-конфигурациях. В данной директиве указываем ту сеть, которая расположена за клиентом:
Таким образом для первого клиента ccd-конфигурация будет:
push "route 192.168.100.0 255.255.255.0"
push "route 192.168.102.0 255.255.255.0"
iroute 192.168.101.0 255.255.255.0
Для второго:
push "route 192.168.100.0 255.255.255.0"
push "route 192.168.101.0 255.255.255.0"
iroute 192.168.102.0 255.255.255.0
А на сервере будет достаточно:
route 192.168.101.0 255.255.255.0
route 192.168.102.0 255.255.255.0
Здесь внимательный читатель спросит, а почему нет отдельного внутреннего маршрута для сетей за сервером. Здесь все просто, такой маршрут не нужен, так как внутри OpenVPN сети сервер является шлюзом по умолчанию и все пакеты для которых нет отдельного внутреннего маршрута будут направлены ему.