Вот и настало время, когда терпения уже не хватает… Сижу в офисе, получаю инет через прокси. Админы режут всё что можно и неможно. Всё ближе и ближе я был к тому, что бы поднять свою VPN до сервера, который арендую в Питере и получать инет именно с него.

До этого я поднимал http туннель с помощью putty. Но этого было мало, т.к. не все программы могут работать через прокси. А ставить различные Proxifier и FreeCap мне не интересно. Слишком много хлама.

Цель поставлена. Начинаем анализ. Какую же технологию выбрать для поднятия VPN от моего офисного компа, который находится «за проксёй» до виртуального сервера с CentOS…? Выбор не велик. Это OpenVPN. Он умеет работать через http proxy.

Робота начинается с установки OpenVPN на сервер под управлением CentOS (в моем случае это 5-й цент). Т.к. в стандартном репозитарии пакет openvpn отсутствует, то необходимо сначала подключить нужные репозитарии. Теперь можно приступить к установке:

[admin@anart.ru /]# yum install openvpn

После установки необходимо создать главный конфигурационный файл openvpn сервера server.conf и положить файл в /etc/openvpn:

[admin@anart.ru /]# touch /etc/openvpn/server.conf

команда touch создаст пустой файл server.conf. А если файл существовал ранее, то ничего не произойдет.

Так же создадим файл, в который openvpn будет записывать выдаваемые клиентам ip адреса

[admin@anart.ru /]# touch /etc/openvpn/ipp.txt

А для логов нужно создать каталог:

[admin@anart.ru /]# mkdir /var/log/openvpn

Теперь приступим к правке файла /etc/openvpn/server.conf. Его можно править любым встроенным редактором, например vi, nano, mcedit или же через SFTP на своей машине любимым редактором. Ниже представляю мой конфигурационный файл с реально работающего сервера, который мне дает интернет через VPN:

# Какой интерфейс слушать?
local X.X.X.X #(ip адрес интерфейса, который смотрит в интернет. Это скорее всего eth0)
# Какой порт слушать?
port 443 #(Наша «прокся» пускает по 80-му и 443-му портам.)
# На каком протоколе будем работать?
proto tcp-server
# В каком режиме работать? Мостом (tap) или маршрутизация (tun)
#dev tun0
dev tap0 # (на tun я так и не смог поднять сеть)
# Разрешить аутентификацию по паролю
#auth-user-pass
# Пути к корневому сертефикату, сертификату и закрытому ключу.
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key 

# Параметры Диффи-Хелмана
dh /etc/openvpn/keys/dh1024.pem

# Отключить проверку пользовательских сертификатов
# client-cert-not-required
# username-as-common-name
# Настройка режима сервера и ИП адресов для выдачи клиентам. Сервер возьмет себе 10.8.0.1
#server 10.8.0.0 255.255.255.0
mode server
ifconfig 10.8.0.1 255.255.255.0
ifconfig-pool 10.8.0.2 10.8.0.10
daemon

# Разрешаем использовать TLS
tls-server
# Разрешить клиентам доступ VPN клиентам между друг другом?
#client-to-client
# Сопоставления клиент <-> виртуальный IP-адрес
# хранятся в этом файле.  Если OpenVPN упадет или 
# будет перезапущен, повторно подключающимся клиентам могут быть назначены
# из пула такие же виртуальные IP-адреса, которые были назначены им в прошлый раз.
ifconfig-pool-persist /etc/openvpn/ipp.txt
# Передача клиенту параметров маршрутизации, где X.X.X.X - IP адрес вашего eth0, что смотрит в интернет
push "route X.X.X.X 255.255.255.0"

# Передаем клиенту настройку шлюза
push "route-gateway 10.8.0.1"

# Некоторые Windows-специфичные сетевые настройки
# могут быть переданы клиентам, такие как адреса DNS-
# или WINS-серверов.  ПРЕДОСТЕРЕЖЕНИЕ:
# http://openvpn.net/faq.html#dhcpcaveats
push "dhcp-option DNS 8.8.8.8" # Я взял публичные Гугловские ДНСы
push "dhcp-option DNS 8.8.4.4"

# Говорим клиентам поменять шлюз по умолчанию на VPN интерфейс.
push "redirect-gateway"

# Проверка соединения
keepalive 10 120

