среда, 30 октября 2013 г.

Установка сервера OpenVPN на Debian Squeeze.

Исходные данные:
Машинка с двумя интерфейсами eth0 – смотрит в нет и имеет «белый IP»(a.b.c.d), eth1 – смотрит в локаль 192.168.8.0/24.
А еще есть локальная сеть в которой есть 3 подсети(маршрутизатором выступает 192.168.11.11/22):
192.168.10.0
192.168. 11.0
192.168.15.0
И есть базовая установка Debian Squeeze, без каких-либо специфических пакетов.
Что мы хотим ? Мы хотим сидя дома работать, например через RDP на удаленном сервере, иметь доступ в корпоративный джабер и к корпоративной почте, иметь возможность поключиться радмином к клиентам на работе и заходит на веб-интерфейсы устройств в подсети 15. 



Установим OpenVPN, Midnight Commander и ssh:
# aptitude install openvpn mc ssh
Скопируем скрипты из папки /usr/share/doc/openvpn/examples/easy-rsa/, которые устанавливаются вместе с OpenVPN, в папку /etc/openvpn. Они помогут нам создать сертификаты:
# cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
Отредактируем файл с переменными:
# nano /etc/openvpn/easy-rsa/2.0/vars
Зададим размер ключа (чем больше, тем лучше и тем медленнее будет работать, ну и не рекомендую ставить 4096 например, поту что build-dh потом будет выполняться несколько часов):
export KEY_SIZE=1024
Зададим время, через которое понадобится обновить ключи(в днях):
export KEY_EXPIRE=365
Зададим параметры генерации SSL сертификата: информация о владельце сертификата
export KEY_COUNTRY="UA"
export KEY_PROVINCE="KS"
export KEY_CITY="Kherson"
export KEY_ORG="Work"
export KEY_EMAIL="postmaster@example.com"
Загрузим все переменные:
# cd /etc/openvpn/easy-rsa/2.0/
# . ./vars
Эта команда удаляет все сертификаты, которые были сгенерированы ранее (ну вдруг это не первая попытка):
# . ./clean-all
Создаём центр сертификации. Это очень важный файл и крайне рекомендуется сохранить получившиеся файлы ещё где-нибудь. С помощью центра сертификации производится подписывание генерируемых сертификатов и подключится с сертификатом от другого центра не получится, даже если у него будут одинаковые параметры генерации.
# . ./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) [UA]:
State or Province Name (full name) [KS]:
Locality Name (eg, city) [Kherson]:
Organization Name (eg, company) [Work]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [output-meta]:openvpn.loc
Name []:Mike Alohin
Email Address [postmaster@example.com]:
Создаём сертификат сервера, с его помощью будет производится проверка, что сервер это тот именно сервер.
# . ./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) [UA]:
State or Province Name (full name) [KS]:
Locality Name (eg, city) [Kherson]:
Organization Name (eg, company) [Work]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:server.openvpn.loc
Name []:server.openvpn.loc
Email Address [postmaster@example.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
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'UA'
stateOrProvinceName   :PRINTABLE:'KS'
localityName          :PRINTABLE:'Kherson'
organizationName      :PRINTABLE:'Work'
commonName            :PRINTABLE:'server.openvpn.loc'
name                  :PRINTABLE:'server.openvpn.loc'
emailAddress          :IA5STRING:'postmaster@example.com'
Certificate is to be certified until Aug 19 10:34:03 2013 GMT (365 days)
Sign the certificate? [y/n]:y
Далее необходимо сгенерировать параметры Диффи-Хеллмана, это займёт очень много времени если у вас не 1024, а 4096 бит (у меня заняло около двух часов), сходите попейте чаю, можете даже на обед сходить:
# . ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.........+..........................................................................................+.............................................+.......................+....................+.....+..+.................++*++*++*
Копируем получившиеся сертификаты в папку /etc/openvpn:
# cp /etc/openvpn/easy-rsa/2.0/keys/{ca,server}.{crt,key} /etc/openvpn
# cp /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem /etc/openvpn
Сделаем конфигурационный файл сервера OpenVPN:
# zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
# nano /etc/openvpn/server.conf
Раскомментируем эти строчки, a.b.c.d заменим на IP адрес, который соответствует интерфейсу с белым IP:
;local a.b.c.d
;push "redirect-gateway def1 bypass-dhcp"
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
DNS серверы можете указать свои. Опция redirect-gateway def1 указывает на то, что весь трафик после подключения должен идти через VPN.
Уберём лишние символы в файле /etc/openvpn/server.conf:
# egrep -v '^;|^#|^$' /etc/openvpn/server.conf

Должен получится такой файл:
local a.b.c.d //Белый адрес
port 1194 //Порт на котором работает сервер
proto udp //Протокол, по которому работает сервер
dev tun //Тип работы сервера
ca ca.crt
cert server.crt //сертификат сервера
key server.key  //ключ сервера(держим в секрете)
dh dh1024.pem //параметры Диффи-Хеллмана
server 10.8.0.0 255.255.255.0 //пул адресов клиентов
ifconfig-pool-persist ipp.txt //файл, в котором будет описан пул ip для каждого клиента(создется автоматически)
push "redirect-gateway def1 bypass-dhcp" //после подключения вес траффик клиента будет идти через туннель
push "dhcp-option DNS 208.67.222.222" //DNS-сервера для клиента. Можно прописать свои
push "dhcp-option DNS 192.168.10.2"
push "dhcp-option DNS 192.168.10.3"
keepalive 10 120 // проверка состояния канала каждые 10 сек. Если в течении 120 сек. нет ответа, считается, что канал упал
comp-lzo //сжимать передаваемый траффик
persist-key //Не перечитывать ключи
persist-tun //Постоянный туннель
status openvpn-status.log //файлик, в котором будем хранить лог
verb 3 //уровень детализации логов

Перезапустим openvpn подключение.
# service openvpn restart
Теперь настроим перенаправление запросов из нашего тунеля в сеть:
# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p
# iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
# iptables -A FORWARD -j REJECT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j MASQUERADE
Разрешим доступ по udp к порту 1194:
# iptables -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
Сохраняем их и настраиваем автозапуск:
# iptables-save > /etc/iptables.up.rules
# cat /etc/network/if-up.d/iptables
#!/bin/sh
iptables-restore < /etc/iptables.up.rules
# chmod u+x /etc/network/if-up.d/iptables
По-поводу iptables – данную конфигурацию было успешно опробовано, но захотелось большего:
Делаем файл:  #nano /usr/local/bin/iptables.rules
Наполняем таким содержанием:
#!/bin/bash
IPT=/sbin/iptables
#очищаем все таблицы
$IPT -t nat -F
$IPT -t filter -F
$IPT -t mangle -F
#закрываем всё
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
#разрешаем пинги
$IPT -A INPUT -p icmp -j ACCEPT
$IPT -A OUTPUT -p icmp -j ACCEPT
$IPT -A FORWARD -p icmp -j ACCEPT

#разрешаем порт 1194
iptables -A INPUT -p udp -m udp -i eth0 --dport 1194 -j ACCEPT
iptables -A OUTPUT -p udp -m udp -o eth0 --dport 1194 -j ACCEPT
#разрешаем хождение по локалке
$IPT -A INPUT -p all -i eth1 -s 192.168.8.0/22 -j ACCEPT
$IPT -A OUTPUT -p all -o eth1 -d 192.168.8.0/22 -j ACCEPT
#разрешаем трафик внутри сервера
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#разрешаем все ранее установленные соединения
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.8.0/22 -j SNAT --to-source 192.168.10.37
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.10.37
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.15.0/24 -j SNAT --to-source 192.168.10.37
iptables -A FORWARD -s 10.8.0.0/24 -d 192.168.8.0/22 -j ACCEPT
iptables -A FORWARD -d 10.8.0.0/24 -s 192.168.8.0/22 -j ACCEPT
iptables -A INPUT -s 10.8.0.6/32 -d 192.168.10.37 -p all -j ACCEPT
iptables -A OUTPUT -d 10.8.0.6/32 -s 192.168.10.37 -p all -j ACCEPT
#разрешаем всем шариться на удаленный сервер 192.168.0.6
iptables -A FORWARD -s 10.8.0.0/24 -d 192.168.0.6/32 -j ACCEPT
iptables -A FORWARD -d 10.8.0.0/24 -s 192.168.0.6/32 -j ACCEPT
#разрешаем 10.8.0.6 подключаться к юнитам 15-й подсети
iptables -A FORWARD -s 10.8.0.6/32 -d 192.168.15.0/24 -j ACCEPT
iptables -A FORWARD -d 10.8.0.6/32 -s 192.168.15.0/24 -j ACCEPT
#разрешаем 10.8.0.14(gatto) подключаться в юнитам 15-й подсети
iptables -A FORWARD -s 10.8.0.14/32 -d 192.168.15.0/24 -j ACCEPT
iptables -A FORWARD -d 10.8.0.14/32 -s 192.168.15.0/24 -j ACCEPT
#разрешаем 10.8.0.34(toshik) подключаться в юнитам 15-й подсети
iptables -A FORWARD -s 10.8.0.34/32 -d 192.168.15.0/24 -j ACCEPT
iptables -A FORWARD -d 10.8.0.34/32 -s 192.168.15.0/24 -j ACCEPT
#разрешаем всем хождение в Инет по некоторым портам
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -p tcp -m multiport --dport 80,8080,443,5938,9997,25,110,465 -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT

Делаем файл исполнительным:
#chmod u+x /usr/local/bin/iptables.rules

Делаем автозапуск: приводим файл /etc/rc.local к следующему виду:
[ -x /usr/local/bin/iptables.rules ] && /usr/local/bin/iptables.rules
Exit 0
Сервер готов.=) sudo reboot



