пятница, 10 декабря 2010 г.

OpenVPN туннель L3 Fedora 14 ключ pkcs12

Рабочие конфиги, вроде ;)

За основу взята статья с www.lissyara.su
становка и настройка OpenVPN с ключом pkcs12",
находящаяся по адресу http://www.lissyara.su/?id=2111

Что имеется:
Компьютер (гордо буду его именовать в дальнейшем сервером), под управлением RFRemix 14, подключение к Интернету через ADSL-модем, который настроен в режиме роутера с DHCP, плюс на модеме активирована функция работы с DynDNS, т.о. модем видится из Интернета по адресу вида XYZ.dyndns.org , так же на модеме включён форвардинг порта 1194 на первый адрес из диапазона адресов, выдаваемых DHCP, таким образом из-за того что к модему подключен только один физический компьютер, то он и получает этот адрес, даже после перезагрузки.
адрес модема (шлюз) : 192.168.54.1/255.255.255.0
адрес сервера             : 192.168.54.33/255.255.255.0

Что нужно:
Временами подключать клиентские компьютеры или сети для того, чтобы их админить, не выходя из дома. Клиенты должны иметь доступ не только к ресурсам сервера, но и видеть друг друга, т.к. не исключается возможность, что админить клиентские компьютеры я буду не из дома (с сервера), а из какого-либо другого места, например, лёжа на пляжу с ноутбуком.

Порядок действий:
0. Установка openvpn
1. Создание ключей для сервера.
2. Создание конфига для сервера.
3. Создание ключей для клиентов и меня.
4. Создание конфигов для клиентов и меня.
5. Настройка файрволлов.
6. Устраняем возможные проблемы.

0. Установка openvpn.
От рута (тут и далее, короче, всё нужно делать от рута):
yum install openvpn
Создаем директории для OpenVPN сервера где будут храниться настройки клиентов, ключи, сертификаты и скрипты для их создания и логи:
mkdir /etc/openvpn/ccd
mkdir /etc/openvpn/keys
mkdir /etc/openvpn/easy-rsa
mkdir /var/log/openvpn/
touch /var/log/openvpn/openvpn-status.log
touch /var/log/openvpn/openvpn.log

