Глава 4. Режим клиент-сервер с tun-устройствами
Наиболее часто используемая модель развертывания для OpenVPN — это один сервер с несколькими удаленными клиентами, способными маршрутизировать IP-трафик. Мы называем эту модель развертывания режимом клиент-сервер с устройствами tun.
В этой главе мы начнем с базовой настройки клиент-сервер. По мере продвижения мы добавим больше возможностей и в конце этой главы приведены некоторые продвинутые примеры того, как настроить OpenVPN в режиме клиент-сервер. В следующей главе мы объясним, как интегрировать настройку клиент-серверном режиме на основе tun в существующую настройку сети, включая такие темы, как общий доступ к файлам Windows и маршрутизация на основе политик.
В этой главе будут рассмотрены следующие темы:
- Настройка инфраструктуры публичных ключей
- Начальная настройка режима клиент-сервер
- Добавление усиленной безопасности с помощью файлов конфигурации продакшен-уровня
- Маршрутизация и маршрутизация на стороне сервера
- Специфичная для клиента конфигурация с использованием файлов CCD
- Клиентская маршрутизация
- Перенаправление шлюза по умолчанию
- Файл статуса OpenVPN
- Интерфейс управления OpenVPN
- Пересогласование ключей сеанса
- Использование IPv6
- Прокси ARP
- Раздача публичных IP-адресов
Понимание режима клиент-сервер
Клиент-серверный режим был впервые представлен в OpenVPN 2.0. В этом режиме сервер представляет собой один процесс OpenVPN, к которому могут подключаться несколько клиентов. Каждому аутентифицированному и авторизованному клиенту назначается IP-адрес из пула адресов, управляемого сервером OpenVPN. Клиенты не могут общаться напрямую друг с другом. Весь трафик проходит через сервер — что имеет как преимущества, так и недостатки.
Преимущества заключаются в следующем:
- Контроль. Администратор VPN-сервера может контролировать, какой трафик может передаваться между клиентами. По умолчанию трафик между клиентами не разрешен. Однако, используя либо опцию
client-to-client
OpenVPN, либо используя умный брандмауэр и правила маршрутизации, можно разрешить клиентам обмениваться данными друг с другом. - Простота развертывания: гораздо проще настроить один сервер, к которому могут обращаться несколько разных клиентов, чем обеспечить связь между множеством клиентов, каждый из которых имеет собственную сеть и конфигурации брандмауэра.
Недостатки заключаются в следующем:
- Масштабируемость. Поскольку весь трафик передается от клиента к серверу (и наоборот) — сервер может быстро стать узким местом в крупномасштабных установках VPN.
- Производительность: поскольку весь трафик между двумя клиентами (клиентами A и B) должен проходить от клиента A к серверу, а затем от сервера к клиенту B — производительность этого типа VPN всегда будет ниже по сравнению с прямым соединением клиент-клиент.
Наиболее распространенным сценарием развертывания для этого режима является корпоративный сервер OpenVPN, к которому подключаются различные VPN-клиенты. Клиентами могут быть филиалы, работники на выезде, работающие из дома, а также пользователи смартфонов и планшетов.
Эта модель развертывания покрывает 95 процентов типичных требований для VPN и предпочтительнее сложных установок с использованием расширенных функций, таких как мостовое соединение. Только если существуют конкретные требования для маршрутизации трафика, не относящегося к IP (например, устаревший трафик IPX), или если необходимо сформировать единый сетевой широковещательный домен, такой модели развертывания будет недостаточно.
Настройка инфраструктуры открытых ключей
В режиме клиент-сервер OpenVPN настраивается с помощью инфраструктуры открытых ключей (PKI) с сертификатами X.509 и приватных ключей. Прежде чем мы сможем настроить клиент-сервер VPN — нам необходимо сначала настроить эту PKI. PKI состоит из CA, приватных ключей и сертификатов (публичных ключей) как для клиента, так и для сервера. В Главе 3, PKI и сертификаты мы подробно обсудили как настроить такую PKI. Эта глава основана на сертификатах и ключах, сгенерированных в той главе.
Сначала мы копируем сертификат и ключи в отдельное место. Как правило, рекомендуется хранить файлы PKI в отдельном месте, а если возможно даже на отдельном компьютере. Особое внимание следует уделить защите файла ca.key
, поскольку вся безопасность вашей PKI зависит от этого файла. Если файл ca.key
скомпрометирован каким-либо образом — вся PKI становится небезопасной и должна быть удалена. В следующих командах предполагается, что файлы PKI генерируются с использованием ssladmin
и хранятся в каталоге <PKI_DIR>
, где <PKI_DIR>
представляет реальный каталог в системе. Выполните следующие команды, чтобы скопировать необходимые файлы PKI для сервера:
[root@server] # mkdir -p /etc/openvpn/movpn
[root@server] # chmod 700 /etc/openvpn/movpn
[root@server] # cd /etc/openvpn/movpn
[root@server] # PKI=<PKI_DIR>/ssladmin/active
[root@server] # cp -a $PKI/ca.crt movpn-ca.crt
[root@server] # cp -a $PKI/Mastering_OpenVPN_Server.crt server.crt
[root@server] # cp -a $PKI/Mastering_OpenVPN_Server.key server.key
Нам также необходимо создать файл параметров Диффи-Хеллмана (DH), который необходим для ключей сеанса VPN. Ключи сеанса являются эфемерными или временными и генерируются при первой настройке соединения между клиентом и сервером. Для обеспечения оптимальной безопасности эфемерные ключи регенерируются во время сеанса через фиксированные интервалы. Интервал регенерации ключей по умолчанию для OpenVPN составляет один час, но его можно настроить с помощью различных опций OpenVPN. Это будет объяснено позже в этой главе в разделе Пересогласование ключей сеанса.
Чтобы создать файл параметров DH, выполните следующие команды:
[root@server] # cd /etc/openvpn/movpn
[root@server] # openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
........+..........................................................
......
..................................................................+
......
В этом примере мы выбираем размер ключа DH в 2048 бит, что является рекомендуемым. Вы также можете использовать ключи DH большего размера, но это замедлит начальный процесс подключения для каждого клиента OpenVPN. Теперь мы готовы установить и запустить сервер OpenVPN.
Начальная настройка режима клиент-сервер
Чтобы настроить базовый сервер OpenVPN, мы сначала создаем файл конфигурации сервера, используя следующие шаги:
- Создайте следующий файл
proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
user nobody
group nobody # используйте ‘group nogroup’ для Debian/Ubuntu
verb 3
daemon
log-append /var/log/openvpn.log
- Затем сохраните его как
movpn-04-01-server.conf
. Подробное объяснение каждой из строк конфигурации будет дано позже. - Запустите сервер OpenVPN:
[root@server]# openvpn --config movpn-04-01-server.conf
- Команда не даст никакого вывода в командной строке, так как весь вывод перенаправляется в файл журнала
/var/log/openvpn.log
. Проверьте этот файл для просмотра журнала запуска OpenVPN:
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO]
[EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Enter Private Key Password:
WARNING: this configuration may cache passwords in memory --
use the auth-nocache option to prevent this
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.200.0.1/24 broadcast 10.200.0.255
GID set to nobody
UID set to nobody
UDPv4 link local (bound): [undef]
UDPv4 link remote: [undef]
Initialization Sequence Completed
- Обратите внимание, что обычно каждая запись в файле журнала начинается с отметки времени. Для ясности эта временная метка была удалена.
- Затем создайте файл конфигурации клиента:
client
proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/client1.crt
key /etc/openvpn/movpn/client1.key
Сохраните его как movpn-04-01-client.conf
.
- Передайте файлы PKI клиенту, используя безопасный канал, например с помощью команды
scp
:
[root@client]# mkdir -p /etc/openvpn/movpn
[root@client]# chmod 700 /etc/openvpn/movpn
[root@client]# cd /etc/openvpn/movpn
[root@client]# PKI_HOST=openvpnserver.example.com
[root@client]# PKI=<PKI_DIR>/ssladmin/active
[root@client]# scp root@$PKI_HOST:$PKI/ca.crt movpn-ca.crt
[root@client]# scp root@$PKI_HOST:$PKI/client1.crt client1.crt
[root@client]# scp root@$PKI_HOST:$PKI/client1.key client1.key
- Запустите клиент OpenVPN:
[root@client]# openvpn --config movpn-04-01-client.conf --
suppress-timestamps
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO]
[EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
WARNING: No server certificate verification method has been
enabled. See http://openvpn.net/howto.html#mitm for more info.
UDPv4 link local: [undef]
UDPv4 link remote: [AF_INET]openvpnserver:1194
[Mastering OpenVPN Server] Peer Connection Initiated with
[AF_INET]openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.200.0.2/24 broadcast 10.200.0.255
Initialization Sequence Completed
- Временные метки снова отсутствуют, но на этот раз они подавляются с помощью опции OpenVPN
suppress-timestamps
, как указано в командной строке. - После установления соединения проверьте следующее сообщение:
Initialization Sequence Completed
- Вы можете убедиться, что соединение работает правильно, проверив VPN-адрес сервера:
Подробное объяснение файлов конфигурации
Так как это первый пример клиент-серверной конфигурации — приведено подробное объяснение файлов конфигурации как сервера, так и клиента. Файл конфигурации сервера содержит следующие строки:
proto udp
: хотя это протокол по умолчанию, разумно явно указать его в файле конфигурации во избежание путаницы.port 1194
: локальный порт, который будет прослушивать OpenVPN. Значение по умолчанию —1194
, но можно использовать любой допустимый и доступный номер порта.dev tun
: указывает имя устройства tun, которое будет использоваться для сервера. Не добавляя номер позади tun, мы инструктируем OpenVPN открыть новое устройство tun. Этому новому устройству будет присвоен первый доступный номер в ядре системы, начиная с 0 (tun0, tun1, tun2 и т.д.). Для серверов Windows желательно сохранить эту строку как есть. Если необходимо использовать определенное устройство Windows, то потребуется опцияdev-node
.server 10.200.0.0 255.255.255.0
: операторserver
переводит OpenVPN в режим сервера. Адрес подсети и маска определяют подсеть и маску, которые будут использоваться для VPN-сервера и клиентов. Серверу VPN назначается первый адрес, который в данном случае равен10.200.0.1
. Первому клиенту будет назначен адрес10.200.0.2
(потому что мы используемtopology subnet
). Операторserver
для этой конфигурации внутренне расширяется следующим образом:
mode server
tls-server
push “topology subnet”
ifconfig 10.200.0.1 255.255.255.0
ifconfig-pool 10.200.0.2 10.200.0.254 255.255.255.0
push “route-gateway 10.200.0.1”
Это взято со страницы руководства OpenVPN по адресу https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage. Если эти строки конфигурации используются вместо макроса сервера — используется та же конфигурация.
Заметка
Расширение включает push “topology subnet”
, потому что мы также указали topology subnet
в файле конфигурации. Без этой строки расширение не произошло бы.
topology subnet
: определяет топологию для VPN. Текущей топологией по умолчанию являетсяnet30
, в которой серверу и каждому клиенту назначено отдельное миниатюрное пространство подсети/30
. Более подробная информация об использовании topology subnet против topology net30 приведена в следующем разделе.persist-tun
иpersist-key
: дает указание OpenVPN не открывать повторно устройство tun и не генерировать новый ключ при каждом перезапуске туннеля. Эти параметры особенно полезны в сочетании сuser nobody
так как обычно уnobody
нет прав доступа для открытия нового интерфейса tun.keepalive 10 60
: используется для проверки работоспособности VPN-соединения, даже если по туннелю нет трафика. Операторkeepalive
— это макрос для командping
иping-restart
. Операторkeepalive 10 60
в конфигурации на стороне сервера расширяется до:
ping 10
ping-restart 120
push “ping 10”
push “ping-restart 60”
Предыдущий код означает:
- Отправка пинг-сообщений каждому клиенту каждые 10 секунд.
- Перезапуск соединения, если клиент не отвечает в течение 120 секунд (2 * 60 = 120)
- Передача инструкций
ping 10
иping-restart 60
каждому клиенту
dh <путь к файлу Диффи-Хеллмана>
: указывает путь к файлу DH, который требуется для сервера OpenVPN. Без этого файла сервер не может установить безопасное соединение TLS с клиентами. Рекомендуется использовать абсолютный путь для этого файла (а также к другим сертификатам и секретным ключам).ca <путь к файлу CA>
: указывает путь к файлу CA. Файл CA должен содержать сертификат CA (или даже набор сертификатов), который использовался для подписи клиентских сертификатов. Это необязательно должен быть тот же CA, который использовался для подписи сертификата сервера, хотя в нашей настройке PKI мы использовали тот же CA. Рекомендуется использовать абсолютный путь для этого файла (а также к другим сертификатам и секретным ключам).cert <путь к файлу сертификата X.509>
: указывает путь к файлу публичного сертификата X.509 сервера. Этот сертификат необходим серверу OpenVPN даже если клиенты подключаются без использования сертификатов. Рекомендуется использовать абсолютный путь для этого файла (а также к другим сертификатам и секретным ключам).key <путь к файлу приватного ключа>
: указывает путь к файлу приватного ключа сервера. Этот файл приватного ключа необходим серверу OpenVPN, даже если клиенты подключаются без использования сертификатов или приватных ключей. Этот файл должен быть доступен для чтения только пользователю root (или администратору), так как любой пользователь, имеющий доступ на чтение приватных ключей, может расшифровать трафик OpenVPN. Обратите внимание — OpenVPN прочтет этот файл перед удалением пользовательских привилегий. Рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и приватным ключам).user nobody
иgroup nobody
: дает указание OpenVPN перейти на пользователя Unixnobody
и группуnobody
после установления соединения. Это дополнительно повышает безопасность, так как атака на туннель с меньшей вероятностью приведет к эксплойту root. Обратите внимание, что в Debian/Ubuntu используется группаnogroup
.verb 3
: устанавливает уровень детализации в значение по умолчанию 3. Увеличьте это число для просмотра более подробного вывода процесса OpenVPN. Если детализация установлена в 0, то вряд ли будет выдаваться какой-либо результат регистрации. Однако это не рекомендуется.daemon
: указывает OpenVPN демонизировать себя — что означает продолжение работы процесса OpenVPN даже после закрытия окна терминала, в котором был запущен OpenVPN.log-append <путь к файлу журнала>
: указывает путь к файлу журнала сервера. Используяlog-append
вместоlog <путь к файлу>
, мы запрещаем OpenVPN обрезать файл журнала при каждом запуске. Для этого файла также рекомендуется использовать абсолютный путь.
Файл конфигурации клиента содержит:
client
: переводит OpenVPN в режим клиента. Он инструктирует OpenVPN подключаться к удаленному серверу и получать и обрабатывать параметры конфигурации с сервера после успешного установления соединения. Операторclient
внутренне расширен следующим образом:
proto udp
: указывает протокол для использования. Хотя это протокол по умолчанию, разумно явно указать его в файле конфигурации для избежания путаницы.remote openvpnserver.example.com
: здесь указывается имя VPN-сервера для подключения. Имя может быть либо полным именем домена (FQDN), либо адресом IPv4. Далее в этой главе мы увидим, как подключиться к VPN-серверу на основе IPv6.port 1194
: порт, который клиент OpenVPN будет использовать для подключения к серверу. Значение по умолчанию —1194
, но можно использовать любой допустимый и доступный номер порта.
Заметка
Существует несколько способов указать удаленный адрес и порт для VPN-сервера. Например, также можно использовать remote openvpnserver.example.com:1194
.
dev tun
: указывает имя устройства tun, которое будет использоваться для сервера. Не добавляя номер позади tun, мы инструктируем OpenVPN открыть новое устройство. Этому новому устройству будет присвоен первый доступный номер в ядре системы, начиная с 0 (tun0, tun1, tun2 и т.д.). Для Windows-клиентов желательно сохранить эту строку как есть. Если необходимо использовать определенное устройство Windows, то потребуется опцияdev-node
.nobind
: указывает клиенту OpenVPN не связывать (и не прослушивать) порт, указанный с использованиемport
. Вместо этого клиент OpenVPN будет использовать порт в диапазоне анонимных портов, который обычно составляет 1024-65335.ca <путь к файлу CA>
: указывает путь к файлу CA. Этот файл CA должен содержать сертификат CA (или даже набор сертификатов), который использовался для подписи сертификата сервера. Это необязательно должен быть тот же CA, который использовался для подписи сертификата клиента, хотя в нашей настройке PKI мы использовали тот же CA. В Linux/Unix рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и секретным ключам).cert <путь к файлу сертификата X.509>
: указывает путь к файлу публичного сертификата клиента X.509. Можно настроить OpenVPN для использования аутентификации по имени пользователя/паролю вместо сертификатов, но это считается менее безопасным. В Linux/Unix рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и приватным ключам).key <путь к файлу закрытого ключа>
: указывает путь к файлу приватного ключа клиента. Этот файл должен быть доступен для чтения только пользователю root (или администратору), так как OpenVPN прочтёт этот файл перед удалением пользовательских привилегий. В Linux рекомендуется использовать абсолютный путь для этого файла (а также пути к другим сертификатам и секретным ключам).
Обратите внимание, что мы не указали daemon
или log-append
для конфигурации клиента, так как в большинстве случаев приложение-оболочка запускает процесс openvpn
. Это приложение будет затем управлять журналом OpenVPN. Наиболее часто используемые приложения-оболочки:
Операционная система | Приложения-оболочки |
---|---|
Windows | OpenVPN-GUI.exe (часть пакета установки OpenVPN) |
Mac OS X | Tunnelblick или Viscosity |
Linux | NetworkManager (с плагином OpenVPN) |
Topology subnets против topology net30
OpenVPN поддерживает несколько топологий в режиме tun:
- net30 (по умолчанию, может измениться с v2.4)
- подсеть
- p2p
Начнем с последней, топология p2p почти никогда не использовалась и была первым методом назначения одного IP-адреса VPN-клиенту. Однако она работает только на производных от Linux и Unix и, следовательно, никогда не использовалась очень широко.
Топология net30 является текущим значением по умолчанию. В этом режиме OpenVPN устанавливает сетевой интерфейс «точка-точка» для каждого клиента (и для сервера) и назначает подсеть /30
каждому. Это означает, что серверу и каждому клиенту назначен блок из четырех IP-адресов. В файле конфигурации сервера будет указано server 10.200.0.0 255.255.255.0
. С топологией net30
это заставляет OpenVPN назначать следующие IP-блоки:
-
Серверу OpenVPN назначается с 10.200.0.0 по 10.200.0.3.
-
Первому клиенту назначаются с 10.200.0.4 по 10.200.0.7.
-
Второму клиенту назначаются с 10.200.0.8 по 10.200.0.11 и так далее.
Каждая подсеть
/30
состоит из четырех адресов; для первого клиента эти адреса следующие:- 10.200.0.4: Это адрес подсети
/30
. Каждая подсеть должна иметь такой адрес, связанный с ней. - 10.200.0.5: Это адрес виртуальной конечной точки. Он необходим для функционирования OpenVPN, но на самом деле его нельзя использовать, и он даже не может быть проверен.
- 10.200.0.6: IP-адрес VPN клиента.
- 10.200.0.7: широковещательный адрес подсети
/30
. Каждая подсеть должна иметь такой широковещательный адрес, связанный с ней.
- 10.200.0.4: Это адрес подсети
Как видите, это не очень эффективный метод назначения IP-адресов — для каждого VPN-клиента назначаются четыре IP-адреса. Для небольших настроек VPN этот метод работает нормально, но он не масштабируется для сервера с более чем 100 подключенными клиентами.
Чтобы преодолеть эту проблему — был введен режим topology subnet
. Он позволяет OpenVPN назначать один IP-адрес всем клиентам, что значительно упрощает управление крупномасштабной VPN. Существуют некоторые проблемы с маршрутизацией на стороне сервера (подробнее см. раздел «Маршрутизация и маршрутизация на стороне сервера» далее в этой главе), из-за которых этот режим топологии не стал стандартным, но ожидается, что начиная с версии 2.4 он может стать режимом топологии по умолчанию.
Добавление повышенной безопасности
Начальный набор файлов конфигурации является хорошей отправной точкой для развертывания клиент-серверной конфигурации. Однако для системы производственного уровня мы должны добавить больше безопасности. Безопасность можно повысить двумя способами:
- Добавляя ключи
tls-auth
- Путем проверки расширенных атрибутов использования ключей используемых сертификатов
Использование ключей tls-auth
В режиме клиент-сервер OpenVPN будет пытаться установить канал управления TLS для каждого подключаемого клиента. Настройка канала управления TLS требует много ресурсов, что делает OpenVPN подверженным атакам типа «отказ в обслуживании»: злоумышленник может запустить множество неправильно настроенных клиентов, которые будут одновременно пытаться подключиться к серверу OpenVPN. Для каждого из них сервер OpenVPN будет пытаться установить соединение TLS, что фактически приведет к отказу в обслуживании для правильно настроенных клиентов. Это особенно верно, когда OpenVPN работает с использованием proto udp
(рекомендуется по умолчанию). UDP — это трафик без установления соединения, что означает проверку сервером действительности пакета OpenVPN для каждого нового UDP-пакета.
Для устранения этой возможной уязвимости OpenVPN ввел дополнительный уровень аутентификации в канал управления TLS, используя опцию tls-auth
. Эта TLS-аутентификация должна выполняться с использованием предустановленного общего ключа, поскольку сервер еще не знает — пытается подключиться действительный клиент или нет. Предустановленные ключи, используемые здесь, являются теми же самыми ключами, используемыми в режиме точка-точка, как описано в Главе 2, Режим точка-точка.
Генерация ключа tls-auth
Чтобы сгенерировать ключ tls-auth
— мы используем ту же команду, что описана в Главе 2, Режим точка-точка:
[root@server]# openvpn --genkey --secret /etc/openvpn/movpn/ta.key
Точно так же как файл приватного ключа клиента — этот файл должен быть скопирован каждому клиенту с использованием безопасного канала или должен быть включен в пакет конфигурации безопасного клиента:
[root@client]# cd /etc/openvpn/movpn
[root@client]# scp root@openvpnserver:/etc/openvpn/movpn/ta.key
Проверка атрибутов использования ключа сертификата
Когда сертификаты X.509 сгенерированы — к сертификату могут быть добавлены специальные атрибуты расширенного использования ключа (EKU). Это позволяет нам указать назначение сертификата, например, сертификат только для сервера или сертификат только для клиента. Сертификаты, используемые на защищенных веб-сайтах, используют те же атрибуты EKU.
Скрипт easy-rsa
и инструмент ssladmin
устанавливают атрибуты EKU по умолчанию при создании сертификата сервера или несерверного (клиентского) сертификата. Чтобы проверить атрибуты EKU сертификата, используйте следующие команды:
$ openssl x509 -text -noout -in server.crt |
grep -C 1 “Key Usage”
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Key Usage:
Digital Signature, Key Encipherment
Это говорит нам о том, что сертификат server.crt
может использоваться только для аутентификации сервера.
В старых сертификатах эти атрибуты EKU могут быть не заданы, а вместо этого используется (не рекомендуется) атрибут Netscape Cert Type
. Скрипт easy-rsa
и инструмент ssladmin
также устанавливают этот атрибут:
$ openssl x509 -text -noout -in server.crt |
grep -C 1 “Netscape Cert”
Netscape Cert Type:
SSL Server
Однако этот сертификат может быть установлен только для серверных сертификатов.
Безопасность OpenVPN может быть повышена путем проверки этих атрибутов. Для этого мы используем опцию remote-cert-tls
.
Опция remote-cert-tls client
предписывает серверу OpenVPN разрешать подключения только от VPN-клиентов, у которых есть сертификат с атрибутом EKU X.509, установленным как TLS Web Client Authentication
.
Это не позволяет хакеру настроить мошеннический сервер OpenVPN с помощью клиентского сертификата.
Аналогично, для клиента опция remote-cert-tls server
дает указание клиенту OpenVPN разрешать подключения только к VPN-серверу, у которого есть сертификат с атрибутом EKU X.509, установленным в значение TLS Web Server Authentication
.
Это не позволяет злонамеренному клиенту настроить мошеннический сервер OpenVPN для привлечения подключений от других пользователей VPN.
Также можно проверить наличие атрибута Netscape Cert Type
. Поскольку это атрибут сертификата сервера — клиент OpenVPN должен проверить этот атрибут при подключении. Для этого можно использовать опцию ns-cert-type server
. Предпочтительно использовать параметр remote-cert-tls
.
Основные конфигурационные файлы производственного уровня
Мы расширим предыдущие файлы конфигурации клиента и сервера, чтобы использовать только что созданный ключ tls-auth
. Мы сделаем это добавив строку в файл конфигурации movpn-04-01-server.conf
, а также второй параметр повышения безопасности:
proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60
remote-cert-tls client
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
user nobody
group nobody
verb 3
daemon
log-append /var/log/openvpn.log
Заметка
Обратите внимание, что порядок операторов в этом файле является случайным. Строки remote-cert-tls
и tls-auth
могут быть добавлены в любом месте файла.
Этот файл конфигурации является основным файлом конфигурации сервера, который мы будем использовать в этой и других главах. Сохраните его как basic-udp-server.conf
, чтобы мы могли использовать его позже.
Мы добавляем две одинаковые строки в файл конфигурации клиента movpn-04-01-client.conf
:
client
proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind
remote-cert-tls server
tls-auth /etc/openvpn/movpn/ta.key 1
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/client1.crt
key /etc/openvpn/movpn/client1.key
Сохраните его как basic-udp-client.conf
.
Второй параметр опции tls-auth
— это так называемое направление ключа. OpenVPN поддерживает использование направления ключа, то есть разные ключи используются для входящих и исходящих данных. Это еще больше повышает безопасность. Флаг direction
должен быть установлен в 0
на одном конце и 1
— на другом. В режиме клиент-сервер это означает, что сервер имеет параметр 0
для направления, а для всех клиентов параметр направления установлен в 1
.
Когда мы запускаем сервер OpenVPN, то видим что канал управления TLS теперь защищен статическим ключом:
[root@server]# openvpn --config basic-udp-server.conf --suppresstimestamps
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL]
[PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Enter Private Key Password:
WARNING: this configuration may cache passwords in memory -- use
the auth-nocache option to prevent this
Control Channel Authentication: using ‘/etc/openvpn/movpn/ta.key’ as
a OpenVPN static key file
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
sbinip link set dev tun0 up mtu 1500
sbinip addr add dev tun0 10.200.0.1/24 broadcast 10.200.0.255
GID set to nobody
UID set to nobody
UDPv4 link local (bound): [undef]
UDPv4 link remote: [undef]
Initialization Sequence Completed
Аналогично, когда мы запускаем клиент OpenVPN — мы видим:
[root@client]# openvpn --config basic-udp-client.conf --suppresstimestamps
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL]
[PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Control Channel Authentication: using ‘/etc/openvpn/movpn/ta.key’ as
a OpenVPN static key file
UDPv4 link local: [undef]
UDPv4 link remote: [AF_INET]openvpnserver:1194
[Mastering OpenVPN Server] Peer Connection Initiated with
[AF_INET]openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
sbinip link set dev tun0 up mtu 1500
sbinip addr add dev tun0 10.200.0.2/24 broadcast 10.200.0.255
Initialization Sequence Completed
Конфигурация на основе TCP
Протоколом, используемым в OpenVPN по умолчанию, является протокол UDP. Создание версий с TCP на основе созданных ранее файлов конфигурации очень простое. В файлах конфигурации клиента и сервера измените строку proto udp
на proto tcp
. Весь файл конфигурации сервера для TCP указан здесь:
proto tcp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60
remote-cert-tls client
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
user nobody
group nobody
verb 3
daemon
log-append /var/log/openvpn.log
Сохраните этот файл конфигурации как basic-tcp-server.conf
.
Аналогично, для файла конфигурации клиента:
client
proto tcp
remote openvpnserver.example.com
port 1194
dev tun
nobind
remote-cert-tls server
tls-auth /etc/openvpn/movpn/ta.key 1
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/client1.crt
key /etc/openvpn/movpn/client1.key
Сохраните его как basic-tcp-client.conf
.
Конфигурационные файлы для Windows
Базовые файлы конфигурации для платформы Windows немного отличаются от файлов для платформ Linux/Unix или Mac OS. На платформе Windows используется оболочка Openvpn-GUI.exe
, которая предполагает, что все файлы конфигурации хранятся в каталоге C:Program FilesOpenVPNconfig
или его подкаталогах. Название каталога Program Files
может отличаться для других языков. На всех языках переменная среды Windows %PROGRAMFILES%
будет указывать на правильное расположение.
Таким образом, базовые файлы конфигурации UDP и TCP на самом деле немного короче. Создайте файл конфигурации клиента UDP:
client
proto udp
remote openvpnserver.example.com
port 1194
dev tun
nobind
remote-cert-tls server
tls-auth ta.key 1
ca movpn-ca.crt
cert client1.crt
key client1.key
Сохраните его как basic-udp-client.ovpn
, чтобы мы могли использовать его позже в этой книге.
Аналогичным образом создайте конфигурацию клиента:
client
proto tcp
remote openvpnserver.example.com
port 1194
dev tun
nobind
remote-cert-tls server
tls-auth ta.key 1
ca movpn-ca.crt
cert client1.crt
key client1.key
Сохраните его как basic-tcp-client.ovpn
.
Маршрутизация и маршрутизация на стороне сервера
VPN действительно полезен только тогда, когда клиенты VPN имеют доступ к ресурсам на стороне сервера. Для доступа к этим ресурсам в большинстве случаев необходима маршрутизация. OpenVPN имеет много опций для автоматической настройки и удаления дополнительных маршрутов, когда клиент подключается или отключается.
Следует отметить, что большинство проблем с устранением неполадок OpenVPN связано тинггл с маршрутизацией. Настройка VPN-соединения — это одно, а правильная передача сетевого трафика — это другое. Она имеет мало общего с самим OpenVPN и больше связана с таблицами маршрутизации и правилами брандмауэра на стороне клиента и сервера.
Наиболее распространенная схема доступа к ресурсам в серверной сети изображена здесь:
Локальная сеть на стороне сервера: 192.168.122.0/24. Ресурсы, к которым VPN-клиенты должны получить доступ, находятся в этой подсети. Таким образом — сервер должен проинструктировать VPN-клиентов что необходимо установить дополнительный маршрут. Это делается с помощью опции push
, которая передает маршрута клиенту. Этого также можно достичь добавив маршрут в сам файл конфигурации клиента, но это плохо масштабируется. Связано это с тем, что для каждого нового сетевого маршрута на стороне сервера необходимо обновить все файлы конфигурации клиента.
Мы начнем с файла basic-udp-server.conf
и добавим одну строку:
proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60
remote-cert-tls client
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
user nobody
group nobody
verb 3
daemon
log-append /var/log/openvpn.log
push “route 192.168.122.0 255.255.255.0”
Мы сохраняем его как movpn-04-03-server.conf
и запускаем сервер OpenVPN, используя этот файл конфигурации. На этот раз мы используем Windows 7 64-разрядную версию Professional в качестве клиента OpenVPN, на котором установлена версия OpenVPN 2.3.4-I004 для X86_64. Скопируйте следующие файлы на компьютер с Windows:
- basic-udp-client.ovpn
- movpn-ca.crt
- client1.crt
- client1.key
Возьмите и поместите их в C:Program FilesOpenVPNconfig
(или %PROGRAMFILES%OpenVPNconfig
).
Запустите приложение OpenVPN GUI, выберите конфигурацию basic-udp-client
и нажмите Connect:
Как только соединение будет успешно установлено — значок OpenVPN GUI становится зеленым и информация о соединении отображается при наведении курсора на значок:
Теперь мы можем проверить, работает ли VPN-соединение с сервером, открыв командную оболочку и выполнив команду ping
на сервере:
После того, как мы проверили что сервер OpenVPN доступен — мы должны убедиться, что сервер OpenVPN пересылает IP-трафик и нам необходимо добавить дополнительный маршрут на шлюзе со стороны сервера чтобы гарантировать правильное перенаправление VPN-трафика обратно через сервер VPN. Без этого маршрута машины в серверной сети не будут знать откуда поступает трафик VPN с IP-адресами 10.200.0.0/24
и, скорее всего, будут неправильно маршрутизировать или отбрасывть пакеты:
[root@server]# sysctl -w net.ipv4.ip_forward=1
[router]# ip route add 10.200.0.0/24 via 192.168.122.1
Теперь мы проверим таблицу маршрутизации на стороне клиента и проверим — сможем ли мы подключиться к компьютеру в локальной сети на стороне сервера:
Первая часть выходных данных показывает что несколько маршрутов для подсети VPN 10.200.0.0/24
были добавлены к таблицам маршрутизации, включая маршрут для pushed
подсети 192.168.122.0/24
. Обратите внимание на последний столбец выходных данных, который показывает метрику маршрута. Windows вычисляет метрику (в данном случае 286), но она может быть отменена с помощью правильных операторов маршрута. Маршрут, добавленный с помощью push route 192.168.122.0 255.255.255.0
, имеет более низкую метрику, поскольку была указана метрика OpenVPN по умолчанию — 30.
Специальные параметры для вариантов маршрута
Аналогично тому, что описано в Главе 2, Режим точка-точка инструкция push route <network> <netmask> [vpn_gateway] [metric]
жизненно важна в этой настройке. Параметр route
принимает до четырех параметров: два обязательных и два дополнительных. Третий параметр играет важную роль в этой настройке. Слово vpn_gateway
— это специальное ключевое слово OpenVPN, которое указывает адрес удаленной конечной точки VPN. Обычно это ключевое слово указывать не нужно, кроме случаев необходимости указания метрики для этого маршрута.
Полный синтаксис для инструкции маршрута — route <network> <netmask> [gateway] [metric]
, где gateway
может быть явно задан как адрес IPv4 или могут использоваться специальные ключевые слова vpn_gateway
или net_gateway
. Если шлюз и метрика не указаны, используется vpn_gateway
.
Ключевым словом net_gateway
полезно указывать подсеть, которая не должна быть маршрутизируема через VPN. Для net_gateway
заменяется шлюз по умолчанию до установления VPN-соединения.
Метрика имеет метрику по умолчанию, которую можно установить с помощью route-metric m
, которая затем применяется ко всем маршрутам. Если вы хотите отменить метрику для определенного маршрута (как мы это сделали в данном примере), то необходимо указать шлюз (в нашем случае vpn_gateway
), за которым следует метрика для этого конкретного маршрута.
Маскарадинг
Иногда невозможно добавить маршрут на стороне сервера для перенаправления всего VPN-трафика обратно на сервер OpenVPN. В этом случае быстрый и грязный подход заключается в использовании маскарадинга. В Linux вы можете использовать команду iptables
для настройки маскарадинга на сервере:
[root@server]# iptables -t nat -I POSTROUTING -o eth0
-s 10.200.0.0/24 -j MASQUERADE
Этот оператор iptables
указывает ядру Linux перезаписывать весь трафик, поступающий из подсети VPN 10.200.0.0/24
и покидающий интерфейс Ethernet eth0
. У трафика, покидающего интерфейс eth0
адрес источника переписывается так, что он выглядит будто исходит от самого сервера OpenVPN, а не от клиента OpenVPN. Это простой способ заставить маршрутизацию работать, но недостаток заключается в том, что больше невозможно различить, поступает ли данный трафик с самого сервера OpenVPN или с одного из подключенных клиентов.
Перенаправление шлюза по умолчанию
Очень распространенное использование VPN — это маршрутизация всего трафика через безопасный туннель. Это позволяет безопасно получить доступ к сети или даже самому Интернету изнутри враждебной среды (например, небезопасный wi-fi в интернет-кафе).
Перенаправление шлюза по умолчанию достигается добавлением строки push “redirectgateway [def1 local bypass-dhcp bypass-dns]”
в файл конфигурации сервера.
Параметры для redirect-gateway
, перечисленные ранее, являются необязательными, но они могут играть очень важную роль:
- Параметры не добавлены: В этом случае OpenVPN заменит существующий шлюз по умолчанию (0.0.0.0/0) на адрес самого сервера OpenVPN. Также добавляется дополнительный маршрут к самому серверу OpenVPN, чтобы сам трафик OpenVPN отправлялся непосредственно на сервер, а не через туннель. Недостаток заключается в том, что если соединение OpenVPN остановлено или прервано — исходный шлюз по умолчанию не восстанавливается. Это обычно приводит к полной потере сетевого подключения.
- Параметр
def1
: вместо замены существующего шлюза по умолчанию — OpenVPN добавит два новых маршрута, 0.0.0.0/1 и 128.0.0.0/1. Эти маршруты вместе также охватывают все пространство IPv4 и являются более конкретными (/1
), чем обычный шлюз (/0
). Маршрутизация всегда происходит по более конкретным маршрутам, и, таким образом, весь трафик передается через VPN. Преимущество этого трюка в том, что шлюз по умолчанию остается без изменений. Если VPN-соединение останавливается — исходный шлюз можно восстановить. Обратите внимание, что в этом случае OpenVPN добавит явный маршрут к самому серверу OpenVPN — поэтому сам зашифрованный трафик не будет отправляться через туннель. - Параметр
bypass-dhcp
: иногда полезно добавить явный маршрут к локальному DHCP-серверу в локальной сети на стороне клиента. Это позволяет избежать туннелирования обновлений DHCP через VPN, хотя в большинстве сетевых настроек этого не происходит, поскольку как правило существует более конкретный маршрут к сегменту сети, на котором расположен локальный сервер DHCP. - Параметр
bypass-dns
: иногда может потребоваться добавить явный маршрут к локальному DNS-серверу, так как в противном случае разрешение доменных имен нарушается. Это происходит только в том случае — если вы хотите использовать клиентский DNS-сервер, но хотите направить весь трафик через туннель.
Помимо опции redirect-gateway
, мы также можем указать опцию push “redirect-private [def1 local bypass-dhcp bypass-dns]”
в файл конфигурации сервера. Этот параметр принимает те же параметры, что и redirect-gateway
, но не изменяет существующий шлюз по умолчанию. Это может быть полезно для передачи маршрутов к частным подсетям.
Сейчас мы добавляем push "redirect-gateway def1"
в файл конфигурации basic-udp-server.conf
. Сохраните его как movpn-04-06-server.conf
, запустите сервер OpenVPN и повторно подключите клиента, используя файл конфигурации по умолчанию.
После того, как соединение установлено, мы проверяем что весь трафик теперь проходит через VPN, используя команду traceroute
(используйте tracert -d
в командной оболочке Windows):
Первый hop
в выводе отслеживаемого маршрута 10.200.0.1
, что является IP-адресом сервера OpenVPN. Это доказывает, что трафик проходит через VPN по умолчанию.
Параметр конфигурации redirect-gateway def1
указывает клиенту OpenVPN добавить три маршрута в клиентскую операционную систему:
10.198.1.1 via 192.168.4.254 dev eth0
0.0.0.0/1 via 10.200.0.1 dev tun0
128.0.0.0/1 via 10.200.0.1 dev tun0
Первый маршрут — это явный маршрут от клиента к серверу OpenVPN через интерфейс LAN. Этот маршрут необходим, так как в противном случае весь трафик для самого сервера OpenVPN будет проходить через туннель.
Два других маршрута — это хитрая уловка для отмены маршрута по умолчанию, чтобы весь трафик передавался через туннель, а не шлюз локальной сети по умолчанию.
Преимущество этого метода заключается в том, что исходный шлюз по умолчанию остается без изменений. Когда VPN отключена — первоначальный адрес шлюза автоматически вступает во владение снова. Если бы мы просто использовали redirect-gateway
— есть вероятность что шлюз по умолчанию будет потерян при отключении VPN, что приведет к полной потере сетевого подключения.
Недостатком этого метода являются клиенты Windows 7 и выше: Windows иногда отказывается доверять адаптеру TAP-Win без маршрута по умолчанию и поэтому помечает его как общедоступный адаптер. В Windows 7 невозможно использовать общедоступный адаптер для общего доступа к файлам или принтерам. В следующей главе мы рассмотрим как обойти эту особенность.
Специфичная для клиента конфигурация — файлы CCD
В инсталляциях, где один сервер может обрабатывать подключения от множества клиентов, иногда необходимо установить параметры для каждого клиента, которые отменяют глобальные параметры или добавить дополнительные параметры для конкретного клиента. Опция client-config-dir
очень полезна для этого. Она позволяет администратору VPN назначать конкретный IP-адрес клиенту для передачи определенных параметров, как например DNS-сервер — конкретному клиенту или для временного отключения клиента. Эта опция также необходима, если вы хотите маршрутизировать клиентскую подсеть на сторону сервера, как мы увидим позже.
client-config-dir
или CCD-файл может содержать следующие параметры:
push
: полезно для отправки DNS и WINS-серверов, маршрутов и т.д.push-reset
: полезно для отмены глобальных параметровpush
iroute
: полезно для маршрутизации клиентских подсетей IPv4 на серверiroute-ipv6
: полезно для маршрутизации клиентских подсетей IPv6 на серверifconfig-push
: полезно для назначения определенного адреса IPv4 клиентуifconfig-ipv6-push
: полезно для назначения конкретного адреса IPv6 клиентуdisable
: полезно для временного полного отключения клиентаconfig
: полезно для включения другого файла конфигурации CCD
Чтобы использовать файлы CCD мы добавляем в файл конфигурации basic-udp-server.conf
строку:
client-config-dir /etc/openvpn/movpn/clients
Сохраните его как movpn-04-04-server.conf
. Затем создайте каталог для CCD и создайте в нем файл CCD для клиента с сертификатом client1.crt
:
[root@server]# mkdir -p /etc/openvpn/movpn/clients
[root@server]# echo “ifconfig-push 10.200.0.99 255.255.255.0”
> /etc/openvpn/movpn/clients/client1
[root@server]# chmod 755 /etc/openvpn/movpn/clients
[root@server]# chmod 644 /etc/openvpn/movpn/clients/client1
Имя файла CCD основано на общем имени субъекта сертификата (часть «/CN=
»), как указано в файле client1.crt
:
$ openssl x509 -subject -noout -in client1.crt
subject= /C=ZA/ST=Enlightenment/O=Mastering
OpenVPN/CN=client1/emailAddress=root@example.org
В нашем случае имя файла должно быть просто client1
без расширения, даже в Windows! Если в common name есть пробелы — их необходимо преобразовать в подчеркивания (_). Если проводник Windows настроен на скрытие расширений для распространенных типов файлов — проще будет открыть окно командной оболочки (cmd.exe) и удалить расширение с помощью следующих команд:
C:> cd %PROGRAMFILES%openvpnconfigclients
C:> rename client1.txt client1,145.102.134.201:35519
Затем мы запускаем сервер OpenVPN, используя этот файл конфигурации и подключаем VPN-клиента. Журнал подключений показывает что клиенту назначен адрес 10.200.0.99:
[root@client]# openvpn --config basic-udp-client.conf
OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL]
[PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Control Channel Authentication: using ‘/etc/openvpn/movpn/ta.key’ as
a OpenVPN static key file
UDPv4 link local: [undef]
UDPv4 link remote: [AF_INET]openvpnserver:1194
[Mastering OpenVPN Server] Peer Connection Initiated with
[AF_INET]openvpnserver:1194
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.200.0.99/24 broadcast 10.200.0.255
Initialization Sequence Completed
При настройке детальности вывода по-умолчанию журнал на стороне сервера не показывает никаких сообщений о получении файла CCD. Увеличьте настройку детальности до 5 или выше, чтобы увидеть обрабатывается ли файл CCD:
<client-ip>:49299 [client1] Peer Connection Initiated with
[AF_INET]<client-ip>:49299
client1/<client-ip>:49299 OPTIONS IMPORT: reading client specific
options from: /etc/openvpn/movpn/clients/client1client1/<clientip>:49299 MULTI: Learn: 10.200.0.99 -> client1/<client-ip>:49299
Как определить, правильно ли обрабатывается файл CCD
Поиск и исправление правильности обработки CCD-файла может быть немного сложнее. Следующие рекомендации помогут при отладке проблем с файлами CCD:
- Всегда указывайте полный путь для опции
client-config-dir
. - Убедитесь что каталог доступен, а файл CCD доступен для чтения пользователю, который используется для запуска OpenVPN (в большинстве случаев
nobody
илиopenvpn
; в конфигурациях, перечисленных в этой книге, используетсяuser nobody
). - Убедитесь что для файла CCD используется правильное имя файла без каких-либо расширений.
- Если возможно — добавьте опцию
ccd-exclusive
в файл конфигурации сервера. Это дает указание OpenVPN разрешать клиентские подключения только при наличии определенного CCD-файла для этого клиента. Если при чтении CCD-файла для определенного клиента возникла проблема — клиенту также будет отказано в доступе. Таким образом, вы будете знать, что ваши настройкиclient-config-dir
выполнены неправильно.
CCD файлы и топология net30
Если вы используете (по умолчанию) настройку топологии (topology net30
), то оператор ifconfig-push
немного отличается. Поскольку каждому клиенту теперь назначена подсеть /30
, в операторе ifconfig-push
должна быть указана действительная подсеть VPN /30
. Применяются следующие правила:
- Каждая подсеть
/30
должна начинаться с адреса, кратного 4 (4, 8, 12 и т.д.) - Локальный IP-адрес VPN является третьим адресом в этой подсети.
- IP-адрес виртуальной удаленной конечной точки является вторым адресом.
Например, действительный IP-адрес для VPN-клиента — 10.200.0.50:
- Подсеть 10.200.0.48/32, где 48 кратно 4
- IP-адрес VPN-клиента будет 50 (48 + 2 = 50)
- Виртуальная удаленная конечная точка — 49 (48 + 1 = 49)
Файл CCD теперь должен содержать следующее:
ifconfig-push 10.200.0.50 10.200.0.49
Клиентская маршрутизация
Иногда полезно разрешить серверу VPN (или другим клиентам VPN) доступ к ресурсам, подключенным к конкретному клиенту. Это известно как маршрутизация на стороне клиента. Для клиентской маршрутизации в OpenVPN для этого клиента требуется файл CCD, содержащий оператор iroute
. Это также требует соответствующей инструкции route
в файле конфигурации сервера OpenVPN.
Рассмотрим следующую схему сети:
Подсеть 192.168.4.0/24 должна быть доступна из локальной сети на стороне сервера, а подсеть 192.168.122.0/24 — на стороне сервера из локальной сети клиента. Это может быть достигнуто следующим образом:
- Добавьте две строки в файл конфигурации
basic-udp-server.conf
:
client-config-dir /etc/openvpn/movpn/clients
route 192.168.4.0 255.255.255.0 10.200.0.1
Сохраните его как movpn-04-05-server.conf
.
- Создайте CCD-файл
client1
в каталоге/etc/openvpn/movpn/clients
с содержимым:
ifconfig-push 10.200.0.99 255.255.255.0
iroute 192.168.4.0 255.255.255.0
push “route 192.168.122.0 255.255.255.0”
- Убедитесь, что пересылка (форвардинг) IP-трафика включена и разрешена как на клиенте, так и на сервере:
[root@client]# sysctl -w net.ipv4.ip_forward=1
[root@server]# sysctl -w net.ipv4.ip_forward=1
-
Запустите сервер OpenVPN, используя файл конфигурации
movpn-04-05-server.conf
. -
Подключите клиента, используя файл конфигурации по умолчанию
basic-udp-client.conf
. -
После того как соединение установлено — мы проверяем, что обе подсети могут связаться друг с другом используя
ping
:
[root@client]# ping -c 3 192.168.122.184
PING 192.168.122.184 (192.168.122.184) 56(84) bytes of data.
64 bytes from 192.168.122.184: icmp_seq=1 ttl=63 time=3.29 ms
64 bytes from 192.168.122.184: icmp_seq=2 ttl=63 time=3.27 ms
64 bytes from 192.168.122.184: icmp_seq=3 ttl=63 time=3.31 ms
--- 192.168.122.184 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 3.277/3.296/3.317/0.016 ms
[root@server]# ping -c 3 192.168.4.10
PING 192.168.4.10 (192.168.4.10) 56(84) bytes of data.
64 bytes from 192.168.4.10: icmp_seq=1 ttl=63 time=6.31 ms
64 bytes from 192.168.4.10: icmp_seq=2 ttl=63 time=5.07 ms
64 bytes from 192.168.4.10: icmp_seq=3 ttl=63 time=5.14 ms
--- 192.168.4.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 5.073/5.512/6.317/0.575 ms
Подробное объяснение конфигурации client-config-dir
На первом этапе мы добавляем две новые строки в файл конфигурации сервера. Эти строки устанавливают client-config-dir
и инструктируют OpenVPN добавить системный сетевой маршрут для подсети 192.168.4.0/24. Здесь необходимо явно указать адрес шлюза 10.200.0.1
из-за незначительной ошибки в OpenVPN. Ожидается, что этот недостаток будет исправлен в версии 2.4, после чего вы можете снова указать route 192.168.4.0 255.255.255.0
.
Содержимое файла CCD указывает OpenVPN, что при подключении клиента с Common Name client1
IP-адрес для этого клиента должен быть установлен на 10.200.0.99
. Кроме того, OpenVPN должен установить внутренний маршрут (iroute
) для этого клиента, чтобы сам OpenVPN знал, что подсеть 192.168.4.0/24 расположена за этим конкретным клиентом.
Наконец, оператор push route
инструктирует OpenVPN «продвинуть» маршрут для этой конкретной подсети клиенту client1
. Таким образом, сервер OpenVPN может прозрачно передавать разные маршруты разным клиентам.
Заметка
Выборочное продвижение маршрута к конкретному клиенту может быть удобным, но оно не защищено от несанкционированного доступа. Мошеннический VPN-клиент, который сам добавит маршрут к этой подсети, также будет иметь к ней доступ. Если вам нужно контролировать доступ к определенной подсети — используйте решение в виде межсетевого экрана, такое как iptables
или ipfw
.
В этом примере показана гибкость параметров конфигурации OpenVPN. Без необходимости изменять одну строку в файле конфигурации клиента можно назначить другой IP-адрес, направить конкретную подсеть клиенту или маршрутизировать конкретную подсеть из сети клиента в локальную сеть на стороне сервера.
Трафик клиент-клиент
OpenVPN также позволяет вам настраивать трафик клиент-клиент. По умолчанию VPN-клиенты не могут напрямую общаться друг с другом. Это хорошая мера безопасности, но иногда необходимо разрешить межклиентский трафик. Помните, что весь VPN-трафик клиент-клиент будет проходить через сервер OpenVPN: от client1
к VPN-серверу, а затем от VPN-сервера к client2
и наоборот. Это может легко привести к проблемам с производительностью.
В режиме tun соединение клиент-клиент может быть достигнуто либо с помощью iptables
, либо с помощью параметра OpenVPN client-to-client
. Параметр client-to-client
имеет преимущество в том, что он быстрее: трафик от одного клиента, поступающий на сервер, автоматически перенаправляется второму клиенту, не проходя через таблицы системной маршрутизации или правила брандмауэра. Недостатком является сложность контроля трафика и невозможность применения контроля доступа.
Без параметра client-to-client
трафик от одного клиента принимается сервером OpenVPN, перенаправляется в таблицы системной маршрутизации и межсетевого экрана и (при правильной настройке) снова возвращается на сервер OpenVPN. Затем сервер пересылает его второму клиенту.
Если другим VPN-клиентам необходим доступ к подсети 192.168.4.0/24, как указано в предыдущем примере, то конфигурацию сервера необходимо расширить строкой:
push “192.168.4.0 255.255.255.0”
Это дает команду серверу OpenVPN продвинуть маршрут всем клиентам, которые находятся в подсети 192.168.4.0/24, доступной через VPN-туннель, за исключением клиента client1
. Сам клиент client1
исключен из-за соответствующей записи iroute
.
Файл состояния OpenVPN
OpenVPN предлагает несколько вариантов для мониторинга клиентов, подключенных к серверу. Наиболее часто используемый метод — использование файла состояния. Файл состояния OpenVPN постоянно обновляется процессом OpenVPN и содержит следующую информацию:
- Какие клиенты подключены
- С какого IP-адреса подключаются клиенты
- Количество байт, которые каждый клиент получил и передал
- Время подключения клиента
- Кроме того, таблица маршрутизации также показывает, какие сети маршрутизируются каждому клиенту.
Мы поправим конфиг сервера из Клиентской маршрутизации movpn-04-05-server.conf
, добавив строку:
proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
topology subnet
persist-key
persist-tun
keepalive 10 60
remote-cert-tls client
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
user nobody
group nobody
verb 3
daemon
log-append /var/log/openvpn.log
client-config-dir /etc/openvpn/movpn/clients
route 192.168.4.0 255.255.255.0 10.200.0.1
status /var/run/openvpn.status 3
Сохраните его как movpn-04-07-server.conf
. После установления VPN-соединения мы видим следующее содержимое в файле состояния после того, как VPN-клиент client1
подключился и передал некоторые данные:
OpenVPN CLIENT LIST
Updated,Tue Oct 21 15:45:27 2014
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,<client-IP>:35519,7730,9342,Tue Oct 21 15:44:35 2014
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
192.168.4.0/24,client1,145.102.134.201:35519,Tue Oct 21 15:44:35
2014
10.200.0.99,client1,145.102.134.201:35519,Tue Oct 21 15:44:35 2014
GLOBAL STATS
Max bcast/mcast queue length,0
END
CLIENT LIST
показывает список подключенных клиентов, включая информацию о количестве полученных и отправленных байт.
ROUTING TABLE
показывает список внутренних маршрутов OpenVPN:
- Подсеть 192.168.4.0/24 маршрутизируется на
client1
из-за оператораiroute
в конфигурации сервера - IP-адрес 10.200.0.99 — это адрес
client1
, который мы явно установили в файле CCD с именемclient1
При отключении клиента файл состояния обновляется через 3 секунды и подключенный клиент больше не отображается в списке.
Заметка
Когда клиент отключается, вся информация удаляется из файла состояния и вся статистика сбрасывается. Если клиент снова подключается позже, количество принятых и отправленных байт начинается с нуля. Скрипт отключения клиента получает всю информацию о состоянии, когда клиент был отключен.
Вторым параметром опции status
является интервал обновления (перезаписи) файла состояния. Значение по умолчанию составляет 60 секунд.
Надежное отслеживание соединения в режиме UDP
Сервер OpenVPN при использовании протокола UDP не может сразу обнаружить что клиент отключен либо преднамеренно, либо из-за плохого интернет-соединения. Это позволяет клиенту, в случае плохого соединения, переподключиться к серверу VPN без потери всех туннельных соединений. Недостатком является то, что серверу OpenVPN требуется некоторое время для понимания что клиент отключился.
Клиент OpenVPN может явно уведомить сервер о своем отключении, используя опцию explicit-exit-notify
. Эта опция принимает один параметр, который указывает количество явных сообщений, которые клиент пытается отправить на сервер. Значение по умолчанию равно 1
, что не работает если само основное сетевое соединение нестабильно. В этом случае рекомендуется увеличить данное значение до 3
.
При использовании explicit-exit-notify
сервер OpenVPN сразу же получает сообщение об удаленном выходе при отключении клиента, что можно увидеть в файле журнала сервера:
SIGTERM[soft,remote-exit] received, client-instance exiting
Обратите внимание — эта проблема не возникает при использовании proto tcp
поскольку сервер немедленно замечает разрыв TCP-соединения.
Интерфейс управления OpenVPN
Одним из наиболее мощных, но менее известных вариантов OpenVPN является интерфейс управления. Интерфейс управления доступен как на стороне сервера, так и на стороне клиента. На стороне сервера его можно использовать для сбора статистики, мониторинга и контроля подключенных клиентов, а также для выполнения других задач, связанных с управлением. На стороне клиента его можно использовать для запроса паролей, ввода информации прокси-сервера для установления соединения с сервером VPN, взаимодействия с устройством PKCS#11 и сбора статистики на стороне клиента.
Плагин OpenVPN для Linux NetworkManager широко использует интерфейс управления для управления запуском и отключением VPN-подключения.
Чтобы использовать интерфейс управления — добавьте строку management 127.0.0.1 23000 stdin
в файл конфигурации клиента или сервера. Эта опция указывает OpenVPN настроить интерфейс управления на IP-адресе 127.0.0.1, порту 23000 и использовать stdin
для указания пароля управления.
Если мы добавим это в файл конфигурации basic-udp-server.conf
и запустим сервер OpenVPN, то OpenVPN сначала запросит у нас пароль для управления:
Затем мы можем использовать telnet для входа в интерфейс управления (ввод пользователя выделен жирным шрифтом):
[root#server]# telnet 127.0.01 23000
Trying 127.0.0.1...
Connected to 127.0.0.1
Escape character is ‘^]’.
ENTER PASSWORD:[password]
SUCCESS: password is correct
>INFO:OpenVPN Management Interface Version 1 -- type ‘help’ for more info
help
Management Interface for OpenVPN 2.3.2 x86_64-redhat-linux-gnu [SSL (OpenSSL)]
[LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Sep 12 2013
Commands:
auth-retry t : Auth failure retry mode
(none,interact,nointeract).
bytecount n : Show bytes in/out, update every n secs
(0=off).
echo [on|off] [N|all] : Like log, but only show messages in echo
buffer.
exit|quit : Close management session.
forget-passwords : Forget passwords entered so far.
help : Print this message.
[...]
END
Этот необработанный интерфейс telnet можно использовать для просмотра состояния сервера, он предоставляет тот же вывод, что и опция status
из предыдущего примера. Его также можно использовать для немедленного завершения клиентского соединения с помощью следующей команды:
Это приведет к отключению клиента client1
. Обратите внимание, что в большинстве случаев клиент автоматически пытается восстановить соединение. Теперь введите exit
, чтобы завершить сеанс telnet.
Интерфейс управления может использоваться для управления OpenVPN различными способами (адаптировано со страницы руководства OpenVPN https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage):
management IP port [pw-file]:
включить TCP-сервер на IP:порт для обработки функций управления демоном.pw-file
, если он указан, является файлом паролей (пароль на первой строке) илиstdin
для стандартного ввода. Предоставленный пароль будет устанавливать пароль, который клиенты TCP должны будут указать для доступа к функциям управления.
Интерфейс управления также может прослушивать сокет домена Unix, если он поддерживается. Для использования доменного сокета укажите путь к сокету Unix вместо IP и установите для порта значение unix
.
Интерфейс управления обеспечивает специальный режим, в котором канал управления TCP может работать через сам туннель. Чтобы включить этот режим — установите IP = “tunnel”
. Туннельный режим заставит интерфейс управления прослушивать TCP-соединение по локальному VPN-адресу интерфейса TUN/TAP.
management-client
: интерфейс управления будет подключаться как клиент домена TCP/Unix к IP:порт, заданный параметром--management
, а не прослушивать как сервер TCP или в сокете домена Unix. Если клиентскому соединению не удается подключиться или он отключен — будет сгенерирован сигнал SIGTERM, что приведет к выходу OpenVPN.management-query-passwords
: канал управления запросами для пароля с приватным ключом и--auth-user-pass
имя_пользователя/пароль.management-hold
: Запуск OpenVPN в режиме гибернации, пока клиент интерфейса управления не запустит его явно командой освобождения удержания.management-signal
: отправляет сигнал SIGUSR1 в OpenVPN если сеанс управления отключен. Это полезно, когда вы хотите отключать сеанс OpenVPN при выходе пользователя из системы.management-client-auth
: дает клиенту интерфейса управления ответственность за проверку подлинности клиентов после проверки их клиентского сертификата.
Пересмотр ключа сеанса
Чтобы обеспечить безопасность каждого соединения OpenVPN, сервер периодически пересматривает секретный ключ для канала данных с каждым клиентом. Это контролируется с помощью трех опций:
reneg-sec N
: повторно согласовать ключ канала данных через N секунд (по умолчанию 3600)reneg-bytes N
: пересмотреть ключ канала данных после N байт (по умолчанию = 0 = выкл.)reneg-pkts N
: пересмотреть ключ канала данных после N пакетов (по умолчанию = 0 = выкл.)
Если VPN-клиент испытывает периодические таймауты при подключении к серверу — часто бывает полезно изменить эти параметры. Однако если вы установите параметр reneg-sec
на очень короткий интервал — производительность VPN будет сильно ухудшена.
Параметры reneg
могут быть указаны либо на стороне клиента, либо на стороне сервера, либо на обоих. Опция reneg
, запускаемая наиболее часто с обеих сторон — сбрасывает счетчики на обоих концах. Если сервер указывает значение reneg-sec 500
, а клиент — reneg-sec 60
, то повторное согласование канала данных будет происходить примерно каждые 60 секунд.
Мы создадим пример, добавив три строки в файл конфигурации basic-udp-server.conf
:
reneg-sec 10
reneg-pkts 1000
reneg-bytes 1000000
Сохраним конфигурацию как movpn-04-09-server.conf
и восстановим VPN-соединение. Журнал сервера теперь будет содержать много строк с указанием TLS: soft reset
:
Tue Oct 21 16:53:29 2014 <IP>:41679 [client1] Peer Connection
Initiated with [AF_INET]<IP>:41679
[...]
Tue Oct 21 16:53:39 2014 client1/<IP>:41679 TLS: soft reset sec=0
bytes=0/100000 pkts=0/100
[...]
Tue Oct 21 16:53:49 2014 client1/<IP>:41679 TLS: soft reset sec=0bytes=53/100000 pkts=1/100
[...]
Tue Oct 21 16:53:59 2014 client1/<IP>:41679 TLS: soft reset sec=0
bytes=105/100000 pkts=2/100
При установленном параметре reneg-sec 10
из временных меток журнала сервера видно, что ключ канала данных пересматривается каждые 10 секунд.
На стороне клиента мы также можем увидеть влияние, которое это пересогласование ключей оказывает на производительность VPN-соединения. Запустив простую команду ping
после установления соединения — мы можем увидеть когда происходит повторное согласование ключа, основываясь на пиках времени отклика ping
:
[client]$ ping 10.200.0.1
PING 10.200.0.1 (10.200.0.1) 56(84) bytes of data.
64 bytes from 10.200.0.1: icmp_seq=1 ttl=64 time=3.29 ms
64 bytes from 10.200.0.1: icmp_seq=2 ttl=64 time=3.55 ms
64 bytes from 10.200.0.1: icmp_seq=3 ttl=64 time=61.6 ms
64 bytes from 10.200.0.1: icmp_seq=4 ttl=64 time=16.6 ms
64 bytes from 10.200.0.1: icmp_seq=5 ttl=64 time=3.23 ms
64 bytes from 10.200.0.1: icmp_seq=6 ttl=64 time=3.22 ms
64 bytes from 10.200.0.1: icmp_seq=7 ttl=64 time=3.74 ms
64 bytes from 10.200.0.1: icmp_seq=8 ttl=64 time=3.25 ms
64 bytes from 10.200.0.1: icmp_seq=9 ttl=64 time=3.21 ms
64 bytes from 10.200.0.1: icmp_seq=10 ttl=64 time=3.26 ms
64 bytes from 10.200.0.1: icmp_seq=11 ttl=64 time=3.26 ms
64 bytes from 10.200.0.1: icmp_seq=12 ttl=64 time=3.55 ms
64 bytes from 10.200.0.1: icmp_seq=13 ttl=64 time=3.27 ms
64 bytes from 10.200.0.1: icmp_seq=14 ttl=64 time=3.26 ms
64 bytes from 10.200.0.1: icmp_seq=15 ttl=64 time=3.31 ms
64 bytes from 10.200.0.1: icmp_seq=16 ttl=64 time=3.28 ms
64 bytes from 10.200.0.1: icmp_seq=17 ttl=64 time=77.1 ms
...
То же самое произойдет, когда граница пакета или байта будет пересечена, и в этот момент ключи канала данных также будут пересмотрены.
Замечание об устройствах PKCS#11
Повторное согласование ключей может быть особенно громоздким при использовании устройств PKCS#11. Некоторые устройства PKCS#11 накладывают большие расходы на повторное согласование ключа, в результате чего процесс пересогласования занимает несколько секунд. В течение этого времени VPN не отвечает.
Установка значения reneg-sec
равным 0
эффективно отключит пересогласование ключа, но это делает саму VPN восприимчивой к атакам типа атаки посредника и атаки по времени, что делает дополнительную безопасность использования аппаратного защитного устройства бесполезной.
Использование IPv6
В OpenVPN 2.3 появилась надежная поддержка IPv6 как внутри туннеля OpenVPN, так и для транзита самого туннеля. OpenVPN вплоть до 1.x имел элементарную поддержку IPv6, которая была в значительной степени переписана. В целом, внутри туннеля OpenVPN администратор может выбрать поддержку Ethernet (уровень 2), IPv4 (уровень 3) и IPv6 (уровень 3).
Диаграмма иллюстрирует логическую взаимосвязь пути транзитной сети и пути защищенной сети. Необходимо использовать только один метод транзита, а одна конфигурация OpenVPN может содержать записи --remote
как для IPv4, так и IPv6. Весь трафик, независимо от типа, будет защищен в туннеле. Вполне приемлемо иметь туннель полностью IPv6, использующий IPv6 как для транзитного, так и для защищенного трафика. Благодаря дополнительной маршрутизации и проксированию даже возможно использовать OpenVPN для помощи в преобразовании IPv6 в IPv4.
Защищенный трафик IPv6
Основываясь на примерах из предыдущего раздела, мы можем предоставлять клиентам адреса IPv6 и защищать этот трафик в туннеле. Для этого мы добавляем параметр --server-ipv6
в конфигурацию нашего сервера. Это работает аналогично директиве --server
, только для IPv6 вместо IPv4 и принимает в качестве аргументов сетевой адрес IPv6 и маску сети. Как и --server
, --server-ipv6
— это макрос для других параметров, которые могут передаваться индивидуально: --ifconfig-ipv6
, --ifconfig-ipv6-pool
, --tun-ipv6
и –push tun-ipv6
.
Как и в случае IPv4, маршруты IPv6 могут передаваться из конфигурации основного сервера или из файлов конфигурации для каждого клиента в каталоге client-config
. В нашем примере мы просто отправим маршрут по умолчанию для всего трафика IPv6.
В настоящее время в OpenVPN для IPv6 нет опции перенаправления шлюза. Маршруты добавляются аналогично IPv6, с ключевым словом route-ipv6
вместо route
.
Теперь измените файл movpn-04-01-server.conf
и добавьте инструкцию --server-ipv6
:
proto udp
port 1194
dev tun
server 10.200.0.0 255.255.255.0
server-ipv6 2001:DB8:100::/64
push “route-ipv6 ::/0”
topology subnet
persist-key
persist-tun
keepalive 10 60
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
user nobody
group nobody
verb 3
daemon
log-append /var/log/openvpn.log
После сохранения файла требуется перезапуск процесса сервера OpenVPN. Если процесс начался правильно с новой опцией — вы должны увидеть что-то вроде этого в вашем файле журнала:
IFCONFIG POOL IPv6: (IPv4) size=252, size_ipv6=65536, netbits=64, base_ipv6=2001:db8:100::1000
На этом этапе клиенты могут передавать трафик, используя IPv6 внутри туннеля, и сервер передает маршрут по умолчанию клиентам для IPv6. Добавление параметров конфигурации сервера не требует дополнительных соответствующих параметров в конфигурациях клиента.
Подключенный клиент будет отображать адреса IPv4 и IPv6 на интерфейсе tunX.
Вот пример FreeBSD:
utun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1331
inet 10.200.0.2 --> 10.200.0.2 netmask 0xffffff00
inet6 fe80::5ab0:35ff:fef5:811f%utun1 prefixlen 64 scopeid 0x9
inet6 2001:db8:100::1001 prefixlen 64
nd6 options=1<PERFORMNUD>
Вот пример для Windows 7:
Обратите внимание, что всплывающее окно от наведения на значок на панели задач не отображает IPv6-адрес, но команда ipconfig
в терминале показывает оба адреса.
Использование IPv6 в качестве транзита
OpenVPN в настоящее время не имеет возможности прослушивать адреса IPv4 и IPv6 одновременно, но большинство современных ядер могут справиться с этим с помощью сопоставленных IPv6-адресов. Как это делается: берется IP-адрес версии 4, такой как 192.168.200.4 и отображается как IPv6-адрес ::ffff:192:168.:200:.:4. Кроме того, вместо proto udp
будет proto udp6
как на клиенте так и на сервере.
После изменения оператора proto
из нашего примера конфигурации инициализируется client2
и мы видим что адрес назначен. Оба адреса сервера OpenVPN v4 и v6 могут быть проверены, и мы можем подтвердить с помощью tcpdump
что транзит через туннель осуществляется через IPv6.
Вот клиентский интерфейс tun:
ecrist@phillip:~-> ifconfig tun4
tun4: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu
1500
options=80000<LINKSTATE>
inet6 fe80::216:3eff:fe09:5d4e%tun4 prefixlen 64 scopeid 0x9
inet 10.200.0.2 --> 10.200.0.2 netmask 0xffffff00
inet6 2001:db8:100::1000 prefixlen 64
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Opened by PID 45391
Вот IPv4 внутри туннельного пинга:
ecrist@phillip:~-> ping -c 1 10.200.0.1
PING 10.200.0.1 (10.200.0.1): 56 data bytes
64 bytes from 10.200.0.1: icmp_seq=0 ttl=64 time=0.490 ms
--- 10.200.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.490/0.490/0.490/0.000 ms
Вот IPv6 внутри туннельного пинга:
ecrist@phillip:~-> ping6 -c 1 2001:db8:100::1
PING6(56=40+8+8 bytes) 2001:db8:100::1000 --> 2001:db8:100::1
16 bytes from 2001:db8:100::1, icmp_seq=0 hlim=64 time=0.591 ms
--- 2001:db8:100::1 ping6 statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.591/0.591/0.591/0.000 ms
Вот вывод tcpdump
(обратите внимание на ключевое слово IPv6 в выводе):
root@terrance:/usr/local/etc/openvpn-> tcpdump -i xn0 host 2001:db8:5555:5555::1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xn0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:14:05.449553 IP6 phillip.1194 > terrance.1194: UDP, length 53
19:14:05.449692 IP6 terrance.1194 > phillip.1194: UDP, length 53
19:14:08.389222 IP6 phillip.1194 > terrance.1194: UDP, length 93
19:14:08.389394 IP6 terrance.1194 > phillip.1194: UDP, length 93
19:14:09.389858 IP6 phillip.1194 > terrance.1194: UDP, length 93
Расширенные параметры конфигурации
Следующие несколько разделов иллюстрируют некоторые дополнительные параметры конфигурации. Предполагается, что вы полностью понимаете их влияние на сеть, прежде чем применять их в производственной среде. Эти варианты редко используются, но могут быть чрезвычайно полезны в нужных обстоятельствах.
ARP-прокси
Часто желательно чтобы VPN-клиенты выглядели так, как будто они являются частью серверной сети. Это облегчает просмотр папок и обмен файлами и принтерами. Для достижения этой цели, в некоторых установках прибегают к Ethernet-бриджеванию (см Главу 6, Режим клиент/сервер с tap-устройствами), который имеет свои недостатки. Производительность в мостовой конфигурации может быть значительно ниже по сравнению с немостовой установкой.
Когда сервер OpenVPN работает в Linux или Unix — существует альтернативное решение: большинство ядер Unix имеют возможности Proxy ARP, которую можно использовать для назначения клиента OpenVPN с IP-адресом в локальной сети на стороне сервера и отображения его так, как если бы он был частью этой локальной сети. Обратите внимание — это работает только для сетей IPv4, так как сети IPv6 не используют ARP.
Рассмотрим следующую схему сети:
В этом макете стандартная подсеть VPN 10.200.0.0/24 не может быть использована, так как мы должны интегрировать VPN-клиентов в существующую подсеть, для данного примера — это 192.168.3.0/24. Текущие машины в этой подсети находятся в диапазоне 192.168.3.10 — 192.168.3.24, таким образом, мы разместим VPN-адреса немного за пределами этого диапазона. Убедитесь, что адреса VPN не должны устанавливаться сервером DHCP в локальной сети на стороне сервера, поскольку мы хотим, чтобы OpenVPN назначал адреса для клиентов VPN.
В этом примере мы будем использовать возможность OpenVPN для запуска скриптов при подключении клиента или отключении. Скриптовые способности OpenVPN объясняются более подробно в Главе 7, Скрипты и плагины.
- Начнем со следующего файла конфигурации сервера:
proto udp
port 1194
dev tun
server 192.168.3.32 255.255.255.224
push “route 192.168.3.0 255.255.255.0”
topology subnet
persist-key
persist-tun
keepalive 10 60
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
verb 3
daemon
log-append /var/log/openvpn.log
script-security 2
client-connect /etc/openvpn/movpn/proxyarp-connect.sh
client-disconnect /etc/openvpn/movpn/proxyarp-disconnect.sh
Обратите внимание — мы добавили три оператора для установки уровня безопасности для скриптов и запуска собственного скрипта всякий раз, когда клиент подключается или отключается.
- Сохраните этот файл конфигурации как
movpn-04-10-server.conf
. - Затем создайте скрипт
proxyarp-connect.sh
, который выполняется при каждом подключении VPN-клиента:
#!/bin/bash
/sbin/arp -i eth0 -Ds ${ifconfig_pool_remote_ip} eth0 pub
/sbin/ip route add ${ifconfig_pool_remote_ip}/32 dev tun0
-
Сохраните скрипт как
/etc/openvpn/movpn/proxyarp-connect.sh
. Расположение скрипта должно соответствовать абсолютному пути, указанному в файлеmovpn-04-10-server.conf
. -
Затем создайте скрипт
proxyarp-disconnect.sh
, который выполняется при отключении клиента:
#!/bin/bash
/sbin/arp -i eth0 -d ${ifconfig_pool_remote_ip}
/sbin/ip route del ${ifconfig_pool_remote_ip}/32 dev tun0
- Сохраните скрипт как
/etc/openvpn/movpn/proxyarp-disconnect.sh
.
Заметка
Имена устройств eth0
и tun0
жестко заданы в скрипте. Это необходимо, поскольку устройство, на котором должен быть задан дополнительный ARP-адрес, неизвестно OpenVPN. Также возможно опубликовать дополнительный ARP-адрес на нескольких интерфейсах (eth0
, eth1
, wlan0
и т.д.), дублируя строку /sbin/arp
в обоих скриптах.
Сделайте оба скрипта исполняемыми и запустите сервер OpenVPN, используя следующие команды:
[root@server]# chmod a+x /etc/openvpn/movpn/proxyarp-connect.sh
[root@server]# openvpn --config movpn-04-10-server.conf
- Как всегда, используйте файл конфигурации
basic-udp-client.conf
(илиbasic-udp-client.ovpn
) для подключения к серверу. После успешного подключения VPN-клиента мы проверяем, что клиент виден другими устройствами в локальной сети. Для этого мы использовали смартфон Android с установленным приложением Fing:
Заметка
На устройстве Android не было добавлено никаких дополнительных сетевых маршрутов. Клиент VPN действительно интегрирован в существующую подсеть.
- Мы также можем проверить, что компьютер сервера OpenVPN теперь публикует дополнительный IP-адрес в своих таблицах ARP:
[server]$ /sbin/arp -an | grep PERM
? (192.168.3.34) at * PERM PUP on eth0
Как работает Proxy ARP?
Proxy ARP — это функция, поддерживаемая большинством ядер Unix и Linux. Чаще всего она используется для подключения клиентов удаленного доступа к локальной сети, а в настоящее время также ADSL и провайдерами кабельного Интернета.
Сервер OpenVPN заимствует IP-адрес из диапазона локальной сети при подключении клиента. Этот IP-адрес затем назначается клиенту OpenVPN. Сервер также создает специальную запись в ARP-таблицах системы, чтобы сообщить остальным локальным сетям филиала B, что сервер OpenVPN действует как прокси для IP 192.168.3.34. Это означает, что когда другая машина в локальной сети на стороне сервера хочет знать, где найти хост с IP 192.168.3.34 — сервер OpenVPN ответит своим собственным MAC-адресом интерфейса, на котором был присвоен адрес Proxy ARP.
Файл конфигурации сервера содержит несколько операторов, которые требуют пояснения:
server 192.168.3.32 255.255.255.224
push “route 192.168.3.0 255.255.255.0”
Предыдущие строки заставляют сервер OpenVPN назначить адрес 192.168.3.33 VPN серверу, с маской сети 255.255.255.224 (или 27). Первому VPN-клиенту назначается адрес 192.168.3.34/27. Однако это означает, что сам VPN-клиент не может получить никаких IP-адресов за пределами этого диапазона. Оператор push route
необходим чтобы сообщить клиенту OpenVPN, что вся подсеть 192.168.3.0/24 доступна через VPN.
Пока что файл конфигурации сервера содержит следующие строки:
В этом файле конфигурации они отсутствуют, так как скрипты client-connect
и client-disconnect
должны запускаться от пользователя root
. Альтернативный подход состоит в том, чтобы настроить права sudo
для выполнения пользователем user nobody
команды /sbin/arp
с привилегиями root
.
Наконец, строки:
script-security 2
client-connect /etc/openvpn/movpn/proxyarp-connect.sh
client-disconnect /etc/openvpn/movpn/proxyarp-disconnect.sh
Настроим функции скриптов OpenVPN. Первая строка устанавливает уровень безопасности скриптов равным 2
: это означает что определенные переменные среды доступны для скрипта.
В строках client-connect
и client-disconnect
указан абсолютный путь к выполняемым скриптам.
Назначение публичных IP-адресов клиентам
В качестве продолжения примера Proxy ARP теперь рассмотрим как возможно раздавать публичные адреса IPv4 клиентам OpenVPN. Давайте предположим, что нам доступен следующий набор (только для примера) публичных IPv4-адресов:
Наша общедоступная сеть IPv4 — 192.0.2.160/28, что дает нам 16 адресов. Эти адреса используются следующим образом:
IP-адрес | Использование |
---|---|
192.0.2.160 | Сетевой адрес подсети. |
192.0.2.161 | Используется для IP-адреса VPN сервера |
192.0.2.162 | Недоступен |
192.0.2.163 | Недоступен |
192.0.2.164-192.0.2.170 | Доступны для клиентов VPN |
192.0.2.171 | Это адрес локальной сети самого сервера OpenVPN |
192.0.2.172 | Недоступен |
192.0.2.173 | Недоступен |
192.0.2.174 | Маршрутизатор для удаленной локальной сети |
192.0.2.175 | Сетевой широковещательный адрес |
Теперь мы должны настроить сервер OpenVPN, который может раздавать адреса со 192.0.2.164 по 192.0.2.170, а сам сервер OpenVPN по адресу 192.0.2.161:
- Сначала мы создаем файл конфигурации сервера:
proto udp
port 1194
dev tun
mode server
tls-server
ifconfig 192.0.2.161 255.255.255.240
ifconfig-pool 192.0.2.164 192.0.2.170
push “route 192.0.2.171 255.255.255.255 net_gateway”
push “route-gateway 192.0.2.174”
push “redirect-gateway def1”
push “topology subnet”
topology subnet
persist-key
persist-tun
keepalive 10 60
tls-auth /etc/openvpn/movpn/ta.key 0
dh /etc/openvpn/movpn/dh2048.pem
ca /etc/openvpn/movpn/movpn-ca.crt
cert /etc/openvpn/movpn/server.crt
key /etc/openvpn/movpn/server.key
verb 3
daemon
log-append /var/log/openvpn.log
script-security 2
client-connect /etc/openvpn/movpn/proxyarp-connect.sh
client-disconnect /etc/openvpn/movpn/proxyarp-disconnect.sh
- Сохраните этот файл как
movpn-04-11-server.conf
. Мы будем повторно использовать сценарииproxyarp-connect.sh
иproxyarp-disconnect.sh
из предыдущего примера. Создайтеproxyarp-connect.sh
, который выполняется при каждом подключении VPN-клиента:
#!/bin/bash
/sbin/arp -i eth0 -Ds ${ifconfig_pool_remote_ip} eth0 pub
/sbin/ip route add ${ifconfig_pool_remote_ip}/32 dev tun0
- Сохраните его как
/etc/openvpn/movpn/proxyarp-connect.sh
. - Затем создайте скрипт
proxyarp-disconnect.sh
, выполняемый при отключении клиента:
#!/bin/bash
/sbin/arp -i eth0 -d ${ifconfig_pool_remote_ip}
/sbin/ip route del ${ifconfig_pool_remote_ip}/32 dev tun0
- Сохраните его как
/etc/openvpn/movpn/proxyarp-disconnect.sh
. Сделайте оба скрипта исполняемыми файлами и запустите сервер OpenVPN:
[root@server]# chmod a+x /etc/openvpn/movpn/proxyarp-connect.sh[
[root@server]# openvpn --config movpn-04-11-server.conf
- Используйте файл базовой конфигурации для подключения клиента OpenVPN к серверу. Первому клиенту будет присвоен адрес 192.0.2.164.
Проверьте IP-адрес первого клиента, перейдя по адресу https://www.whatismyip.com.
Файл конфигурации сервера аналогичен файлу movpn-04-10-server.conf
за исключением этого блока:
mode server
tls-server
ifconfig 192.0.2.161 255.255.255.240
ifconfig-pool 192.0.2.164 192.0.2.170
push “route 192.0.2.171 255.255.255.255 net_gateway”
push “route-gateway 192.0.2.174”
push “redirect-gateway def1”
push “topology subnet”
Ранее в этой главе объяснялось, что макрос server 10.200.0.0 255.255.255.0
расширяется следующим образом:
mode server
tls-server
push “topology subnet”
ifconfig 10.200.0.1 255.255.255.0
ifconfig-pool 10.200.0.2 10.200.0.254 255.255.255.0
push “route-gateway 10.200.0.1”
Раздавая публичные IP-адреса, мы не можем позволить себе роскошь тратить IPv4-адреса. Опция topology subnet
, представленная в OpenVPN 2.1, окажется здесь весьма полезной.
Изучив наше общедоступное пространство IPv4, мы оставляем оператор server
и включаем нашу собственную версию параметров ifconfig
и ifconfig-pool
:
ifconfig 192.0.2.161 255.255.255.240
: указывает IP-адрес VPN-сервера — 192.0.2.161/28.ifconfig-pool 192.0.2.164 192.0.2.170
: указывает, что пул доступных IP-адресов для VPN-клиентов: от 192.0.2.164 до 192.0.2.170, всего семь адресов. Обратите внимание, что диапазонifconfig-pool
должен быть непрерывным.
Заметка
Если есть «дыры» в диапазоне, то часто бывает проще назначать IP-адреса с помощью скрипта, как мы узнаем в Главе 7, Скрипты и плагины.
push "route 192.0.2.171 255.255.255.255 net_gateway"
: маршрут к адресу локальной сети VPN-сервера, который необходимо явно передать клиентам. Обычно этот маршрут автоматически добавляется клиентом OpenVPN для гарантии, что трафик, предназначенный для самого сервера OpenVPN, не будет снова введен в туннель, что вызовет цикл обработки пакетов. С нашей специальной настройкойifconfig
иifconfig-pool
желательно добавить явный маршрут к адресу локальной сети сервера OpenVPN.push "route-gateway 192.0.2.174"
:route-gateway
указывает адрес шлюза, используемый для направления всего туннельного трафика. Обычноroute-gateway
соответствует IP-адресу VPN-сервера. В таком случае это вызовет только скачок маршрута, поскольку VPN-сервер немедленно перенаправит его на реальный шлюз 192.0.2.174, который находится в той же подсети. Следовательно, мы указываем IP-адрес шлюза LAN.push "redirect-gateway def1"
: чтобы клиент OpenVPN использовал публичный адрес для всего своего трафика — он должен направить весь трафик через VPN-туннель.push "topology subnet"
: как правило, макрос сервера позаботится об этомpush
за нас, но так как мы здесь не используем макрос сервера, то должны явно передать эту опцию. Если этот параметр опущен, то сервер будет назначать адреса линейно (поскольку в его конфигурации есть строкаtopology subnet
), однако клиенты VPN будут предполагать, что им назначены адреса топологииnet30
, что является текущим значением по умолчанию. Явныйpush
обходит эту потенциально-неверную конфигурацию.
Резюме
В этой главе были рассмотрены различные функции и опции режима клиент-сервер с устройствами tun. Мы установили базовый набор файлов конфигурации как для сервера OpenVPN, так и для клиента, как для протокола UDP, так и TCP в качестве транспорта, так и для клиентов Windows и Linux/Unix. Этот набор основных файлов конфигурации будет использоваться на протяжении всей книги.
Мы обсудили, как настроить сервер OpenVPN, обслуживающий как адреса IPv4, так и адреса IPv6. Мы рассмотрели маршрутизацию на стороне сервера и на стороне клиента, включая перенаправление всего трафика через VPN-туннель. Также мы увидели как раздавать публичные IPv4-адреса с помощью OpenVPN.
В следующей главе мы рассмотрим расширенные функции, предлагаемые OpenVPN. Кроме того, в Главе 6, Режим клиент/сервер с tap-устройствами будут объяснены несколько вариантов и примеры, что полезно также для режима tun.
I am running an OpenVPN server on Ubuntu on AWS with the following server.conf:
local x.x.x.x
port 1194
proto tcp
dev tap
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.0.0
push "redirect-gateway def1 bypass-dhcp"
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 10.43.1.12"
push "dhcp-option DNS 10.43.1.44"
client-config-dir /etc/openvpn/ccd
client-to-client
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
I have OpenVPN clients installed on several AWS instances, some of which are Ubuntu and some of which are Windows. They all use the following client configuration:
client
dev tap
proto tcp
remote y.y.y.y 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
ignore-unknown-option block-outside-dns
block-outside-dns
verb 3
I have noticed that when I remove the push "redirect-gateway def1 bypass-dhcp"
line from the server.conf file, the Windows clients are no longer able to access the internet (they cannot ping any external sites and the browser is stuck on «Resolving host»). But I can SSH to the Ubuntu clients’ private IP addresses (10.109.x.x) fine and they can still access the internet.
But when I add the push "redirect-gateway def1 bypass-dhcp"
line back to the server.conf file, the Windows clients are able to access the internet, but I can no longer SSH to the Ubuntu clients’ private IP addresses (10.109.x.x) from my PC. Oddly enough, I can still SSH to the Ubuntu clients’ private IP addresses from the Windows clients.
How can I change the server configuration to allow the Windows clients to access the internet AND the Ubuntu clients to accept SSH connections?
Зачем нужен VPN-туннель? Ясное дело — связать две приватные подсети друг с другом через интернет. А если подсетей, допустим не две, а пять? Что делать в этом случае? Как можно, как лучше? Мои размышления на эту тему с конкретным примером реализации. Пример основан на программных средствах, с минимумом вложений.
Важное про OpenVPN
Что касается выбора в пользу OpenVPN, то это не самый оптимальный вариант. Так как здесь довольно-таки унылые показатели в сравнении с другими подходами к передаче шифрованного трафика. Плюс довольно высокая утилизация CPU устройства, задействующего OpenVPN канал.
Зато просто, бесплатно, хорошо документировано на 2016 год. В моём случае это было всего лишь три-четыре туннеля на центральном VPN сервере, полтора десятка пользователей, значит полоса пропускания туннелей небольшая, трафика для шифрования немного и ресурсов сервера VPN хватало с запасом.
Но нужно быть в курсе про недостатки OpenVPN перед внедрением. Если бы что-то подобное сотворялось сегодня, а не в 2016 году, пробовал бы WireGuard.
Предисловие
Никах средств и никакого оборудования мне никто выделять не собирался. Да и никто не воспринял мою затею всерьёз. Всех устраивало как удалённое приложение работает через проброс портов на маршрутизаторе главного офиса. Естественно без всякого шифрования и аутентификации при входе в сеть.
Всё что мне было позволено — создать несколько виртуальных машин на имеющихся серверах, да ещё в моём распоряжении был неиспользуемый мини-десктоп HP. Но я попробовал, результат получился на удивление изящный и дешёвый:
- Абонентка 500 рублей в месяц за VPS-сервер;
- Потом уже, когда система заработала и была обкатана, купили 2 Raspberry Pi 3;
- Стабильная работа и Keepalive.
Чуть теории
На данный момент соединение сетей с помощью VPN туннелей является самым популярным способом в первую очередь потому, что требует минимум начальных вложений в создание инфраструктуры. Не нужно никаких ежемесячных платежей (500 рублей в месяц для организации в данном, конкретном примере это просто ничто) за аренду выделенных линий, за трафик или ещё что-то — носителем выступает среда интернета.
Интернет потребуется предприятию в любом случае, а значит уже оплачен. Какой трафик мы на него навесим, что придумаем, всё это без дополнительной оплаты.
Минусы в этом же: среда передачи — общественная сеть. Низкую задержку никто не гарантирует. И нужно шифровать трафик, среда передачи небезопасна.
Также могут возникнуть проблемы «на ровном месте»:
- Может быть большая задержка между шлюзами туннеля даже для филиалов, которые находятся рядом. Просто по пути следования есть перегруженный или неверно настроенный роутер;
- Может возникнуть ассиметричный роутинг из-за неверной настройки маршрутизации у провайдера;
- Может происходить быстрое изменение задержки передачи (джиттер). Для наших целей не так страшно, но вот допустим, для IP-телефонии вещь нежелательная.
Не буду скрывать, да это и очевидно — всё, что будет описано в данной записи, 100% материала — придумано всё это не мной, как сказал один мой знакомый — всё украдено до нас. Моя задача смотреть, анализировать, собирать информацию и доводить проект до конечной реализации сперва на бумаге, а потом в продакшене.
Выбор топологии
Итак, несколько подсетей. Для начала нужно проверить, что они не перекрываются. При всей очевидности проверить все-таки надо. Вот скажите сходу перекрываются ли сети?
192.168.0.0/20 192.168.17.0/24
А сети?
192.168.0.0/20 192.168.15.0/24
Далее, вариантов соединения сетей может быть несколько, но все они сводятся к двум основным — полносвязное соединение и звезда.
Полносвязное соединение
Все элементы равнозначны.
Плюсы:
- Простота настройки. Все туннели настраиваются на роутерах, которые смотрят в интернет и поддерживают функцию создания туннеля. На момент даже относительно дешевые роутеры это умеют;
- Нет единой точки отказа, если отваливается один туннель, то остальные продолжают работать;
- Оптимальное решение при небольшом количестве сетей: две, три — максимум, без последующего расширения.
Минусы:
- При большом количестве сетей избыточная, громоздкая структура;
- Добавление новой сети требует настройки еще стольких новых туннелей, сколько подсетей уже имеется (либо DMVPN);
- Если одна сеть (филиал организации) переезжает по новому адресу (без переноса IP), то это требует полной перенастройки всех связанных с ней туннелей.
Звезда
Ядро системы настраивается как VPN сервер, остальные элементы как VPN клиенты.
Плюсы:
- VPN клиент может находиться за NAT. IP адрес он может получать по DHCP. Это делает такого клиента непривязанным к конкретной сети провайдера. Включаем его на новом месте, он подсоединяется к серверу и работает. Всё что нужно сделать, это кинуть на него маршрут;
- Простота добавления нового клиента — минимальная настройка на сервере, а сам клиент настраивается из типового шаблона;
- Если клиент реализован на виртуальной машине, то это бесплатно. Вычислительная мощность такого клиента настраивается за минуту в любую сторону;
- Неочевидный плюс безопасности: маршрут на клиент, выступающий в роли шлюза в туннель, можно прописать как для всей локальной сети, так и для отдельных узлов;
- Второй неочевидный плюс безопасности: анонимность — с клиентов остальные подсети видятся только по своим приватным адресам, а если вдобавок на vpn-сервере выключен лог, то даже получив доступ к нему невозможно собрать информацию кто и откуда подключался;
- Третий неочевидный плюс безопасности: если локальная подсеть клиента маленькая, либо же малое число клиентов в сети использует туннель, то в этом случае клиент можно реализовать на микрокомпьютере Raspberry Pi. При необходимости такой микрокомпьютер можно здорово запрятать, а при настройке соединения через Wi-Fi и вовсе его не найдешь;
- Четвертый неочевидный плюс безопасности: всю структуру можно выключить, выключив VPN сервер. Если при этом VPN сервер реализован как VPS в интернете, то сделать это можно, находясь где угодно, одним нажатием на смартфоне. Если хостер разумно-жадный, что в данном случае хорошо и не делает бесплатных бекапов, то и полностью удалить VPN сервер без всяких следов можно также легко.
Минусы:
- Единая точка отказа, если VPN сервер недоступен по каким-либо причинам, то вся сеть лежит;
- Для каждого клиента нужны либо виртуальная машина, либо машина физическая;
- Размещенный в интернете VPN сервер требует ежемесячной оплаты;
- VPN сервер должен обладать необходимой вычислительной мощностью чтобы покрывать обсчет трафика от клиентов. Теоретически при достаточно большом количестве клиентов и больших подсетях за клиентами этой мощности может не хватить. На практике такого никогда не случится.
Реализация
Сначала хотел сделать что-то, взяв готовые решения типа IpCop, но потом понял, что из этого ничего не получится. Заставить тестового Ubuntu-клиента приконнектиться к серверу не удалось. Несмотря на стандарт, реализация OpenVPN видимо везде разная, например OpenVPN-сервер на роутере Mikrotik RB2011U почему-то использует TCP.. Это видно из строки proto tcp-client.
Роутер Mikrotik в режиме клиента непонятно что использует, но к готовой реализации проекта он также не подключился. Может что-то не разобрал, не спорю, тем не менее в конце-концов, ещё задолго до заказа VPS, пришел к выводу, что придется всё настраивать с нуля на одной ОС для всех машин туннеля.
По многим причинам выбрал вариант с выделенным VPS в интернете. Для начала нужно определиться где, в каком дата-центре разместить VPN сервер. Для этого нужно попросить в поддержке интересующего дата-центра тестовый IP, попинговать его и сделать трассировку из всех предполагаемых к соединению сетей, посмотреть число хопов. Полезная программа WinMTR:
Это занимает определенное время и вот наконец дата-центр выбран, VPS оплачен и готов к настройке.
Настройка VPN-сервера
Используем Ubuntu 16.04 LTS как дружелюбную, хорошо отлаженную систему. Установить систему на VPS можно из предварительно настроенных образов хостера, либо же отписать в поддержку и попросить загрузить для установки свой дистрибутив — А у вас нет такого же, но с перламутровыми пуговицами? Не стал заморачиваться и взял то, что дают. Установил, установка занимает пару минут: root включен, SSH доступ для root’а включен, swap раздела нет. Последнее не очень хорошо, поэтому первое:
apt-get install swapspace vi /etc/swapspace.conf swappath="/var/lib/swapspace" - директория, где создаются swap-файлы lower_freelimit=20 - нижний лимит незанятого пространства ОЗУ upper_freelimit=60 - верхний лимит незанятого пространства ОЗУ freetarget=30 - уровень до которого будет освобождено, должен находиться между двумя предыдущими min_swapsize=512m - минимальный размер swap-файла max_swapsize=1g - максимальный размер swap-файла cooldown=600 - какая-то задержка (сек.) max=10 min
Меняем hostname, когда сидишь через SSH сразу на нескольких машинах, то можно легко запутаться и набумбасить лишнего там, где не надо, потом будет обидно, а если отвалится связь с машиной, то очень обидно, поэтому:
vi /etc/hosts вместо "hostname" - имя вашего компьютера vi /etc/hostname
Своих клиентов обозвал по порядку V1, V2, V3 и так далее.
Убираем автообновление, вредная штука (на Ubuntu):
apt-get update apt-get dist-upgrade dpkg-reconfigure unattended-upgrades
Меняем root пароль:
passwd root
Также полезно пользоваться командой history для просмотра истории команд.
Настройка OpenVPN и сертификатов
apt-get install openvpn easy-rsa
Копируем дефолтный конфиг OpenVPN для правки:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
Правим:
vi /etc/openvpn/server.conf
Конфиг
################################################# # Sample OpenVPN 2.0 config file for # # multi-client server. # # # # This file is for the server side # # of a many-clients <-> one-server # # OpenVPN configuration. # # # # OpenVPN also supports # # single-machine <-> single-machine # # configurations (See the Examples page # # on the web site for more info). # # # # This config should work on Windows # # or Linux/BSD systems. Remember on # # Windows to quote pathnames and use # # double backslashes, e.g.: # # "C:\Program Files\OpenVPN\config\foo.key" # # # # Comments are preceded with '#' or ';' # ################################################# # Which local IP address should OpenVPN # listen on? (optional) ;local a.b.c.d # Which TCP/UDP port should OpenVPN listen on? # If you want to run multiple OpenVPN instances # on the same machine, use a different port # number for each one. You will need to # open up this port on your firewall. port 1194 # TCP or UDP server? ;proto tcp proto udp # "dev tun" will create a routed IP tunnel, # "dev tap" will create an ethernet tunnel. # Use "dev tap0" if you are ethernet bridging # and have precreated a tap0 virtual interface # and bridged it with your ethernet interface. # If you want to control access policies # over the VPN, you must create firewall # rules for the the TUN/TAP interface. # On non-Windows systems, you can give # an explicit unit number, such as tun0. # On Windows, use "dev-node" for this. # On most systems, the VPN will not function # unless you partially or fully disable # the firewall for the TUN/TAP interface. ;dev tap dev tun # Windows needs the TAP-Win32 adapter name # from the Network Connections panel if you # have more than one. On XP SP2 or higher, # you may need to selectively disable the # Windows firewall for the TAP adapter. # Non-Windows systems usually don't need this. ;dev-node MyTap # SSL/TLS root certificate (ca), certificate # (cert), and private key (key). Each client # and the server must have their own cert and # key file. The server and all clients will # use the same ca file. # # See the "easy-rsa" directory for a series # of scripts for generating RSA certificates # and private keys. Remember to use # a unique Common Name for the server # and each of the client certificates. # # Any X509 key management system can be used. # OpenVPN can also use a PKCS #12 formatted key file # (see "pkcs12" directive in man page). ca ca.crt cert server.crt key server.key # This file should be kept secret # Diffie hellman parameters. # Generate your own with: # openssl dhparam -out dh2048.pem 2048 dh dh2048.pem # Network topology # Should be subnet (addressing via IP) # unless Windows clients v2.0.9 and lower have to # be supported (then net30, i.e. a /30 per client) # Defaults to net30 (not recommended) ;topology subnet # Configure server mode and supply a VPN subnet # for OpenVPN to draw client addresses from. # The server will take 10.8.0.1 for itself, # the rest will be made available to clients. # Each client will be able to reach the server # on 10.8.0.1. Comment this line out if you are # ethernet bridging. See the man page for more info. server 10.8.0.0 255.255.255.0 # Maintain a record of client <-> virtual IP address # associations in this file. If OpenVPN goes down or # is restarted, reconnecting clients can be assigned # the same virtual IP address from the pool that was # previously assigned. ifconfig-pool-persist ipp.txt # Configure server mode for ethernet bridging. # You must first use your OS's bridging capability # to bridge the TAP interface with the ethernet # NIC interface. Then you must manually set the # IP/netmask on the bridge interface, here we # assume 10.8.0.4/255.255.255.0. Finally we # must set aside an IP range in this subnet # (start=10.8.0.50 end=10.8.0.100) to allocate # to connecting clients. Leave this line commented # out unless you are ethernet bridging. ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 # Configure server mode for ethernet bridging # using a DHCP-proxy, where clients talk # to the OpenVPN server-side DHCP server # to receive their IP address allocation # and DNS server addresses. You must first use # your OS's bridging capability to bridge the TAP # interface with the ethernet NIC interface. # Note: this mode only works on clients (such as # Windows), where the client-side TAP adapter is # bound to a DHCP client. ;server-bridge # Push routes to the client to allow it # to reach other private subnets behind # the server. Remember that these # private subnets will also need # to know to route the OpenVPN client # address pool (10.8.0.0/255.255.255.0) # back to the OpenVPN server. ;push "route 192.168.10.0 255.255.255.0" ;push "route 192.168.20.0 255.255.255.0" # To assign specific IP addresses to specific # clients or if a connecting client has a private # subnet behind it that should also have VPN access, # use the subdirectory "ccd" for client-specific # configuration files (see man page for more info). # EXAMPLE: Suppose the client # having the certificate common name "Thelonious" # also has a small subnet behind his connecting # machine, such as 192.168.40.128/255.255.255.248. # First, uncomment out these lines: ;client-config-dir ccd ;route 192.168.40.128 255.255.255.248 client-config-dir ccd ccd-exclusive route 192.168.190.0 255.255.255.0 route 192.168.192.0 255.255.255.0 route 192.168.0.0 255.255.240.0 # Then create a file ccd/Thelonious with this line: # iroute 192.168.40.128 255.255.255.248 # This will allow Thelonious' private subnet to # access the VPN. This example will only work # if you are routing, not bridging, i.e. you are # using "dev tun" and "server" directives. # EXAMPLE: Suppose you want to give # Thelonious a fixed VPN IP address of 10.9.0.1. # First uncomment out these lines: ;client-config-dir ccd ;route 10.9.0.0 255.255.255.252 # Then add this line to ccd/Thelonious: # ifconfig-push 10.9.0.1 10.9.0.2 # Suppose that you want to enable different # firewall access policies for different groups # of clients. There are two methods: # (1) Run multiple OpenVPN daemons, one for each # group, and firewall the TUN/TAP interface # for each group/daemon appropriately. # (2) (Advanced) Create a script to dynamically # modify the firewall in response to access # from different clients. See man # page for more info on learn-address script. ;learn-address ./script # If enabled, this directive will configure # all clients to redirect their default # network gateway through the VPN, causing # all IP traffic such as web browsing and # and DNS lookups to go through the VPN # (The OpenVPN server machine may need to NAT # or bridge the TUN/TAP interface to the internet # in order for this to work properly). push "redirect-gateway def1 bypass-dhcp" # Certain Windows-specific network settings # can be pushed to clients, such as DNS # or WINS server addresses. CAVEAT: # http://openvpn.net/faq.html#dhcpcaveats # The addresses below refer to the public # DNS servers provided by opendns.com. push "dhcp-option DNS 208.67.222.222" push "dhcp-option DNS 208.67.220.220" # Uncomment this directive to allow different # clients to be able to "see" each other. # By default, clients will only see the server. # To force clients to only see the server, you # will also need to appropriately firewall the # server's TUN/TAP interface. client-to-client # Uncomment this directive if multiple clients # might connect with the same certificate/key # files or common names. This is recommended # only for testing purposes. For production use, # each client should have its own certificate/key # pair. # # IF YOU HAVE NOT GENERATED INDIVIDUAL # CERTIFICATE/KEY PAIRS FOR EACH CLIENT, # EACH HAVING ITS OWN UNIQUE "COMMON NAME", # UNCOMMENT THIS LINE OUT. ;duplicate-cn # The keepalive directive causes ping-like # messages to be sent back and forth over # the link so that each side knows when # the other side has gone down. # Ping every 10 seconds, assume that remote # peer is down if no ping received during # a 120 second time period. keepalive 20 120 # For extra security beyond that provided # by SSL/TLS, create an "HMAC firewall" # to help block DoS attacks and UDP port flooding. # # Generate with: # openvpn --genkey --secret ta.key # # The server and each client must have # a copy of this key. # The second parameter should be '0' # on the server and '1' on the clients. ;tls-auth ta.key 0 # This file is secret # Select a cryptographic cipher. # This config item must be copied to # the client config file as well. ;cipher BF-CBC # Blowfish (default) cipher AES-128-CBC # AES ;cipher DES-EDE3-CBC # Triple-DES # Enable compression on the VPN link. # If you enable it here, you must also # enable it in the client config file. comp-lzo # The maximum number of concurrently connected # clients we want to allow. ;max-clients 100 # It's a good idea to reduce the OpenVPN # daemon's privileges after initialization. # # You can uncomment this out on # non-Windows systems. user nobody group nogroup # The persist options will try to avoid # accessing certain resources on restart # that may no longer be accessible because # of the privilege downgrade. persist-key persist-tun # Output a short status file showing # current connections, truncated # and rewritten every minute. ;status openvpn-status.log # By default, log messages will go to the syslog (or # on Windows, if running as a service, they will go to # the "Program FilesOpenVPNlog" directory). # Use log or log-append to override this default. # "log" will truncate the log file on OpenVPN startup, # while "log-append" will append to it. Use one # or the other (but not both). ;log openvpn.log ;log-append openvpn.log # Set the appropriate level of log # file verbosity. # # 0 is silent, except for fatal errors # 4 is reasonable for general usage # 5 and 6 can help to debug connection problems # 9 is extremely verbose verb 0 # Silence repeating messages. At most 20 # sequential messages of the same message # category will be output to the log. ;mute 20
Все понятно, наиболее важные параметры:
push "redirect-gateway def1 bypass-dhcp" - клиенты будут пихать весь траффик в туннель по умолчанию client-to-client - разрешить пакеты из подсети одного клиента в подсеть другого cipher AES-128-CBC - алгоритм шифрования, точно такой же должен быть прописан в конфиге клиента comp-lzo - включить сжатие user nobody group nogroup - две команды запускать openvpn не от root'а ;log openvpn.log ;log-append openvpn.log verb 0 - это чтобы сервер "не шумел" и ничего не писал в лог
Разрешаем форвардинг пакетов, полученных с других машин. Вот тут я долго не мог понять почему с клиента пакеты через туннель ходят, а пакеты отправленные с хостов на клиент лезут в интернет, вместо того чтобы лезть в туннель:
echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward=1
Файрвол
Файрвол по умолчанию выключен. Настраиваем:
ufw allow ssh ufw allow 1194/udp vi /etc/default/ufw DEFAULT_FORWARD_POLICY="ACCEPT" vi /etc/ufw/before.rules # rules.before # # Rules that should be run before the ufw command line added rules. Custom # rules should be added to one of these chains: # ufw-before-input # ufw-before-output # ufw-before-forward # START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 -A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES
И включаем:
ufw enable
Генерация сертификатов сервера
cp -r /usr/share/easy-rsa/ /etc/openvpn mkdir /etc/openvpn/easy-rsa/keys vi /etc/openvpn/easy-rsa/vars export KEY_COUNTRY="US" export KEY_PROVINCE="TX" export KEY_CITY="Dallas" export KEY_ORG="My Company Name" export KEY_EMAIL="sammy@example.com" export KEY_OU="MYOrganizationalUnit" - тут меняем данные на что-то близкое к реальности export KEY_NAME="server" - эта строчка важна, потому что серверный ключ должен называться server
Алгоритм Диффи-Хеллмана (DH) не является механизмом шифрования и обычно не используется для шифрования данных. Он позволяет обеспечивать безопасный обмен ключами, которые используются для шифрования данных. Алгоритмы DH позволяют двум сторонам установить общий секретный ключ, который используется алгоритмами шифрования и хеширования. openssl dhparam -out /etc/openvpn/dh2048.pem 2048
Данное действо происходит довольно долго и зависит от мощности сервера.
Переходим непосредственно к генерации ключей сервера:
cd /etc/openvpn/easy-rsa . ./vars ./clean-all - это действо нужно производить аккуратно, очищает все старые ключи ./build-ca - на все вопросы жмем Enter, все параметры мы уже поправили выше и где вопрос [y/n] - там y. ./build-key-server server - тож самое
Будут сгенерированы сертификат удостоверяющего центра и сертификат и ключ сервера — ca.crt, server.crt, server.key, все их нужно скопировать в папку /etc/openvpn:
cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn cp /etc/openvpn/easy-rsa/keys/server.crt /etc/openvpn cp /etc/openvpn/easy-rsa/keys/server.key /etc/openvpn
Проверим, что все на месте:
ls -la /etc/openvpn
Запускаем сервис и проверяем его статус:
service openvpn start service openvpn status
Если само не возвращается в привилегированный режим, то жмем Ctrl-C.
Генерация сертификатов клиентов
./build-key client1 ./build-key client2 ................... ./build-key clientX - по количеству клиентов
Совет — генерируйте сразу на пару клиентских сертификатов больше, чем нужно, с запасом.
Для заливки/скачивания с машины файлов есть очень удобная программа WinSCP.
Копируем ключи с сервера с помощью WinSCP на свою локальную машину. Для каждого клиента X должен быть наборчик — ca.crt, clientX.crt, clientX.key.
Параметры сервера для каждого клиента
В конфиге сервера есть строчки:
client-config-dir ccd ccd-exclusive
Они говорят что дополнительные параметры клиентов хранятся в директории ccd и для каждого клиента доступны свои эксклюзивные параметры. Создаем указанную директорию и файлы параметров:
cd /etc/openvpn mkdir ccd cd ccd touch client1 touch client2 ............. touch clientX
Редактируем каждый файл параметров:
vi client1 ifconfig-push 10.8.0.6 10.8.0.5 iroute 192.168.190.0 255.255.255.0
Первая строчка говорит, что шлюз туннеля на клиенте1 получит адрес 10.8.0.6, вторая обратный маршрут — маршрут с VPN сервера в подсеть клиента1. После настройки всех файлов параметров:
service openvpn restart service openvpn status
Немного о подсетях для туннеля
Каждый туннель это соединение point-to-point, в котором используется подсеть на 4 адреса. Такая подсесть имеет маску /30, то есть 255.255.255.252, а количество адресов вычисляется по формуле 2^n , где n = 32 — количество бит маски, поэтому адресов для маски /30:
2^(32-30) = 2^2 = 4
Но первый адрес — это адрес всей подсети, последний — широковещательный адрес этой подсети, поэтому для назначения узлам доступно только два адреса: второй и третий по счёту. Формула тут уже 2^n-2 и для наших подсетей это равно двум. Считать очень легко, группами по четыре ( 0,1,2,3 — 4,5,6,7 — 8,9,10,11 — 12,13,14,15 — 16,17,18,19 — … — 252,253,254,255 ):
10.8.0.0 - 10.8.0.3 - первая подсесть (используется для vpn-сервера - из конфига: # The server will take 10.8.0.1 for itself.. ), доступные адреса узлов - 10.8.0.1 и 10.8.0.2 10.8.0.4 - 10.8.0.7 - вторая подсесть (используется для клиента один), доступные адреса узлов - 10.8.0.5 и 10.8.0.6 10.8.0.8 - 10.8.0.11 - третья подсесть (используется для клиента два), доступные адреса узлов - 10.8.0.9 и 10.8.0.10 ...
Легко можно посчитать, что максимум клиентов при такой конфигурации 256/4 — 1 = 63, то есть больше, чем когда-либо понадобится (минус 1, потому что одна подсеть уже использована для сервера).
На этом, чтобы не усложнять, с сервером пока всё.
Настройка клиента
Для клиентов официальный дистрибутив Ubuntu-Server x64 со страницы проекта, в качестве носителя — виртуальная машина, получение настроек сети — по умолчанию (от DHCP). Виртуальная машина идеально подходит для экспериментов, создаем контрольную точку и по необходимости откатываемся на неё столько раз, сколько надо. Создание нового клиента также идеально на виртуальной машине — предварительно настроенная болванка машины выкладывается куда-нибудь на Яндекс Диск и люди с той стороны её забирают, включают на своем Hyper-V и всё работает.
После установки включаем root’а:
sudo passwd root
Включаем вход root по ssh:
sudo vi /etc/ssh/sshd_config PermitRootLogin yes
Переключаемся на root и убиваем текущего пользователя, созданного при установке:
userdel user11 - или какой там у вас
Далее кратенько, так как почти все уже делалось на сервере:
apt-get update apt-get upgrade sudo dpkg-reconfigure unattended-upgrades
apt-get install openvpn
echo 1 > /proc/sys/net/ipv4/ip_forward vi /etc/sysctl.conf net.ipv4.ip_forward=1
Файрвол не включаем, клиент за NAT, нет необходимости.
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/server.conf vi /etc/openvpn/server.conf
Конфиг
############################################## # Sample client-side OpenVPN 2.0 config file # # for connecting to multi-client server. # # # # This configuration can be used by multiple # # clients, however each client should have # # its own cert and key files. # # # # On Windows, you might want to rename this # # file so it has a .ovpn extension # ############################################## # Specify that we are a client and that we # will be pulling certain config file directives # from the server. client # Use the same setting as you are using on # the server. # On most systems, the VPN will not function # unless you partially or fully disable # the firewall for the TUN/TAP interface. ;dev tap dev tun # Windows needs the TAP-Win32 adapter name # from the Network Connections panel # if you have more than one. On XP SP2, # you may need to disable the firewall # for the TAP adapter. ;dev-node MyTap # Are we connecting to a TCP or # UDP server? Use the same setting as # on the server. ;proto tcp proto udp # The hostname/IP and port of the server. # You can have multiple remote entries # to load balance between the servers. remote X.X.X.X 1194 ;remote my-server-2 1194 # Choose a random host from the remote # list for load-balancing. Otherwise # try hosts in the order specified. ;remote-random # Keep trying indefinitely to resolve the # host name of the OpenVPN server. Very useful # on machines which are not permanently connected # to the internet such as laptops. resolv-retry infinite # Most clients don't need to bind to # a specific local port number. nobind # Downgrade privileges after initialization (non-Windows only) user nobody group nogroup # Try to preserve some state across restarts. persist-key persist-tun # If you are connecting through an # HTTP proxy to reach the actual OpenVPN # server, put the proxy server/IP and # port number here. See the man page # if your proxy server requires # authentication. ;http-proxy-retry # retry on connection failures ;http-proxy [proxy server] [proxy port #] # Wireless networks often produce a lot # of duplicate packets. Set this flag # to silence duplicate packet warnings. ;mute-replay-warnings # SSL/TLS parms. # See the server config file for more # description. It's best to use # a separate .crt/.key file pair # for each client. A single ca # file can be used for all clients. ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/client1.crt key /etc/openvpn/keys/client1.key # Verify server certificate by checking that the # certicate has the correct key usage set. # This is an important precaution to protect against # a potential attack discussed here: # http://openvpn.net/howto.html#mitm # # To use this feature, you will need to generate # your server certificates with the keyUsage set to # digitalSignature, keyEncipherment # and the extendedKeyUsage to # serverAuth # EasyRSA can do this for you. remote-cert-tls server # If a tls-auth key is used on the server # then every client must also have the key. ;tls-auth ta.key 1 # Select a cryptographic cipher. # If the cipher option is used on the server # then you must also specify it here. ;cipher x cipher AES-128-CBC # Enable compression on the VPN link. # Don't enable this unless it is also # enabled in the server config file. comp-lzo # Set log file verbosity. verb 0 # Silence repeating messages ;mute 20
Тут важного:
cipher AES-128-CBC remote X.X.X.X 1194 - вместо X.X.X.X должен быть публичный ip-адрес vpn-сервера
Ключи
mkdir /etc/openvpn/keys cd /etc/openvpn/keys
Копируем ключи, проверяем что все на месте, стартуем OpenVPN, проверяем статус туннеля:
ifconfig tun0
Если все нормально, то будет так:
Доступность OpenVPN-сервера:
ping 10.8.0.1
На этом с основной настройкой всё.
Скрип авто-поднятия туннеля на клиентах
Дело в том, что если туннель на работающем клиенте по каким-то причинам упадёт, то сам он не поднимется до перезапуска сервиса или до перезагрузки клиента, поэтому лепим скрипт, делаем его исполняемым и ставим его в Cron:
cd /etc mkdir scripts vi /etc/scripts/openvpn.sh # test openvpn-tun if [ -z "`ifconfig tun0`" ]; then service openvpn restart echo "`date`" >> /etc/scripts/openvpn.bug fi
Если туннель не найден среди активных интерфейсов, то время пишется в файл openvpn.bug.
chmod +x /etc/scripts/openvpn.sh
vi /etc/crontab # restart openvpn-service if drop */3 * * * * root /etc/scripts/openvpn.sh
Проверка идет каждые 3 минуты, этого достаточно, так как перезапуск службы и подъём туннеля происходит мгновенно.
Синхронизация времени
Решил что будет правильным, если время синхронизировано. И на клиентах, и на сервере:
apt-get install ntpdate apt-get install -y ntp /etc/init.d/ntp stop ntpdate pool.ntp.org /etc/init.d/ntp start
Установить временную зону:
dpkg-reconfigure tzdata
Проверить время можно так:
date
Сервер
vi /etc/ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help driftfile /var/lib/ntp/ntp.drift # Enable this if you want statistics to be logged. #statsdir /var/log/ntpstats/ statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable # Specify one or more NTP servers. # Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board # on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for # more information. pool 0.ubuntu.pool.ntp.org iburst pool 1.ubuntu.pool.ntp.org iburst pool 2.ubuntu.pool.ntp.org iburst pool 3.ubuntu.pool.ntp.org iburst # Use Ubuntu's ntp server as a fallback. pool ntp.ubuntu.com # Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for # details. The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions> # might also be helpful. # # Note that "restrict" applies to both servers and clients, so a configuration # that might be intended to block requests from certain clients could also end # up blocking replies from your own upstream servers. # By default, exchange time with everybody, but don't allow configuration. restrict -4 default kod notrap nomodify nopeer noquery limited restrict -6 default kod notrap nomodify nopeer noquery limited # Local users may interrogate the ntp server more closely. restrict 127.0.0.1 restrict ::1 # Needed for adding pool entries restrict source notrap nomodify noquery # Clients from this (example!) subnet have unlimited access, but only if # cryptographically authenticated. #restrict 10.8.0.0 mask 255.255.255.0 notrust restrict 10.8.0.0 mask 255.255.255.0 nomodify notrap # If you want to provide time to your local subnet, change the next line. # (Again, the address is an example only.) broadcast 10.8.0.1 # If you want to listen to time broadcasts on your local subnet, de-comment the # next lines. Please do this only if you trust everybody on the network! #disable auth #broadcastclient #Changes recquired to use pps synchonisation as explained in documentation: #http://www.ntp.org/ntpfaq/NTP-s-config-adv.htm#AEN3918 #server 127.127.8.1 mode 135 prefer # Meinberg GPS167 with PPS #fudge 127.127.8.1 time1 0.0042 # relative to PPS for my hardware #server 127.127.22.1 # ATOM(PPS) #fudge 127.127.22.1 flag3 1 # enable PPS API
Чтобы с NTP-сервером могли синхронизироваться машины из локальной сети:
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
Служба синхронизации времени использует порт 123 для соединения с сервером, поэтому необходимо разрешить доступ:
ufw allow from 10.8.0.0/24 to any port ntp
Окончательный вид фаервола сервера:
ufw status
Клиенты
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board # on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for # more information. server 10.8.0.1 iburst prefer pool 0.ubuntu.pool.ntp.org pool 1.ubuntu.pool.ntp.org pool 2.ubuntu.pool.ntp.org pool 3.ubuntu.pool.ntp.org
Узнаем насколько время на клиенте отстает от сервера:
ntpdate -q 10.8.0.1
Основные маршруты
Чтобы все машины подсети клиента, речь идёт о Windows машинах, могли ходить в туннель и видеть подсети за туннелем накидываем маршруты для этих подсетей на местный офисный роутер.
Если же это нужно только для отдельных машин, то прописываем маршруты на каждой из них, такой пример для 1 маршрута и соответственно для 1 удалённой подсети на хосте с Windows:
route add -p 192.168.0.0 mask 255.255.240.0 192.168.190.162 - опция -p нужна чтобы маршрут остался после перезагрузки
Остальные машины данной подсети не смогут видеть другие подсети через туннель и сами будут недоступны из других подсетей — пакет-то они получат, но вот оправить обратно не смогут.
Как добавить постоянный маршрут на Ubuntu-машину рассказано в отдельной записи.
Дополнительные маршруты
А что если на одном или нескольких клиентах есть больше чем одна подсеть? К примеру у меня в центральном офисе за напрямую подключенной к клиенту сетью 192.168.0.0/20, есть еще 10.50.0.0/20. Эта сеть находится за роутером и маршрута в эту сеть на клиенте центрального офиса нет, он ничего про неё не знает. Нужно прописать 4 маршрута — 3 прямых и 1 обратный. То есть сеть 10.50.0.0/20 прописывается:
- На клиенте центрального офиса V3;
- В файле sever.conf на vpn-сервере:
# EXAMPLE: Suppose the client # having the certificate common name "Thelonious" # also has a small subnet behind his connecting # machine, such as 192.168.40.128/255.255.255.248. # First, uncomment out these lines: ;client-config-dir ccd ;route 192.168.40.128 255.255.255.248 client-config-dir ccd ccd-exclusive route 192.168.190.0 255.255.255.0 route 192.168.192.0 255.255.255.0 route 192.168.0.0 255.255.240.0 route 10.50.0.0 255.255.240.0
- В файле параметров клиента на vpn-сервере:
cd /etc/openvpn/ccd/ vi client3 ifconfig-push 10.8.0.14 10.8.0.13 iroute 192.168.0.0 255.255.240.0 iroute 10.50.0.0 255.255.240.0
- И в подсети другого клиента, где сеть 10.50.0.0/24 должна быть доступна (на роутере или на хостах).
Клиент — физическая машина
Админов можно классифицировать по разным признакам, один из признаков — админы, как и коты, бывают ленивые и очень ленивые. Умные дядьки с хорошими зарплатами из центрального офиса сказали, что поднять Hyper-V сервер — это невозможная задача и времени надо как минимум до середины ноября, поэтому готовую виртуальную машину пришлось заливать на физическую и передавать уже в таком виде. Процесс описан в отдельной записи. Ещё надо не забыть включить в BIOS машины опцию Power On After Power Fail, чтобы она самостоятельно включалась после сбоя питания.
Клиент — Raspberry Pi 3
Начиная с третьей версии Малинка поддерживает Ubuntu. Два дистрибутива, что я нашел — не заработали. Дистрибутив с официальной страницы после обновления стал вываливаться в дамп. Второй дистрибутив с «raspberry2» в названии вообще не стартовал.
Поставил Raspbian. Это моё первое знакомство с данной ОС. Логин/пароль по умолчанию pi/raspberry. Практически все команды работают, Debian он и есть.. — установить VIM и команды задавать как vim … Не нашел как отключить автоматическое обновление (а включено ли оно вообще?).
Всё остальное также как и для других клиентов — включить root, убить пользователя pi и так далее. Рассмотрение настройки Малинки не входит в задачи этой статьи. Очень-очень кратко:
raspi-config rm -rf /opt - удалим каталог с образцом видео df -h - проверяем свободное место update-rc.d -f bluetooth remove update-rc.d -f dhcpcd remove
vim /etc/network/interfaces - закомментировать всё, что не по делу
Добавление нового клиента
Через некоторое время потребуется добавить нового клиента. Генерим новые сертификаты на сервере:
. ./vars ./build-key client5
Другой хороший вариант — сгенерировать сразу клиентских сертификатов с запасом, штук десять.
Прописываем новую сеть в конфигурацию сервера server.conf, создаем файл параметров клиента в папке ccd. Берем болванку виртуальной машины и заливаем сертификаты, а старые удаляем. В начале этого процесса лучше изолировать машину от выхода в интернет, иначе она полезет к серверу и нарушит работу машины, с которой была снята эта болванка.
Подключение к клиентам
После прописывания основных маршрутов все клиенты доступны по SSH через туннель по своим адресам в туннеле — 10.8.0.X.
Заключение
Чего-то много опять получилось, реально статья — 5300+ слов. Наверное половину слов дают конфиги 🙂 А на написание и правку так вообще целый день ушел, больше даже, но написание подобных статей хорошо систематизирует знания. OpenVPN сеть работает и чем дольше пользуюсь, тем больше мне нравится. Приятно, что открытое ПО стало уже таким зрелым и вкусным.
Единственный момент, который был упущен из виду MTU на сервере и на клиентах. Хотя при настройках по умолчанию всё работало нормально. Кто хочет поразбираться с данным моментом, можно почитать на OpenVPN Wiki, поиск по ключу «mssfix».