# Для большей безопасности и защиты от ДОС и флуда выдаем клиентам ta.key. На сервере 0, на клиентах 1.
tls-auth /usr/share/openvpn/keys/ta.key 0

# Допустимые алгоритмы шифра. Надо прописывать так же и на клиенте.
cipher DES-CBC3-SHA
cipher BF-CBC
cipher AES-256-CBC

#cipher ECDHE-RSA-AES256
#cipher ECDHE-ECDSA-AES256
#cipher DHE-RSA-AES256
#cipher DHE-DSS-AES256-SHSHA

# Включить сжатие. Если да, то надо прописывать и на клиенте.
comp-lzo

# Максимальное количество одновременно подключенных клиентов
max-clients 5

# От какого пользователя и группы работать серверу?
user openvpn
group openvpn

# persist-опции скажут OpenVPN при перезагрузке воздержаться от доступа к определенным ресурсам,
# т.к. они могут быть недоступны из-за понижения привелегий.
persist-key
persist-tun

# Файл состояния текущих соединений. Перезаписывается раз в минуту.
status /var/log/openvpn-status.log

# Куда писать логи?
log-append /var/log/openvpn.log

# Уровень детализации лога
verb 3

# Не записывать больше повторяющихся сообщений сразу
mute 20

На этом конфигурирование закончено. Теперь приступаем к генерации ключей и сертефикатов безопасности. Генерируем ключи и сертификаты для сервера и для каждого пользователя. Скрипты для генерации находятся в /usr/share/openvpn/easy-rsa/2.0. Перейдем туда:

[admin@anart.ru /]# cd /usr/share/openvpn/easy-rsa/2.0

Если каталог не существует, устанавливаем easy-rsa

[admin@anart.ru /]# yum install easy-rsa

Пробуем перейти в easy-rsa:

[admin@anart.ru /] cd /usr/share/easy-rsa/2.0

Теперь выполняем всё по порядку

[admin@anart.ru 2.0]# . ./vars

Обратите внимание - две точки разделены пробелом!

Удаляем всё и готовим к генерации каталог keys:

[admin@anart.ru 2.0]# ./clean-all

Создаём ca.key - он нужен и серверу и клиенту

[admin@anart.ru 2.0]# ./build-ca

Генератор будет задавать вопросы, можете жать Enter на всех вопросах

Далее генерируем приватный ключ и сертификат для сервера:

[admin@anart.ru 2.0]# ./build-key-server server

Так же жмем Enter на всех вопросах

Теперь генерируем файл параметров по алгоритму Diffie-Hellman

[admin@anart.ru 2.0]# ./build-dh

После этого генерируем ключи и сертификаты для клиентов:

[admin@anart.ru 2.0]# ./build-key anton

Снова отвечаем на вопросы… Так же создаем файлы для Васи, Пети и других… Имейте в виду, что максимальное количество клиентов мы указываем в /etc/openvpn/server.conf

Необходимые файлы создались в /usr/share/openvpn/easy-rsa/2.0/keys, либо /usr/share/easy-rsa/2.0/keys, в зависимости от того, где вы генерировали ключи. И последним создаем общий ключ для клиентов и сервера. Это TLS-ключ:

[admin@anart.ru 2.0]# openvpn --genkey --secret ta.key

ta.key создастся в том же каталоге где находятся скрипты-генераторы. В нашем случае в /usr/share/openvpn/easy-rsa/2.0 (или /usr/share/easy-rsa/2.0)

На этом генерация завершена. Теперь в каталоге /usr/share/openvpn/easy-rsa/2.0/keys (/usr/share/easy-rsa/2.0/keys) находятся все ключи и сертификаты, а в /usr/share/openvpn/easy-rsa/2.0 (/usr/share/easy-rsa/2.0) TLS-ключ ta.key.

Файлы, которые необходимы серверу:

ca.crt
ta.key
server.crt
server.key
dh1024.pem

Их необходимо скопировать в /etc/openvpn/keys (Предварительно создав папку keys /etc/openvpn/keys)

Файлы которые мы отдадим клиенту:

anton.crt
anton.key
ca.crt
ta.key

Теперь можно запустить openvpn сервер:

[admin@anart.ru 2.0]# service openvpn start

или

[admin@anart.ru 2.0]# /etc/init.d/openvpn start

Если ошибок нигде не допущенно, то сервер запустится