Делаем клиента OpenVPN (Windows!)
Создадим ключи для клиента:
# cd /etc/openvpn/easy-rsa/2.0/
# ./build-key user
Generating a 1024 bit RSA private key
......................................................................++++++
.++++++
writing new private key to 'user.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) [UA]:
State or Province Name (full name) [KS]:
Locality Name (eg, city) [Kherson]:
Organization Name (eg, company) [Work]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:user.openvpn.loc
Name []:
Email Address [postmaster@example.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
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'UA'
stateOrProvinceName   :PRINTABLE:'KS'
localityName          :PRINTABLE:'Kherson'
organizationName      :PRINTABLE:'Work'
commonName            :PRINTABLE:'user.openvpn.loc'
name                  :PRINTABLE:''
emailAddress          :IA5STRING:'postmaster@example.com'
Certificate is to be certified until Aug 19 10:34:03 2013 GMT (365 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

Устанавливаем на клиентскую машину OpenVPN клиент: при установке клиента ставим все галочки и применяем исключение безопасности(Vista и младше). Идём в C:\Program Files\OpenVPN\config и создаем файл конфигурации client.ovpn примерно следующего содержания:
client
dev tun
proto udp
remote a.b.c.d 1194
resolv-retry infi nite
persist-key
persist-tun
ca c:\\vpn\\ca.crt
cert c:\\vpn\\user.crt
key c:\\vpn\\user.key
comp-lzo
verb 3
route-method exe
route-delay 2

Где, a.b.c.d меняем на белый адрес нашего сервера.
Создаем папочку папку C:\VPN и ложим туда файлики сгенерированных сертификатов, предварительно скачав их с сервера: ca.crt, user.crt, user.key.
Можно запускать нашего клиента.

Отзыв сертификата клиента с именем wks-1:
# cd /etc/openvpn/easy-rsa
# source ./vars
# ./revoke-full wks-1
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Revoking Certificate 01.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
error 23 at 0 depth lookup:certificate revoked

Последняя строка с ошибкой означает успешный отзыв сертификата