1. Создание ключей для сервера.
Копируем скрипты для создания ключей:
cp /usr/share/openvpn/easy-rsa/2.0/* /etc/openvpn/easy-rsa
Редактируем файл с переменными:
vim /etc/openvpn/easy-rsa/vars
Меняем строку
export KEY_DIR="$EASY_RSA/keys"
на
export KEY_DIR="$EASY_RSA/keys/server"
и ещё правим строки:
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
на примерно такого вида
export KEY_COUNTRY="RU"
export KEY_PROVINCE="64"
export KEY_CITY="Saratov"
export KEY_ORG="Roga-Kopyta"
export KEY_EMAIL="me@yandex.ru"
Меняем права на файлы
chmod 544 /etc/openvpn/easy-rsa/*
Создаем директорию куда у нас будут создаваться/храниться ключи и сертификаты
mkdir -p /etc/openvpn/easy-rsa/keys/server
Готовимся к генерации ключей
cd /etc/openvpn/easy-rsa
. ./vars
Вылазит предупреждение:
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys/server
./clean-all

Создаем ключи для сервера OpenVPN
Создаем 2 ключа (ca.key и dh1024.pem) и по 1 ключу/сертификату (server.key и server.crt) только для сервера OpenVPN и дополнительный ключ (ta.key) для сервера и клиента.
Создаем их один раз и навсегда.
Создаем 1-ый ключ Certificate Authority
./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) [64]:
Locality Name (eg, city) [Saratov]:
Organization Name (eg, company) [Roga-Kopyta]:
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [Roga-Kopyta CA]:server
Name []:server
Email Address [me@yandex.ru]:
Создаем сертификат X.509:
./build-key-server server
Вылезет сообщение и несколько вопросов:
 Generating a 1024 bit RSA private key
...................................++++++
..............................++++++
writing new private key to 'server.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) [64]:
Locality Name (eg, city) [Saratov]:
Organization Name (eg, company) [Roga-Kopyta]:
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [server]:
Name []:server
Email Address [me@yandex.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:server
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'64'
localityName          :PRINTABLE:'Saratov'
organizationName      :PRINTABLE:'Roga-Kopyta'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'me@yandex.ru'
Certificate is to be certified until Dec  7 17:41:29 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


Генерируем 1024 битный ключ с помощью алгоритма Диффи Хеллмана
./build-dh
Вылезет сообщение типа такого, но длиннее:
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
....................+....................+.........................................+............+......++*++*++*

Создаем TLS-ключ (который нужен как и серверу, так и клиенту)
openvpn --genkey --secret keys/server/ta.key

Копируем ключи:
cp keys/server/ca.crt /etc/openvpn/keys/
cp keys/server/server.crt /etc/openvpn/keys/
cp keys/server/server.key /etc/openvpn/keys/
cp keys/server/dh1024.pem /etc/openvpn/keys/
cp keys/server/ta.key /etc/openvpn/keys/
Получим следующий список файлов которые нужны для работы сервера:ls /etc/openvpn/keys
ca.crt  dh1024.pem  server.crt  server.key  ta.key


2. Создание конфигурационного файла для сервера.

vim /etc/openvpn/server.conf
# указываем на каком локальном интерфейсе OpenVPN будет слушать
# по умолчанию OpenVPN слушает все интерфейсы
#local xxx.xxx.xx.x

# порт на котором работает сервер
port 1194

# протокол - TCP или UDP
proto udp

# используемый тип устройства и номер
dev tun0

# указываем по каким интерфейсам можно подключаться к OpenVPN по telnet
# указывать нужно IP адреса интерфейсов сервера
management localhost 8329

# указываем файл CA
ca /etc/openvpn/keys/ca.crt

# указываем файл с сертификатом сервера
cert /etc/openvpn/keys/server.crt

# указываем файл с ключем сервера
key /etc/openvpn/keys/server.key

# указываем файл с генерированный алгоритмом Диффи Хеллмана
dh /etc/openvpn/keys/dh1024.pem

# указываем где находится файл отозванных сертификатов
#crl-verify /etc/openvpn/crl.pem

# задаем IP-адрес сервера и маску подсети (виртуальной сети)
server 10.10.100.0 255.255.255.0

# указываем внутренний DNS и WINS сервер
#push "dhcp-option DNS 192.168.0.1"
#push "dhcp-option DNS 192.168.0.10"
#push "dhcp-option WINS 192.168.0.1"

# задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он "видел"
# сеть за OpenVPN сервером
# Локалка сервера
push "route 192.168.54.0 255.255.255.0"
# Клиент №1
push "route 192.168.1.0 255.255.255.0"
# Клиент №2
push "route 192.168.2.0 255.255.255.0"
# Клиент №3
push "route 192.168.3.0 255.255.255.0"

# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd

# добавляем маршрут сервер-клиент
route 10.10.100.0 255.255.255.252
# Клиент №1
route 192.168.1.0 255.255.255.0
# Клиент №2
route 192.168.2.0 255.255.255.0
# Клиент №3
route 192.168.3.0 255.255.255.0

# делает сервер OpenVPN основным шлюзом
#push "redirect-gateway def1"

# разрешает видеть клиентам друг друга (по виртуальным IP)
# по умолчанию клиенты видят только сервер
client-to-client

# разрешать подключаться с одинаковым сертификатом/ключом
#duplicate-cn

# включаем TLS аутентификацию
tls-server

# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0

# TLS таймаут, полезен если выход в интернет осуществляется
# через GPRS мобильных операторов
tls-timeout 120

# выбираем алгоритм хеширования
# по умолчанию используется SHA1
# выбирать вам какой использовать (SHA1, MD5 итд итп)
# вывод полного списка openvpn --show-digests
auth SHA1

# выбираем алгоритм шифрования пакетов
# по умолчанию используется/рекомендуется BF-CBC
# вывод полного списка openvpn --show-ciphers
cipher BF-CBC

# проверяет активность подключения каждые 10 секунд,
# если в течении 120 сек. нет ответа, подключение закрывается
keepalive 10 120

# сжатия трафика с помощью библиотеки LZO
comp-lzo

# максимальное количество одновременных соединений/количество клиентов
max-clients 3

# от какого пользователя и группы работает OpenVPN
user nobody
group nobody

# не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key

# не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun

# путь к файлу записи статуса OpenVPN в лог
status /var/log/openvpn/openvpn-status.log

# путь к файлу записи событий происходящих на сервере
# "log" - запись событий в лог будет перезаписываться при перезагрузке демона
# "log-append" - запись событий будет добавляться в лог
log /var/log/openvpn/openvpn.log

# уровень информации для отладки
# 0 -- quiet except for fatal errors.
# 1 -- mostly quiet, but display non-fatal network errors.
# 3 -- medium output, good for normal operation.
# 9 -- verbose, good for troubleshooting
verb 3

# макс кол-во однотипных записей в лог
#mute 20

Пробуем запустить сервер:
/etc/init.d/openvpn start
Должно вылезти сообщение:
Запускается openvpn:                                       [  OK  ]

Добавляем в автозапуск:
chkconfig --level 2345 openvpn on



3. Создание ключей для клиентов и меня.
Переходим в директорию и создаем ключи для филиалов №1,2,3:
filial1.p12, filial2.p12, filial3.p12
pkcs12 имя файла в формате PKCS#12, содержащего сертификат CA, ключ и сертификат клиента. Такой файл и команда заменяют сразу 3 соответствующих файла и команды - .ca, .cert, .keycd /etc/openvpn/easy-rsa
Создаем ключ для клиента №1
./build-key-pkcs12 klient1
Вылазит сообщение и вопросы:
Generating a 1024 bit RSA private key
................++++++
.......++++++
writing new private key to 'klient1.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) [64]:
Locality Name (eg, city) [Saratov]:
Organization Name (eg, company) [Roga-Kopyta]:
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) [klient1]:
Name []:klient1
Email Address [me@yandex.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:klient1
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'64'
localityName          :PRINTABLE:'Saratov'
organizationName      :PRINTABLE:'Roga-Kopyta'
organizationalUnitName:PRINTABLE:'server'
commonName            :PRINTABLE:'klient1'
name                  :PRINTABLE:'klient1'
emailAddress          :IA5STRING:'me@yandex.ru'
Certificate is to be certified until Dec  7 19:08:51 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
Enter Export Password:
Verifying - Enter Export Password:

Кстати, на все запросы паролей я отвечал простым нажатием Enter.



Создаем ключ для клиента №2
./build-key-pkcs12 klient2
Опятьже вылазит сообщение с вопросами

Создаем ключ для клиента №3
./build-key-pkcs12 klient3
Опятьже вылазит сообщение с вопросами

Создаем ключ для себя
./build-key-pkcs12 sysadmin
Опятьже вылазит сообщение с вопросами

Проверяем
ls /etc/openvpn/easy-rsa/keys/server | grep .p12
Должно быть так
klient1.p12
klient2.p12
klient3.p12
sysadmin.p12

В директории /etc/openvpn/ccd создаем файлы с настройками для клиентов и меня такого содержания:
ifconfig-push виртуальный IP клиента
iroute какая подсеть за клиентом


vim /etc/openvpn/ccd/klient1
ifconfig-push 10.10.100.2 10.10.100.1
iroute 192.168.1.0 255.255.255.0


vim /etc/openvpn/ccd/klient2
ifconfig-push 10.10.100.6 10.10.100.5
iroute 192.168.2.0 255.255.255.0

vim /etc/openvpn/ccd/klient3
ifconfig-push 10.10.100.10 10.10.100.9
iroute 192.168.3.0 255.255.255.0

vim /etc/openvpn/ccd/sysadmin
ifconfig-push 10.10.100.14 10.10.100.13


Перезапустим OpenVPN Сервер
/etc/init.d/openvpn restart
Останавливается openvpn:                                   [  OK  ]
Запускается openvpn:                                       [  OK  ]
Проверяем
ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 
          inet addr:10.10.100.1  P-t-P:10.10.100.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


4. Создание конфигов для клиентов и меня.
Настройка OpenVPN у клиента №1 (Windows XP)
Скачиваем отсюда http://openvpn.net/index.php/open-source/downloads.html и устанавливаем программу.
Копируем с сервера ключи klient1.p12 и ta.key в директорию C:\Program Files\OpenVPN\config
Далее создаем конфиг C:\Program Files\OpenVPN\config\klient1.ovpn
dev tun
proto udp
# адрес сервера
remote XYZ.dyndns.org
port 1194
client
resolv-retry infinite
pkcs12 klient1.p12
tls-client
tls-auth ta.key 1
auth SHA1
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
verb 3


5. Настройка файрволлов. 
Включение маршрутизации на сервере
echo "1" > /proc/sys/net/ipv4/ip_forward 
На файрволле сервера нужно открыть порт 1194, делал это через
system-config-firewall
Ну и сделать доверенным интерфейс tun

На клиенте №1 отключаем файрволл на виртуальном адаптере, либо настраиваем исключения, короч, нужно там поковыряться.
Компьютер пингуется по адресу 192.168.1.2

6. Устраняем возможные проблемы.
Про проблемы, которые вылазили у меня.
Если у клиента виндовый OpenVPN-GUI, то вполне может возникнуть проблема с маршрутизацией на его стороне. Случается из-за того, что он запускается от пользователя с ограниченными правами, соответственно не добавляются маршруты, но соединение устанавливается. В логах у клиента будет примерно следуюющее:
Sat Dec 11 23:28:49 2010 C:\WINDOWS\system32\route.exe ADD 192.168.2.0 MASK 255.255.255.0 10.10.100.1
Sat Dec 11 23:28:49 2010 ROUTE: route addition failed using CreateIpForwardEntry: ��� ������� � ����.   [status=65 if_index=3]
Sat Dec 11 23:28:49 2010 Route addition via IPAPI failed [adaptive]
Sat Dec 11 23:28:49 2010 Route addition fallback to route.exe
Бороться с этим можно разными способами, но ИМХО два самых правильных (выбирать исходя из обстановки):
1.Добавить автозапуск OpenVPN как сервиса, по умолчанию там у него стоит ручной запуск (если нужно постоянное соединение).
2.Воспользоваться программкой Admilink для создания ярлыка запуска OpenVPN-GUI с правами администратора (если нужно подключиться время от времени). Категорически не рекомендую использовать стандартное виндовое "ru as" - небезопасно.


Так же может случиться так, что клиент не коннектиться, при этом в логах у него ботва такого плана:

Incoming packet rejected from 79.126.91.149:10044[2], expected peer address: 79.126.91.149:1194 (allow this incoming source address/port by removing --remote or adding --float)
Лечиться добавление параметра --float в скрипт запуска OpenVPN на стороне сервиса. В федоре нужно подправить файл /etc/init.d/openvpn
В секции # Start every .conf in $work and run .sh if exists должно стать так (одна строка):

$openvpn --float --daemon --writepid $piddir/$bn.pid --config $c --cd $work $script_security
В этом же файле можно заодно раскомментировать строку

echo 1 > /proc/sys/net/ipv4/ip_forward

Ну, блин, дошло, вроде, да...

Комментариев нет:

Отправить комментарий