KsI-wiki online documents

Openvpn multi

Материал из Ksimute

Перейти к: навигация, поиск

Коробанов Сергей
Июнь 16, 2010

Основано на http://www.lissyara.su/articles/freebsd/security/openvpn/ С некоторыми существенными изменениями и дополнениями, т.к. у меня debian и т.п.

Сразу рекомендую отредактировать файл

 #vi /usr/share/doc/openvpn/examples/easy-rsa/2.0/vars

Чтобы не забивать руками Country и т.п. при создании сертификатов.


Дистрибутив - Debian lenny. Этап установки самого openvpn пропущу. Это даже моя бабушка умеет.


Содержание

Создание сертификатов и ключей

 cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
 source ./vars 

Удаляем старые сертификаты и ключи

 ./clean-all

Создаем Certificate Authority для сервера

 ./build-ca
 Country Name (2 letter code) [US]:RU
 State or Province Name (full name) [CA]:MOSCOW REG
 Locality Name (eg, city) [SanFrancisco]:Zhukovsky
 Organization Name (eg, company) [Fort-Funston]:Corporation
 Organizational Unit Name (eg, section) []:IT
 Common Name (eg, your name or your server's hostname) [Fort-Funston CA]:Corporation CA
 Email Address [me@myhost.mydomain]:sergey.korobanov@webamg.com

Создаем сертификат X.509 для сервера.

 gate:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-key-server server
 
 Country Name (2 letter code) [US]:RU
 State or Province Name (full name) [CA]:MOSCOW REG
 Locality Name (eg, city) [SanFrancisco]:Zhukovsky
 Organization Name (eg, company) [Fort-Funston]:Corporation
 Organizational Unit Name (eg, section) []:IT
 Common Name (eg, your name or your server's hostname) [server]:Corporation CA
 Email Address [me@myhost.mydomain]:sergey.korobanov@webamg.com
 
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:mySecurePassword
 An optional company name []:Corporation CA
 Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'RU'
 stateOrProvinceName   :PRINTABLE:'MOSCOW REG'
 localityName          :PRINTABLE:'Zhukovsky'
 organizationName      :PRINTABLE:'Corporation'
 organizationalUnitName:PRINTABLE:'IT'
 commonName            :PRINTABLE:'Corporation CA'
 emailAddress          :IA5STRING:'sergey.korobanov@webamg.com'
 Certificate is to be certified until Jun  5 03:44:00 2020 GMT (3650 days)
 Sign the certificate? [y/n]:y
 
 
 1 out of 1 certificate requests certified, commit? [y/n]y
 Write out database with 1 new entries
 Data Base Updated

Создаём ключ для клиента

 gate:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-key client1
 Country Name (2 letter code) [US]:RU
 State or Province Name (full name) [CA]:MOSCOW REG
 Locality Name (eg, city) [SanFrancisco]:Zhukovsky
 Organization Name (eg, company) [Fort-Funston]:Corporation
 Organizational Unit Name (eg, section) []:IT
 Common Name (eg, your name or your server's hostname) [client1]:
 Email Address [me@myhost.mydomain]:root@localhost
 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:Client1password
 An optional company name []:
 Using configuration from /usr/share/doc/openvpn/examples/easy-rsa/2.0/openssl.cnf
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'RU'
 stateOrProvinceName   :PRINTABLE:'MOSCOW REG'
 localityName          :PRINTABLE:'Zhukovsky'
 organizationName      :PRINTABLE:'Corporation'
 organizationalUnitName:PRINTABLE:'IT'
 commonName            :PRINTABLE:'client1'
 emailAddress          :IA5STRING:'root@localhost'
 Certificate is to be certified until Jun  5 03:50:12 2020 GMT (3650 days)
 Sign the certificate? [y/n]:y


 1 out of 1 certificate requests certified, commit? [y/n]y
 Write out database with 1 new entries
 Data Base Updated

Создаем ключ Диффи Хельман

 gate:/usr/share/doc/openvpn/examples/easy-rsa/2.0# ./build-dh 

Cоздаем ключ для tls-аутификации

 openvpn --genkey --secret ta.key

Итак что нам надо.

  1. ca.crt - Главный CA сертификат, этот файл нужен и клиенту и серверу
  2. dh1024.pem - ключ Диффи Хельман, этот файл нужен только серверу
  3. server.crt - Сертификат сервера, нужен только серверу
  4. server.key - Ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
  5. client1.crt - Сертификат клиента, нужен только клиенту
  6. client1.key - Ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)
  7. ta.key - TLS-ключ, нужен и клиенту и серверу

Конфиги:

Создаем папку для логов:

 gate:/etc/openvpn# mkdir /var/log/openvpn
 gate:/etc/openvpn# chown nobody:nogroup /var/log/openvpn
 gate:/var/log# cd /etc/openvpn/ccd/
 gate:/etc/openvpn/ccd# vi client1
 gate:/etc/openvpn/ccd# cat client1
 ifconfig-push 192.168.25.2 192.168.25.1


В /usr/local/etc/openvpn/ccd при создании файла с настройками для клиента помните:

 ifconfig-push 192.168.25.2 192.168.25.1

этой сторокой организовуем ehernet tun с сетью /30 ip 192.168.25.2 шлюз 192.168.25.1

соответственно при создании 2-го, 3-го и т.д. клиента - строка должна принимать вид

 gate:/etc/openvpn/ccd# cat client2
 ifconfig-push 192.168.25.6 192.168.25.5

и т.п. На подсети делим следующей командой:

 gate:/etc/openvpn/ccd# sipcalc 192.168.25.0/24 -s 30

Клиент

что мы отдаем клиенту:

 # ls client1
 ca.crt
 client1.crt
 client1.key
 dh1024.pem
 openvpn.ovpn
 ta.key

Сам клиентский конфиг:

 gate:~/openvpn-keys/client1# cat openvpn.ovpn
 dev tun
 proto udp
 remote SERVER-REMOTE-IP
 client
 resolv-retry infinite
 ca ca.crt
 cert client1.crt
 key client1.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
 ping 5
 ping-restart 25

Сервер

 # cd /etc/openvpn
 gate:/etc/openvpn# tree
 .
 |-- ccd
 |   |-- client1
 |   |-- client10
 |   |-- client2
 |   |-- client3
 |   |-- client4
 |   |-- client5
 |   |-- client6
 |   |-- client7
 |   |-- client8
 |   `-- client9
 |-- keys
 |   |-- ca.crt
 |   |-- dh1024.pem
 |   |-- server.crt
 |   |-- server.key
 |   `-- ta.key
 |-- server.conf
 `-- update-resolv-conf

Сам Конфиг сервера:

 gate:/etc/openvpn# cat server.conf
 # protocol udp/tcp
 proto udp
 dev tun0
 
 ca /etc/openvpn/keys/ca.crt
 cert /etc/openvpn/keys/server.crt
 key /etc/openvpn/keys/server.key
 dh /etc/openvpn/keys/dh1024.pem
 #Server virtual network
 server 192.168.25.0 255.255.255.0
 
 #routes to client (routes to corporate LAN)
 
 push "route 192.168.20.0 255.255.255.0"
 push "route 192.168.21.0 255.255.255.0"
 
 client-config-dir ccd
 
 # server-client route
 route 192.168.25.0 255.255.255.252
 
 tls-server
 # tls-key, 0 4 server, 1 4 client
 tls-auth keys/ta.key 0
 
 tls-timeout 120
 auth MD5 #
 
 cipher BF-CBC
 keepalive 10 120
 comp-lzo
 
 max-clients 100
 user nobody
 group nogroup
 persist-key
 persist-tun
 status /var/log/openvpn/openvpn-status.log
 log /var/log/openvpn/openvpn.log
 verb 3


Конфиги все с продакшн сервера. Так что в работоспособности вышеупомянутой конфигурации я более чем уверен.

Дистрибутив openvpn под windows тянем отсюда. http://openvpn.net/index.php/open-source/downloads.html

Кстати, можно построить openvpn с ldap аутентификацией и 'failover конфиг openvpn будет автоматически переключаться к другим серверам. Failover конфиг тоже в продакшн использую вместе с LDAP.

В клиентском конфиге пишем нечто подобное.

 #Server1
 <connection>
 remote server1.com 1194
 proto tcp-client
 </connection>
 
 #Server2
 <connection>
 remote server2.com 1194
 proto udp
 </connection>
 
 #Server3
 <connection>
 remote server3.com 1194
 proto udp
 </connection>

Сначала тоннель устонавливается с первым сервером. Канал пингуется если пропадает, рестартуется подключается к следующему серверу.

 ping 5
 ping-restart 25

Это тоже оттестировано и работает.