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
Итак что нам надо.
- ca.crt - Главный CA сертификат, этот файл нужен и клиенту и серверу
- dh1024.pem - ключ Диффи Хельман, этот файл нужен только серверу
- server.crt - Сертификат сервера, нужен только серверу
- server.key - Ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
- client1.crt - Сертификат клиента, нужен только клиенту
- client1.key - Ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)
- 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
Это тоже оттестировано и работает.