Помощник сервера OpenVPN: сеть плюс маска, никогда не CIDR
Помощник сервера IPv4 принимает выровненную сеть и точечную маску, а не суффикс CIDR. Проверьте диапазон, подтвердите пул в журнале и затем безопасно измените размер.
Строка сервера, которая смешивает суффикс CIDR с точечной маской, останавливает демон ещё до того, как он откроет порт. Помощник server для IPv4 хочет два отдельных аргумента: выровненный адрес сети, а затем маску сети в точечной форме. Всё остальное в этой строке — догадка, и именно в догадке ломаются размеры пула и маски клиентов.
Два аргумента, которые принимает помощник
Сначала напишите сеть, затем маску, ничего не прикрепляя к адресу:
server 10.72.16.0 255.255.240.0Это форма для /20. Строка ниже — ошибка, и она падает при разборе параметров, а не во время работы:
server 10.72.16.0/20 255.255.240.0Отлаживая это, держите две идеи раздельно. Длина префикса и точечная маска описывают один и тот же диапазон, но помощник не принимает обе сразу, а отклонённая строка даёт ошибку параметров, которая называет директиву, а не арифметику.
Выровняйте сеть, прежде чем вводить маску
Первый адрес — это адрес сети диапазона, а не удобный адрес клиента внутри него. Для /20 диапазон идёт от 10.72.16.0 до 10.72.31.255, и только первый из них является допустимым аргументом сети. /21 использует 255.255.248.0 и охватывает от 10.72.16.0 до 10.72.23.255, поэтому его строка — server 10.72.16.0 255.255.248.0.
Смена префикса меняет диапазон и ничего больше. Она не меняет, сколько адресов получает один клиент, потому что это свойство топологии, а не маски в этой строке.
Подтвердите пул со стороны сервера
Запустите экземпляр на переднем плане с подробным журналированием и прочитайте строки, которые выдаёт помощник. Пул, который он построил, печатается при запуске, и это надёжнее, чем считать арифметику вручную:
openvpn --config /etc/openvpn/server.conf --verb 4 --dev tun9 --port 1195Ищите сводку пула ближе к верхней части вывода. В ней перечислен диапазон, который зарезервировал помощник, и если этот диапазон не соответствует вашему замыслу, аргументы в строке неверны, что бы ни говорила арифметика маски.
Затем подключите одного клиента и найдите строку, которая записывает выданный ему адрес. Этот единственный адрес рядом с диапазоном пула говорит вам, попал ли клиент внутрь зарезервированного блока или куда-то, где вы этого не ждали. Если они не совпадают, исправляйте аргументы, а не клиента. Если совпадают, а клиент всё равно ничего не достигает, пул никогда не был проблемой.
Читайте маску клиента с учётом топологии
Клиент, показывающий /30 на своём туннельном интерфейсе, не является доказательством сломанного пула. При адресации «точка-точка» каждый клиент получает небольшой блок, и маска его интерфейса описывает этот блок, тогда как пул сервера покрывает целое. При топологии подсети маска клиента, наоборот, совпадает с маской пула. Поэтому одна маска говорит, какая топология в игре, а не о том, правильно ли написан пул.
Проверьте настроенную топологию и назначенный адрес вместе, прежде чем делать вывод:
ip -4 addr show tun0Если адрес внутри пула, а маска уже пула, то это топология выполняет свою работу. Если адрес вне пула, пул неверен, и никакая проверка со стороны клиента это не исправит.
Изменение работающего пула
Выберите диапазон, который не пересекается с текущим пулом, локальной сетью или любым маршрутом, уже отправленным клиентам. Пересечение — это сбой, который переживает перезапуск и затем через несколько дней проявляется как один сайт, недоступный с одного направления.
Измените строку, перезапустите и ещё раз прочитайте пул при запуске, прежде чем впускать пользователей обратно. Если новый диапазон с чем-то конфликтует, тот же вывод при запуске покажет это сразу, а откат — это правка одной строки плюс ещё один перезапуск.
Держите старый диапазон зарезервированным ещё некоторое время после изменения. Клиенты, которые подключаются поздно, всё ещё могут держать адрес из предыдущего пула, а новый диапазон, который повторно использует эти адреса, создаёт двойные назначения, выглядящие как сбой маршрутизации. Руководство OpenVPN 2.6 описывает аргументы помощника и его развёртывание, и это стоит прочитать, прежде чем предполагать, что директива использует ту же запись, что и её соседка.