CentOS OpenVPN

OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL.

Подключаем репозиторий Epel

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

Устанавливаем OpenVPN

# yum -y install openvpn

Добавляем в автозагрузку

# chkconfig openvpn on

Копируем набор скриптов для генерации скриптов и сертификатов

# cp -R /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/

Редактируем файл /etc/openvpn/2.0/vars

export KEY_COUNTRY="UA"
export KEY_PROVINCE="OD"
export KEY_CITY="Odessa"
export KEY_ORG="bezha.od.ua"
export KEY_EMAIL="vitaliy@bezha.od.ua"

Инициализируем переменные

# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/2.0/keys

Очищаем директорию keys

# ./clean-all

Создаем сертификат и ключ CA путём интерактивного вызова команды ./build-ca

# ./build-ca
Generating a 1024 bit RSA private key

Создаем сертификат и ключ для сервера

# ./build-key-server server
Generating a 1024 bit RSA private key

Генерируем Diffie Hellman

# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

Генерируем ключ и сертификат для клиента

# ./build-key client1

Копируем файлы ca.crt ca.key dh1024.pem server.crt server.key в папку openvpn

# cd /etc/openvpn/2.0/keys/
# cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn

Создаем конфигурационный файл VPN-сервера в /etc/openvpn/

# mcedit /etc/openvpn/server.conf
# Порт для подключений
port 1194
proto tcp
# Устройство
dev tun
# Расположение сертификатов и ключей
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
# Параметры для виртуального туннеля сервера VPN
server 10.10.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
# Прописываем маршруты
push "route 10.10.10.0 255.255.255.0"
push "redirect-gateway"
push "dhcp-option DNS 8.8.8.8"
# Разрешаем клиентам обмениваться пакетами
client-to-client
# Проверяем соединение каждые 10 секунд, если его нет то через 120 секунд переподключаем
keepalive 10 120
# Используем компрессию
comp-lzo
# Назначаем пользователя и группу для работы с OpenVPN
user nobody
group nobody
# Не перечитывать ключи после получения SIGUSR1 или ping-restart
persist-key
# Не закрывать или переоткрывать TUN\TAP устройство, после получения SIGUSR1 или ping-restart
persist-tun
# Записывать статус сервера OpenVPN
status openvpn-status.log
# Логи
log /var/log/openvpn.log
# Уровень отладки
verb 3
mute 10

Проверяем ip_forward

# grep net.ipv4.ip_forward /etc/sysctl.conf
net.ipv4.ip_forward = 1

Прописываем правило в iptables и сохраняем его чтобы не потерять при перезагрузке,
где x.x.x.x — это venet0:0 inet addr

# iptables -t nat -A POSTROUTING -s 10.10.10.0/255.255.255.0 -o venet0 -j SNAT --to-source x.x.x.x
# iptables-save > /etc/sysconfig/iptables
# chkconfig iptables on

Проверяем правило

# iptables -L -t nat
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  10.10.10.0/24        anywhere            to:x.x.x.x 

Запускаем OpenVPN сервер

# service openvpn start
Starting openvpn:                                          [  OK  ]

Добавился новый интерфейс tun0

# 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.10.1  P-t-P:10.10.10.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)

Настройка клиента для Linux
Устанавливаем OpenVPN на Debian

# apt-get -y install openvpn

Устанавливаем OpenVPN на CentOS

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# yum -y install openvpn

Создаем файл /etc/openvpn/openvpn.conf, где x.x.x.x — это venet0:0 inet addr OpenVPN сервера

client
dev tun
proto tcp
remote x.x.x.x 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 3

Записываем ключи ca.crt, client1.crt, client1.key c openvpn сервера безопасным способом на клиент, где y.y.y.y адрес клиентской машины

# scp ca.crt 2.0/keys/client1.key 2.0/keys/client1.crt root@y.y.y.y:/etc/openvpn

Запускаем OpenVPN CentOS-way

# service openvpn restart
# chkconfig openvpn on

Запускаем OpenVPN Debian-way

# /etc/init.d/openvpn start

Проверяем поднятый интерфейс

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.10.6  P-t-P:10.10.10.5  Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
RX packets:4639 errors:0 dropped:0 overruns:0 frame:0
TX packets:4504 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100 
RX bytes:3481328 (3.4 MB)  TX bytes:766042 (766.0 KB)

Проверяем что весь трафик идет через VPN сервер

# traceroute ya.ru
traceroute to ya.ru (77.88.21.3), 30 hops max, 60 byte packets
 1  10.10.10.1 (10.10.10.1)  29.888 ms  78.337 ms  78.386 ms
 ...
 6  titanium-vlan908.yandex.net (213.180.208.94)  118.275 ms  155.505 ms  70.108 ms
 7  gallium-vlan901.yandex.net (77.88.56.126)  201.368 ms  141.281 ms  201.208 ms
 8  l3-s900-s3000.yandex.net (213.180.213.4)  201.468 ms  201.499 ms  201.498 ms
 9  www.yandex.ru (77.88.21.3)  201.256 ms  201.181 ms  201.248 ms

Клиент для Windows
Устанавливаем пакет http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe

Записываем ключи ca.crt, client1.crt, client1.key c openvpn сервера безопасным способом на Windows XP в папку куда установили программу openvpn

Конфигурационный файл программы , где x.x.x.x — это venet0:0 inet addr OpenVPN сервер

client
dev tun
proto tcp
remote x.x.x.x 1194
resolv-retry infinite
persist-key
persist-tun
ca c:\\OpenVPN\\ca.crt
cert c:\\OpenVPN\\client1.crt
key c:\\OpenVPN\\client1.key
comp-lzo
verb 3

Выполняем Connect на клиенте openvpn-2.0.9-gui