вторник, декабря 13, 2011

CentOS 6.2+OpenVPN 2.2.1+iptables v1.4.7+SELinux

Отличный рабочий инструмент для удаленного администрирования сетей. Исходим из следующей конфигурации:

INTERNET --- eth0 (XXX.XXX.XXX.XXX) | eth1 (192.168.X.1) --- LAN (192.168.X.0/24)

Минимальная CentOS 6.2, iptables v1.4.7 и selinux (Policy v.24) установлены по умолчанию. Установим и настроим OpenVPN Server на работу по протоколоу UDP и порту YYYY.

1. Обновляем CentOS 6.2
# yum update

2. Подключаем репозиторий EPEL к yum

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-5.noarch.rpm

3. Устанавливаем OpenVPN
# yum --enablerepo=epel -y install openvpn
# openvpn --version

OpenVPN 2.2.1 x86_64-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Sep 12 2011

4. Копируем примеры файлов конфигураций из пакета в /etc/openvpn
# cp /usr/share/doc/openvpn-*/sample-config-files/server.conf /etc/openvpn/

5. Редактируем конфигурацию
# vi /etc/openvpn/server.conf
Меняем/добавляем следующие строчки
     32 port YYYY     
     53 dev tun0   
     78 ca /etc/openvpn/easy-rsa/keys/ca.crt
     79 cert /etc/openvpn/easy-rsa/keys/server.crt
     80 key /etc/openvpn/easy-rsa/keys/server.key  # This file should be kept secret
     87 dh /etc/openvpn/easy-rsa/keys/dh1024.pem
    138 push "route 192.168.X.0 255.255.255.0" # Наша внутреняя сеть
    276 status     /var/log/openvpn-status.log
    285 log         /var/log/openvpn.log
    286 log-append  /var/log/openvpn.log
Сохраняем

6. Копируем пакет управления RSA ключами из поставки OpenVPN в /etc/openvpn/easy-rsa, копируем файл openssl-1.0.0.cnf в openssl.cnf и создаем папку keys
# cp -R /usr/share/openvpn/easy-rsa/2.0 /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
# cp openssl-1.0.0.cnf openssl.cnf
# mkdir keys

7.  Редактируем поля по умолчанию для вновь создаваемых сертификатов 
# vi vars
     63 # Don't leave any of these fields blank.
     64 export KEY_COUNTRY="RU"
     65 export KEY_PROVINCE="RU"
     66 export KEY_CITY="DefaultCity"
     67 export KEY_ORG="DefaultCompany"
     68 export KEY_EMAIL="hi@defaultcompany.com"
     69 export KEY_EMAIL=hi@defaultcompany.com
     70 export KEY_CN=vpn.defaultcompany.com
     71 export KEY_NAME=changeme
     72 export KEY_OU=MainOffice

8. Выполняем скрипт установки переменных
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

9. Чистим папку с ключами
# ./clean-all