Если вы хотите, что бы openvpn сервер автоматически стартовал при загрузке системы, выполните:

[admin@anart.ru 2.0]# chkconfig openvpn on

Проверим, появился ли в системе интерфейс tap0 и тот ли у него IP, который мы задали в конфигурации:

[admin@anart.ru 2.0]# ifconfig

Теперь представлю вам свой файл iptables:

# Generated by iptables-save v1.3.5 on Wed Jan 23 15:43:00 2013
*nat
:PREROUTING ACCEPT [39:5343]
:POSTROUTING ACCEPT [2:120]
:OUTPUT ACCEPT [3:196]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Wed Jan 23 15:43:00 2013
# Generated by iptables-save v1.3.5 on Wed Jan 23 15:43:00 2013
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [735:1182216]
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -i tap0 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

Перезапускаем iptables

[admin@anart.ru /]# service iptables restart

Помните, что в конце файла всегда должна быть пустая строчка! Данная конфигурация фаервола закрывает все входящие соединения кроме перечисленных портов, плюс раздает «интернет» клиентам VPN сети.

Раздача интернета не будет осуществляться до тех пор, пока вы не включите форвардинг в ядре системы:

Для этого в файле /etc/sysctl.conf меняем значение net.ipv4.ip_forward на 1 (net.ipv4.ip_forward = 1) и заносим 1 в файл /proc/sys/net/ipv4/ip_forward

[admin@anart.ru /]# echo 1 > /proc/sys/net/ipv4/ip_forward

После чего перезагружаем систему!

Надеюсь вы всё сделали правильно и не потеряли доступ к серверу ))))

Т.к. я сижу с винды, то я конечно же скачиваю OpenVPN клиента для своей архитектуры. После установки у нас имеется каталог C:\Program Files\OpenVPN\config. Вот сюда мы скидываем файлы:

anton.crt
anton.key
ca.crt
ta.key

а так же создадим файл конфигурации клиента, например anton.ovpn со следующим содержимым:


# Укажем, что мы являемся клиентом
client
tls-client
dev tap

# На каком протоколе работать
proto tcp-client

# Адрес и порт сервера (Хоть IP хоть доменное имя)
remote X.X.X.X 443

# Бесконечно пробовать разрешить имяо хоста OpenVPN-сервера.
resolv-retry infinite

# Не биндиться к интерфейсу
nobind

# Стараться сохранять некоторое объекты между перезапусками
persist-key
persist-tun
nobind

http-proxy-retry # повторять при ошибках соединения
http-proxy 192.168.65.31 3128 # это мой пример прокси

# Параметры SSL/TLS.
# Смотрите файл конфигурации сервера для более
# подробного описания.  Лучше всего использовать
# отдельные пары .crt/.key-файлов
# для каждого клиента.  Один ca-файл
# может быть использован для всех клиентов.
ca ca.crt
cert ncgti.crt
key ncgti.key


# Если на сервере используется ключ tls-auth,
# то каждый клиент также должен иметь этот ключ.
tls-auth ta.key 1

# Выбор криптографического шифра (cipher).
# Если опция cipher используется на сервере,
# то вы также должны указать её здесь.
cipher DES-CBC3-SHA
cipher BF-CBC
cipher AES-256-CBC

# Включить сжатие
comp-lzo

# Уровень лога
verb 3

# Не записывать поторяющиеся сообщения более чем
mute 20

Запускаем OpenVPN GUI. Он появляется в трее. Жмем на его значек в трее правой кнопкой - подключиться. Наблюдаем процесс подключения в виде лога. При успешном подключении компьютеры на пиктограмме будут зелеными, так же вам будет назначен IP адрес вида 10.8.0.2 и т.д.

При данном подключении все ваши запросы будут проходить через шлюз 10.8.0.1. Т.е. вы потеряете доступ к локальной сети, если таковая у вас имеется. Для того, что бы локальная сеть работала, необходимо все ваши запросы вида 192.160.0.0 отправлять на шлюз вашей локальной сети. Например у нас это шлюз 192.168.0.1. Делается это путем ввода в коммандной строке следующей строки:

C:\Users\Admin> route ADD -p 192.168.0.0 mask 255.255.0.0 192.168.0.1

Таким образом, локальные запросы будут проходить через шлюз 192.168.0.1