Инструменты пользователя

Инструменты сайта


openvpn

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
openvpn [2014/03/10 12:58]
metallic [Настройка сервера]
openvpn [2022/03/25 17:00] (текущий)
Строка 63: Строка 63:
 Перед тем как выполнять какие-либо действия с сертификатами нужно загрузить переменные среды: Перед тем как выполнять какие-либо действия с сертификатами нужно загрузить переменные среды:
  
-  . ./vars+  . ./vars
  
 Запустим скрипт очистки сертификатов, он нам создаст и инициализирует необходимые файлы: Запустим скрипт очистки сертификатов, он нам создаст и инициализирует необходимые файлы:
  
-  ./clean-all+  ./clean-all
  
 В результате должы появиться следующие файлы: В результате должы появиться следующие файлы:
Строка 79: Строка 79:
   # ./build-ca   # ./build-ca
  
 +В результате у нас появятся конревой сертификат и корневой ключ, которым будут подписываться остальные сертификаты. Корневой ключ - это самый большой секрет, если его каким-то образом украдут, то смогут подписать любой сертификат, так что его лучше хранить в надежном месте.
 +
 +Далее генерим сертификат сервера, качестве Common Name указываем что-то вроде "server":
 +
 +  # ./build-key-server server
 +
 +Дальше ключ DH(Diffie Hellman):
 +
 +  # ./build-dh
 +
 +Также в качестве дополнительной защиты(HMAC-firewall) сгенерим еще один ключик:
 +
 +  # openvpn --genkey --secret /etc/openvpn/keys/ta.key
 +
 +Осталось сгенерить клиентские сертификаты. Генерим такое кол-во, которое нужно и в качестве CN указываем интуитивно понятное имя, чтобы по нему можно было идентифицировать клиента:
 +
 +  ./build-key client1
 +  ./build-key client2
 +  ./build-key client3
 +
 +<note tip>
 +При генерации клиентских ключей можно дополнительно защитить их паролем на случай их кражи или потери. Вместо скрипта build-key нужно использовать build-key-pass, тогда при генерации ключа будет запрошен пароль(Enter PEM pass phrase). В этом случае у клиента при каждом подключении будет запрашиваться пароль. Сменить его нельзя и если клиент забыл пароль, то поможет только отзыва сертификата и перевыпуск ключа.
 +</note>
 +
 +Конфигурационный файл сервера /etc/openvpn/server.conf:
 +
 +  # Адрес на котором слушать, порт, протокол и тип интерфейса(маршрутизируемый)
 +  local 7.7.7.7
 +  port 1194
 +  proto udp
 +  dev tun
 +  
 +  # Корневой сертификат сервера
 +  ca keys/ca.crt
 +  # Сертификат сервера
 +  cert keys/server.crt
 +  # Закрытый ключ сервера
 +  key keys/server.key
 +  # БД отозванных сертификатов, пока опция закоментирована, до первого отозванного сертификата
 +  #crl-verify /etc/openvpn/keys/crl.pem
 +  # Статический ключ для дополнительной защиты(на стороне сервера вторая опция 0, на стороне клиента 1)
 +  tls-auth keys/ta.key 0
 +  # Ну и ключ протокола DH
 +  dh keys/dh2048.pem
 +  
 +  # Указываем диапазон виртуальных адресов, который будет выдаваться клиентам(также эта опция указывает, что будет запущен многоклиентый сервер). 
 +  server 192.168.0.0 255.255.255.0
 +  # Эта опция указывает на то, что нужно запоминать какие адреса выдавались каким клиентам, для того чтобы при след. подключении дать такие же.
 +  ifconfig-pool-persist ipp.txt
 +  # И опция указывающая на каталог с персональными настройками клиентов
 +  client-config-dir ccd
 +  
 +  # Посылать пинги каждые 10 сек. и если в течении 60 сек. ни одного не вернулось, считать соединение мертвым.
 +  keepalive 10 60
 +  
 +  # Меняем дефолтный алгоритм симетричного шифрования на более суровый(на клиенте обязательно сделать тоже, иначе не заработает)
 +  cipher AES-256-CBC
 +  
 +  # Включаем сжатие трафика и указываем максимальное кол-во клиентов
 +  comp-lzo
 +  max-clients 10
 +  
 +  # Для повышения безопасности принуждаем сервер работать от имени непривелегированного пользователя
 +  user nobody
 +  group nogroup
 +  
 +  # Не перечитывать ключи и не выполнять up/down скрипты при получении SIGUSR1 или ping-restart
 +  persist-key
 +  persist-tun
 +  
 +  # Настраиваем логирование, статус файл по активным соединениям, лог событий с сохранением истории и уровень логирования 3.
 +  status /var/log/openvpn/openvpn-status.log
 +  log-append  /var/log/openvpn/openvpn.log
 +  verb 3
 +  
 +  # Ну и включаем интерфейс управления через telnet на локалхосте и порту 7505  
 +  management localhost 7505
 +
 +Теперь создаем каталог для логов, запускаем сервер и проверяем, что он ждет подключения на порту 1194:
 +
 +  # mkdir /var/log/openvpn
 +
 +  # /etc/init.d/openvpn start
 +  [ ok ] Starting virtual private network daemon: server.
 +  
 +  # netstat -lnptu | grep 1194
 +  udp        0      0 7.7.7.7:1194         0.0.0.0:                          13088/openvpn
 +
 +Чтобы лог-файл со временем не занял все место создадим такой файл /etc/logrotate.d/openvpn:
 +
 +  /var/log/openvpn/openvpn.log {
 +          daily
 +          missingok
 +          copytruncate
 +          rotate 14
 +          compress
 +          notifempty
 +  }
 +
 +И в заключении зададим клиенту client1 персональные настройки, для этого создаем файл /etc/openvpn/ccd/client1:
 +
 +  ifconfig-push 192.168.0.241 192.168.0.242
 +  push "dhcp-option DNS 8.8.8.8"
 +  push "route 0.0.0.0 0.0.0.0"
 +
 +Тут статически задан адрес клиента 192.168.0.241, также переданы ему адрес DNS-сервера и маршрут(в данном случае маршрут по-умолчанию).
 +
 +<note>
 +Адреса клиентов надо выбирать из этого пула:
 +
 +  [  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
 +  [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
 +  [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
 +  [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
 +  [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
 +  [101,102] [105,106] [109,110] [113,114] [117,118]
 +  [121,122] [125,126] [129,130] [133,134] [137,138]
 +  [141,142] [145,146] [149,150] [153,154] [157,158]
 +  [161,162] [165,166] [169,170] [173,174] [177,178]
 +  [181,182] [185,186] [189,190] [193,194] [197,198]
 +  [201,202] [205,206] [209,210] [213,214] [217,218]
 +  [221,222] [225,226] [229,230] [233,234] [237,238]
 +  [241,242] [245,246] [249,250] [253,254]
 +</note>
  
 ===== Настройка клиента ===== ===== Настройка клиента =====
 +
 +На стороне клиента также устанавливается OpenVPN. В данном случае в качестве клиента рассмотрим Windows. Устанавливаем OpenVPN с GUI и создаем каталог C:\Program Files\OpenVPN\config. В этом каталоге создаем подкаталог с именем клиента, например client1 и копируем туда сертификаты корневой и сертификат клиента, статический ключ и ключ клиента. Создаем конфигурационный файл client1.ovpn:
 +
 +  # Указываем что мы клиент, тип интерфейса, протокол и адрес сервера. Директив remote с адресом сервера может быть больше одной,
 +  # в этом случае клиент будет последовательно пытаться подключиться к серверам.
 +  client
 +  dev tun
 +  proto udp
 +  remote 7.7.7.7 1194
 +  nobind
 +  # При указании этой дериктивы, клиент будет выбирать сервер из списка случайно, таким образом можно обеспечить балансировку нагрузки.
 +  ;remote-random
 +  
 +  # Пытаться установить подключение бесконечно. Удобно на компьютерах с непостоянным доступом в интернет.
 +  resolv-retry infinite
 +  
 +  # Аналогично, как на сервере, не перечитывать ключи при перезапусках
 +  persist-key
 +  persist-tun
 +  
 +  # Может понадобиться раскоментить, если работаете через WiFi
 +  ;mute-replay-warnings
 +  
 +  # Посылать пинги каждые 10 сек. на протяжении минуты, если ответа нет, соединение считается разорванным.
 +  keepalive 10 60
 +  
 +  # Пути к сертификатам и ключам относительно каталога config
 +  ca "client1\\ca.crt"
 +  cert "client1\\client1.crt"
 +  key "client1\\client1.key"
 +  tls-auth "client1\\ta.key" 1
 +  
 +  # Алгоритм шифрования данных
 +  cipher AES-256-CBC
 +  
 +  # Включаем сжатие
 +  comp-lzo
 +  
 +  # И уровень логирования
 +  verb 3
 +
 +Теперь можно запустить GUI и попробовать подключиться.
 +
 +===== Отзыв сертификатов =====
 +
 +Иногда может случиться такая ситуация, что выданный сертификат нужно заблокировать раньше, чем истечет срок его действия, для этого существует процедура "отзыва сертификата", .т.е. он просто добавляется в БД отозванных сертификатов и сервер при подключении проверяет это. Допустим мы хотим отозвать сертификат client1, переходим в каталог /usr/share/doc/openvpn/examples/easy-rsa/2.0 и выполняем следующие команды:
 +
 +  # . ./vars
 +  
 +  # ./revoke-full client1
 +  Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl-1.0.0.cnf
 +  Revoking Certificate 02.
 +  Data Base Updated
 +  Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl-1.0.0.cnf
 +  client1.crt: C = RU, ST = RU, L = Voronezh, O = Roga & KO, OU = Roga, CN = client1, name = Roga, emailAddress = admin@domain.ru
 +  error 23 at 0 depth lookup:certificate revoked
 +
 +Не смотря на то, что в последнем сообщении содержится "error 23", на самом деле это значит, что операция прошла успешно. В результате выполнения этой команды должен был появиться файл БД /etc/openvpn/keys/crl.pem. Теперь в конфигурационном файле сервера нужно раскоментировать эту строку:
 +
 +  crl-verify /etc/openvpn/keys/crl.pem
 +
 +И перезагрузить конфигурационный файл:
 +
 +  # /etc/init.d/openvpn reload
 +
 +С этого момента client1 подключиться не сможет. Если же он уже был подключен, то соединение будет разорвано при ближайшем пересогласовании сертификатов(по умолчании каждый час). Если же соединение нужно разорвать немедленно, то можно воспользоваться управляющим интерфейсом, подключившись через telnet:
 +
 +  # telnet localhost 7505
 +  Trying 127.0.0.1...
 +  Connected to localhost.
 +  Escape character is '^]'.
 +  >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
 +  
 +  kill client1
 +  SUCCESS: common name 'client1' found, 1 client(s) killed
 +  
 +===== Ссылки =====
 +
 +  * [[http://pro-ldap.ru/tr/zytrax/tech/encryption.html|Руководство по выживанию — шифрование, аутентификация]]
 +  * [[http://pro-ldap.ru/tr/zytrax/tech/ssl.html|Руководство по выживанию — TLS/SSL и сертификаты SSL (X.509)]]
 +  * [[http://habrahabr.ru/company/tuthost/blog/150433/|Цифровые SSL сертификаты. Разновидности, как выбрать?]]
openvpn.1394441908.txt.gz · Последнее изменение: 2022/03/25 17:04 (внешнее изменение)