Настраиваем OpenVPN в режиме сервер - клиенты, а так же клиент для подключения к серверу.
Установка
Устанавливаем пакет:
pkg install openvpn
Генерация ключей
Инициализируем папку с ключами. В текущей директории будет создана папка pki:
easyrsa init-pki
Настраиваем параметры Easy-RSA:
ee pki/vars
Как минимум, проверяем следующие параметры:
# In how many days should the root CA key expire? # Срок действия ключа корневого центра сертификации (дней) set_var EASYRSA_CA_EXPIRE 10000 # In how many days should certificates expire? # Срок действия сертификатов (сервера и клиентов, дней) set_var EASYRSA_CERT_EXPIRE 10000
Генерируем ключи.
# Создаем корневой сертификат: easyrsa build-ca nopass # Создаем ключ и сертификат для сервера с именем server: easyrsa build-server-full server nopass # Создаем ключ и сертификат для клиента с именем client: easyrsa build-client-full client nopass # Переходим в папку с ключами: cd pki # Создаем ключ для системы безопасного обмена ключами по алгоритму Диффи — Хеллмана: openssl dhparam -out dh2048.pem 2048 # Генерируем ключ пакетной авторизации: openvpn --genkey tls-auth ta.key
Настройка сервера
Создаем папку с файлами конфигурации:
mkdir /usr/local/etc/openvpn
Копируем сгенерированные ключи из папки keys по умолчанию в /usr/local/etc/openvpn:
cp ca.crt dh2048.pem ta.key issued/server.crt private/server.key /usr/local/etc/openvpn
Ключи клиентов на сервере не требуются, они подписаны корневым ключом, их подлинность проверяется с помощью корневого сертификата.
Переходим в папку конфигурации:
cd /usr/local/etc/openvpn
Копируем шаблон конфига:
cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn
Редактируем файл конфигурации:
ee server.conf
Конфигурация сервера (server.conf):
################################################### # Sample OpenVPN 2.0 config file for # # multi-client server. # # # # This file is for the server side # # of amany-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-server proto udp |
Рекомендуемый протокол - UDP. Используем TCP только при проблемах с установкой 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
|
Тип виртуального интерфейса: tap - эмулирует сетевую карту tun - туннель точка-точка. Можно явно задать номер интерфейса, например tun0. |
# 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
|
Специфично для Windows. |
# 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
|
Тип сетевой адресации, рекомендованное значение: subnet, работает по принципу Ethernet, c IP-адресом и сетевой маской. По умолчанию для старых версий включен режим точка-точка, не рекомендуется, будет удален в будущих версиях. |
# 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
|
Включает режим сервера, фактически встроенный маршрутизатор, позволяющий принимать несколько клиентских подключений на один системный туннель. Задается адрес сети и маска, первые два адреса будут использованы в качестве адресов сервера и клиента устройства tun, остальные доступны клиентам. |
# 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
# 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.
|
Для обеспечения доступа к сетям клиента, задаем маршруты к этим сетям. Заданные здесь маршруты будут добавлены к системным маршрутам. В режиме сервера, необходимо также задать внутренние маршруты параметром iroute в файле конфигурации клиента. |
# 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"
|
Команда push задает параметры конфигурации клиента. Данный параметр предлагает клиенту использовать подключение как шлюз по умолчанию. Описание параметров смотрим на станице справки. |
# 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" |
Позволяет задать клиенту адреса DNS серверов. Заявлено что работать будет только в Windows. |
# 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 10 120
|
Пинговать клиент каждые 10 секунд, если за 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 tls-auth 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. |
Выбор алгоритма шифрования, должен совпадать с клиентом. |
# Enable compression on the VPN link and push the # For compression compatible with older clients use 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 nobody |
Ограничить права демона заданным пользователем и группой. |
# 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 Files\OpenVPN\log" 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 |
Путь к лог-файлу, по умолчанию протокол пишется в syslog. |
# 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 3
|
Уровень детальности протоколирования. |
# Silence repeating messages. At most 20
# sequential messages of the same message
# category will be output to the log.
;mute 20
|
Не писать в лог сообщения, повторяющиеся более заданного числа раз. |
# Notify the client that when the server restarts so it
# can automatically reconnect.
explicit-exit-notify 1
|
Информировать клиентов о перезагрузке сервера. |
;tun-mtu 1300 ;mssfix 1300 ;fragment 1300 |
Если интернет подключен через VPN, то для успешного прохождения пакетов, необходимо уменьшить размер пакета в туннеле. Задаем максимальный размер пакета, включаем корректировку размера TCP-пакетов, проходящих через туннель, и фрагментацию больших пакетов. В качестве параметра, задаем максимально допустимый размер пакета минус 50. |
Конфигурация клиентов
Путь к папке с конфигами задается параметром client-config-dir
основного файла конфигурации.
Создаем и переходим в папку:
mkdir /usr/local/etc/openvpn/ccd && cd /usr/local/etc/openvpn/ccd
Имя файла конфигурации клиента берется из поля Common Name сертификата, которое обычно совпадает с именем ключа.
Создаем конфиг клиента:
ee client
Задаем параметры:
#Задаем локальный и удаленный IP-адрес клиента. #В режиме сервера, адрес будет присвоен автоматически, задавать его явно необязательно. ;ifconfig-push 192.168.254.10 192.168.254.9 #В режиме сервера задаем внутренние маршруты OpenVPN к сетям клиента. ;iroute 192.168.40.128 255.255.255.248
Допустимы также команды настройки клиента: push и push-reset. Push-reset отменяет передачу параметров заданных в глобальном файле настроек.
Параметры запуска
Правим /etc/rc.conf:
ee /etc/rc.conf
Включаем OpenVPN, указываем запуск в режиме сервера и тип интерфейса, для которого необходимо загрузить драйвер. Задаем путь к конфигу.
openvpn_enable="YES" openvpn_flags="--tls-server" openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap" openvpn_configfile="/usr/local/etc/openvpn/server.conf"
Для использования tap-интерфейса, в /boot/loader.conf потребуется добавить строку: if_tap_load="YES", и перезагрузить систему.
Брандмауэр
Для ipfw правила будут примерно следующие.
Разрешаем все соединения через туннель:
ipfw add allow all from any to any via tun0
Разрешаем исходящие и входящие подключения к серверу:
ipfw add allow udp from any to me 1194
ipfw add allow udp from me 1194 to any
Запуск
Запускаем сервер:
service openvpn start
Проверяем, стартанул ли демон:
ps -ax | grep openvpn
Проверяем, открылся ли порт:
sockstat -4l | grep openvpn
Проверяем сообщения в лог-файле:
cat /var/log/messages
Настройка клиента
Устанавливаем OpenVPN.
Создаем и переходим в папку с файлами конфигурации:
mkdir /usr/local/etc/openvpn && cd /usr/local/etc/openvpn
Копируем сертификат и ключи клиента: ca.crt, client.crt, client.key, ta.key
. Ключи являются текстовыми файлами, если прямое копирование затруднено, можно использовать буфер обмена SSH-клиента.
Ограничиваем доступ к ключам:
chmod 600 client.key ta.key && chown root:wheel client.key ta.key
Копируем шаблон конфига клиента:
cp /usr/local/share/examples/openvpn/sample-config-files/client.conf /usr/local/etc/openvpn/
Редактируем файл конфигурации:
ee client.conf
Конфигурация клиента (client.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
|
Специфично для Windows. |
# Are we connecting to a TCP or
# UDP server? Use the same setting as
# on the server.
;proto tcp-client
proto udp
|
Протокол. |
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote my-server-1 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
|
Запрашивать адрес в DNS при каждом подключении, полезно, если у сервера динамический адрес. |
# Most clients don't need to bind to
# a specific local port number.
nobind
|
Для клиента привязка к определенному порту не требуется, использовать динамический порт, выделенный системой. |
# Downgrade privileges after initialization (non-Windows only) ;user nobody ;group nobody |
Ограничить права демона заданным пользователем и группой. |
# 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 ca.crt cert client.crt key client.key |
Задаем ключи авторизации. |
# Verify server certificate by checking that the # certificate 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.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the data-ciphers option in the manpage
;cipher AES-256-CBC
|
Алгоритмы шифрования, должны совпадать с сервером. Начиная с версии 2.4, по умолчанию согласуется протокол AES-256-GCM. |
# 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 3
|
Уровень детальности протоколирования. |
# Silence repeating messages
;mute 20
|
Не писать в лог более заданного количества одинаковых сообщений подряд. |
;tun-mtu 1300 ;mssfix 1300 ;fragment 1300 |
Если интернет подключен через VPN, то для успешного прохождения пакетов, необходимо уменьшить размер пакета в туннеле. Задаем максимальный размер пакета, включаем корректировку размера TCP-пакетов, проходящих через туннель, и фрагментацию больших пакетов. В качестве параметра, задаем максимально допустимый размер пакета минус 50. |
Параметры запуска
ee /etc/rc.conf
Включаем запуск OpenVPN, указываем тип интерфейса, для которого необходимо загрузить драйвер, указываем путь к конфигу.
openvpn_enable="YES" openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap" openvpn_configfile="/usr/local/etc/openvpn/client.conf"
Брандмауэр
Для ipfw правила будут примерно следующие:
Разрешить все соединения через туннель:
ipfw add allow all from any to any via tun0
Разрешаем исходящие и входящие подключения к серверу:
ipfw add allow udp from any to me 1194
ipfw add allow udp from me 1194 to any
Запуск
Запускаем клиент:
service openvpn start
Проверяем сообщения в лог-файле:
cat /var/log/messages
Проверяем, открылся ли туннель:
ifconfig
Пингуем удаленный сервер.
Пингуем хосты в сети за сервером.
В случае проблем мониторим туннель:
tcpdump -ni tun0
Параллельно мониторим физический канал:
tcpdump -ni $pif udp port 1194
Проверяем маршруты к удаленным сетям:
traceroute -P ICMP УдаленныйАдрес
Дополнительная информация
Man-страница: OpenVPN
Потенциальные грабли - значение MTU для tun/tap. Как-то столкнулся с этим, когда понадобилось посмотреть картинку с видеорегистратора, подключившись к нему через udp туннель.
Полезно:
tun-mtu 1500
fragment 1300
mssfix
Работает только для proto udp.
Встречал проблемы и с UDP в случае с мостом Windows - Windows через NAT. Переключил на TCP, работает без проблем. Выбор протокола вопрос индивидуальный для каждого конкретного случая.