OpenVPN — свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек. Для обеспечения безопасности управляющего канала и потока данных OpenVPN использует библиотеку OpenSSL. Благодаря этому задействуется весь набор алгоритмов шифрования, доступных в данной библиотеке.
Имеем:
Ось FreeBSD (тут не принципиально, можно поднимать сервер на любой операционке. Настройки в системах Linux ничем не будут отличаться, разве что по-другому устанавливается программное обеспечение).
em0=10.0.2.15/24 - сетевая карта смотрит к провайдеру (наружу)
em1=192.168.30.1/24 — сетевая карта смотрит внутрь локальной сети
1. Устанавливаем и конфигурируем OpenVPN
Ставим из портов:
#cd /usr/ports/security/openvpn20 #make #make install |
Всё необходимое поставлено, переходим к конфигурированию. Необходимо создать сертификаты и ключи.
Идем в /usr/local/share/doc/openvpn/easy-rsa/ и открываем на редактирование файл vars.
Оставим все параметры дефолтовыми, кроме директории куда складывать сгенерированные ключи. Изменим в этом файле строку «export KEY_DIR=$D/keys» на «export KEY_DIR=$D/keys/server», соответственно создав такую же дирректорию /usr/local/share/doc openvpn/easy-rsa/keys/server.
Создаём сертификаты и ключи
# cd /usr/local/share/doc/openvpn/easy-rsa/ |
Внимание! Если у вас по умолчанию не баш, то перед следующими операциями нужно набрать в консоли "sh". Загружаем переменные в оболочку:
#sh #. ./vars |
Очищаем от старых сертификатов и ключей папку keys/server и создаем серийный и индексные файлы для новых ключей
#./clean-all |
Создаём сертификат. При создании сертификата вводим необходимую информацию.
Листинг с консоли:
#./build-ca (Создаем Certificate Authority для сервера) Generating a 1024 bit RSA private key ....................++++++ ...++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- #Страна Country Name (2 letter code) [RU]:RU #Провинция State or Province Name (full name) []:Moscow #Город Locality Name (eg, city) []:Moscow #Название компании(!) Organization Name (eg, company) [x]:server #Отделение компании Organizational Unit Name (eg, section) []:server #ВОТ ТУТ ВНИМАТЕЛЬНО - ЭТО ИМЯ МАШИНЫ ДЛЯ КОТОРОЙ # ГЕНЕРИРУЕМ СЕРТИФИКАТ (имя не в полном смысле -имя как идентификатор) Common Name (eg, your name or your server's hostname) []:server #Почт адрес Email Address [root@localhost]: |
Не факт что у всех, но бывает что при попытке создать сертификат ругается на отсутствующие файлы index.txt и serial. В /usr/local/share/doc/openvpn/easy-rsa/keys/server - создаём файлы (пустой и с "нулевым" содержимым соответственно)
#echo "">/usr/local/share/doc/openvpn/easy-rsa/keys/server/index.txt #echo "00">/usr/local/share/doc/openvpn/easy-rsa/keys/server/serial |
Создаем сертификат X.509 для сервера. Всё аналогично заполняем(точно так же) + cтроки в котрых указываем пароль и имя организации
#./build-key-server server # Страна Country Name (2 letter code) [RU]:RU # Провинция State or Province Name (full name) []:Moscow # Город Locality Name (eg, city) []:Moscow # Название компании(!) Organization Name (eg, company) [x]:server # Отделение компании Organizational Unit Name (eg, section) []:server # ВОТ ТУТ ВНИМАТЕЛЬНО - ЭТО ИМЯ МАШИНЫ Common Name (eg, your name or your server's hostname) []:server # Почт адрес Email Address [root@localhost]: Please enter the following 'extra' attributes to be sent with your certificate request # пароль A challenge password []:123456789 # название организации # (как и в создании корневого сертификата) An optional company name []:server |
В конце соглашаемся и подписываем сертификат, отвечая "yes"
Создаём ключ для клиента:
#./build-key client Generating a 1024 bit RSA private key .........++++++ .......++++++ writing new private key to 'client.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [RU]:RU State or Province Name (full name) []:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [server]:server Organizational Unit Name (eg, section) []:server Common Name (eg, your name or your server's hostname) []:client Email Address [root@localhost]:
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:123456789 An optional company name []:client |
Будьте внимательны при заполнении данных сертификатов, поле Common Name обязательно к заполнению, причем для сервера оно должно быть одно, а для клиента другое. Например в поле Common Name при генерации сертификата X.509 для сервера можно написать server, а для клиента соотвественно client
Создаем ключ Диффи Хельман:
# ./build-dh |
И наконец создаем ключ для tls-аутификации:
# openvpn --genkey --secret keys/server/ta.key |
Теперь выходим из sh написав команду "exit".
После всех этих манипуляций в папке keys/server имеем файлы:
-
ca.crt - главный CA сертификат, этот файл нужен и клиенту и серверу
-
dh1024.pem - ключ Диффи Хельман, этот файл нужен только серверу
-
server.crt - сертификат сервера, нужен только серверу
-
server.key - ключ сервера, нужен только серверу (секретный файл)
-
client.crt - сертификат клиента, нужен только клиенту
-
client.key - ключ клиента, нужен только клиенту (секретный файл)
-
ta.key - TLS-ключ, нужен и клиенту и серверу
Серверу достаются файлы ca.crt, dh1024.pem, server.crt, server.key, ta.key,
а клиенту ca.crt, dh1024.pem,client.crt, client.key, ta.key
2. Настраиваем vpn-сервер
Создаём 3 директории:
#mkdir /usr/local/etc/openvpn #mkdir /usr/local/etc/openvpn/keys #mkdir /usr/local/etc/openvpn/ccd |
Так же для удобства скопируем все ключи в /usr/local/etc/openvpn/keys (ca.crt, dh1024.pem, server.crt, server.key, ta.key).
Создаем конфигурационный файл server.conf следующего содержания:
#порт на котором работает сервер port 2000 # протокол - советую udp proto udp # - используемый тип устройства и номер dev tun0 #указываем файл CA ca /usr/local/etc/openvpn/keys/ca.crt #указываем файл с сертификатом сервера cert /usr/local/etc/openvpn/keys/server.crt #указываем файл с ключем сервера key /usr/local/etc/openvpn/keys/server.key #указываем файл Диффи Хельман dh /usr/local/etc/openvpn/keys/dh1024.pem #задаем IP-адрес сервера и маску подсети # (виртуальной сети) - можно произвольную, (я выбрал такую) server 10.10.200.0 255.255.255.0 #задаем маршрут, который передаём клиенту и маску подсети для того чтобы он "видел" # сеть за vpn сервером (сеть 192.168.1.0/24) push "route 192.168.5.0 255.255.255.0" # указываем где хранятся файлы с настройками IP-адресов клиентов client-config-dir ccd # добавляем маршрут сервер-клиент route 10.10.200.0 255.255.255.252 # включаем TLS tls-server # указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента tls-auth keys/ta.key 0 # таймаут до reconnect tls-timeout 120 auth MD5 # # включаем шифрование пакетов cipher BF-CBC keepalive 10 120 # сжатие трафика comp-lzo # максимум клиентов max-clients 100 user nobody group nobody # Не перечитывать ключи после получения # SIGUSR1 или ping-restart persist-key # Не закрывать и переоткрывать TUN\TAP устройство, после получения # SIGUSR1 или ping-restart persist-tun # логгирование (не забудьте создать эту дирректорию /var/log/openvpn/) status /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log # Уровень информации для отладки verb 3 |
В дирректории /usr/local/etc/openvpn/ccd создаем файл client (имя файла - имя которому выдан сертификат) следующего содержания:
#echo "ifconfig-push 10.10.200.2 10.10.200.1" > /usr/local/etc/openvpn/ccd/client |
Сервер готов
Для автостарта при загрузке Openvpn-сервера в /etc/rc.conf пропишем:
openvpn_enable="YES" # YES or NO openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap" openvpn_configfile="/usr/local/etc/openvpn/server.conf" # --config file openvpn_dir="/usr/local/etc/openvpn" # --cd directory |
3. Настраиваем клиента openvpn под Windows
Качаем клиента. Создадим конфигурационный файл openvpn.ovpn в папке config (Например C:\Program Files\OpenVPN\config). И скопируем туда же все необходимые ключи для работы (ca.crt, dh1024.pem, client.crt, client.key, ta.key).
Содержимое файла openvpn.ovpn:
dev tun proto udp remote 10.0.2.15#(реальный ip вашего сервера) port 2000 #(порт к которому устанавливать соединение client resolv-retry infinite ca ca.crt cert client.crt key client.key tls-client tls-auth ta.key 1 auth MD5 cipher BF-CBC ns-cert-type server comp-lzo persist-key persist-tun verb 3 |
НЬЮАНС!
В /usr/local/etc/openvpn/ccd при создании файла с настройками для клиента помните:
ifconfig-push 10.10.200.2 10.10.200.1
этой строкой организовываем езернет-тун с сеткой 10.10.200.0, 2-мя машинами с ip 10.10.200.2 и 10.10.200.1 и бродкастом 10.10.200.3
соответственно при создании 2-го, 3-го и т.д. клиента - строка должна принимать вид
ifconfig-push 10.10.200.6 10.10.200.5
ifconfig-push 10.10.200.10 10.10.200.9