10. Генерируем сертификат и ключ для своего центра сертификации
# ./build-ca
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]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Common Name (eg, your name or your server's hostname) [vpn.defaultcompany.com]:  # введи FQDN
Name []: server-ca # укажи к примеру server-ca
Email Address [hi@defaultcompany.com]:
11. Генерируем сертификат и ключ для сервера
# ./build-key-server server
Generating a 1024 bit RSA private key
........++++++
.......++++++
writing new private key to 'server.key'
-----
...
-----
Country Name (2 letter code) [RU]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Common Name (eg, your name or your server's hostname) [vpn.defaultcompany.com]:  # введи FQDN
Name []: server # укажи к примеру server
Email Address [hi@defaultcompany.com]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
...............
Certificate is to be certified until Jul 12 09:30:07 2021 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

12. Генерируем параметр DH
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

13. Генерируем сертификат и ключ для клиента employee01
# ./build-key-pass employee01
Generating a 1024 bit RSA private key
..................++++++
..................++++++
writing new private key to 'client.key'
Enter PEM pass phrase: # установи пароль
Verifying - Enter PEM pass phrase: # повтори пароль
-----
...
-----
Country Name (2 letter code) [RU]: # Ввод
State or Province Name (full name) [RU]: # Ввод
Locality Name (eg, city) [DefaultCity]: # Ввод
Organization Name (eg, company) [DefaultCompany]: # Ввод
Organizational Unit Name (eg, section) [MainOffice]: # Ввод
Common Name (eg, your name or your server's hostname) [vpn.defaultcompany.com]: employee01  # введи наименование клиента
Name []: employee01 # укажи наименование клиента
Email Address [hi@defaultcompany.com]: employee01@defaultcompany.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
...
Certificate is to be certified until Jul 12 09:31:14 2021 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

14. Устанавливаем утилиты управления SELinux
# yum -y install policycoreutils-python

15. Разрешаем udp на порту YYYY в SELinux
# semanage port -a -t openvpn_port_t -p udp YYYY

16. В iptables перед строчками, запрещающими все INPUT и FORWARD

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
пишем

#************* eth0:YYYY (openvpn)
-A INPUT -i eth0 -p udp --dport YYYY -j ACCEPT # Заменяем порт YYYY на нужный
-A INPUT -i tun0 -s 10.8.0.0/24 -d 192.168.X.1 -j ACCEPT # 10.8.0.0 может быть изменена в конфигурации OpenVPN
-A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.X.0/24 -j ACCEPT
-A FORWARD -i eth1 -o tun0 -s 192.168.X.0/24 -d 10.8.0.0/24 -j ACCEPT
#

17. Рестартим iptables
# service iptables restart

18. Запускаем openvpn
# service openvpn start

19. Проверяем что сервис открыл порт
# netstat -nlp | grep YYYY

20. Ставим OpenVPN в автозапуск
# chkconfig openvpn on

Теперь настраиваем клиента на Windows 7

21. Скачиваем клиента по адресу  http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe

22. Забираем файлы сервера
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/employee01.crt
/etc/openvpn/easy-rsa/keys/employee01.key
и помещаем их в папку config инсталляции OpenVPN (C:\Program Files (x86)\OpenVPN\config)

23. Создаем файл конфигурации employee01.ovpn
client
dev tun0
proto udp
remote XXX.XXX.XXX.XXX YYYY # Замени на IP и порт
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert employee01.crt
key employee01.key
ns-cert-type server
comp-lzo
verb 3


24. Запускаем OpenVPN клиента, на трее меню connect


Примечания
A) Если клиент запускается не под администратором и в логах клиента вы видите что типа
Tue Jan 10 11:22:07 2012 NOTE: FlushIpNetTable failed on interface [19] {57E7BDA3-3906-4728-9E60-D6A1F3057423} (status=5) : Отказано в доступе.
Значит не хватает прав и нужно запускать под администратором (запуск от имени, run as)

B) Клиентская конфигурация поддерживает относительные пути и если у вас много разных openvpn серверов и вы хотите разнести ключи и сертификаты по папкам, на к клиентской конфигурации вполне можно указывать

ca "sever01\\ca.crt"
cert "server01\\employee01.crt"
key "server01\\employee01.key"
Пути будут относительно местоположения файла конфигурации, то есть относительно папки config инсталляции OpenVPN (например C:\Program Files\OpenVPN\config)


C) Чтобы в логах сервера /var/log/openvpn.log постоянно не сыпалось сообщение
"Need IPv6 code in mroute_extract_addr_from_packet" необходимо для виртуального сетевого адаптера TAP-Win32 Adapter V9 убрать галку напротив использования протокола IP v6.

D) Если на сервере используется директива ifconfig-pool-persist /etc/openvpn/ipp.txt, при включенном SELinux и в логах ловите
Note: cannot open ipp.txt for READ/WRITE
пробуйте
# restorecon -v './ipp.txt'

E) Если в целях совместимости с предыдущими версиями OpenVPN вы захотите оставить его на порту 5000, прийдется создавать модуль для SELinux.  Об этом другая заметка http://www.olegsmith.com/2011/12/selinux-openvpn-5000.html

Использованные материалы
Install/Configure OpenVPN
http://www.server-world.info/en/note?os=CentOS_6&p=openvpn

1 комментарий:

sky_radio комментирует...

Jan 22 20:35:50 LXGATE-RAS openvpn[23513]: Options error: You must define TUN/TAP device (--dev)
Jan 22 20:35:50 LXGATE-RAS openvpn[23513]: Use --help for more information.
Вот такую фигню пишет.. CentOS 5.6 x86-64

Мой список блогов