Исходные
данные:
Машинка с
двумя интерфейсами 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.
# 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
Последняя
строка с ошибкой означает успешный отзыв сертификата
Комментариев нет:
Отправить комментарий