Openvpn

Материал из Wiki Open book
Перейти к: навигация, поиск

Содержание

Описание

Дописать...

Установка

RHEL 4 или CentOS 4

Для работы программы потребуется установка библиотеки lzo.

Сначала качаем последние версии rpm пакетов: lzo-devel-2.00-1.2.el4.test.i386.rpm и lzo-2.00-1.2.el4.test.i386.rpm, с сайта http://dag.wieers.com/packages/lzo .

Устанавливаем полученные пакеты:

rpm -ihv lzo-2.00-1.2.el4.test.i386.rpm
rpm -ihv lzo-devel-2.00-1.2.el4.test.i386.rpm

Качаем исходные коды OpenVPN последней версии с сайта http://openvpn.net/download.html#stable.

Собираем пакет

rpmbuild -tb openvpn-2.0.9.tar.gz

Устанавливаем пакет:

rpm -ihv /usr/src/redhat/RPMS/i386/openvpn-2.0.9-1.i386.rpm

Генерация сертификатов и ключей

Подробное описание Создание ключей и сертификатов. Если вам лениво разбираться с программой openssl, можно воспользоваться оболочкой TinyCA2.

Если у Вас нет необходимости создавать свой центр сертификации, и вы будете генереривать ключи только для OpenVPN, можно воспользоваться набором скриптов Easy RSA, который поставляются в комплекте с OpenVPN. Они находятся в директории с документацией: /usr/share/doc/openvpn-версия/easy-rsa.

В первую очередь следует перейти в эту директорию.

# cd /usr/share/doc/openvpn-2.0.5/easy-rsa
#

Теперь отредактируйте файл vars.

export D=`pwd`
export KEY_CONFIG=$D/openssl.cnf
export KEY_DIR=/etc/openvpn/keys
echo NOTE: when you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export KEY_SIZE=1024
export KEY_COUNTRY=RU
export KEY_PROVINCE=RU
export KEY_CITY=MOSCOW
export KEY_ORG="Artur Kryukov"
export KEY_EMAIL="artur@kryukov.ru"

Этот файл предназначен для установок переменных среды окружения, перед генерацией ключей. Запустите его при помощи точки:

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

Теперь запустите программу очистки (на всякий пожарный).

# ./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) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [MOSCOW]:
Organization Name (eg, company) [Artur Kryukov]:
Organizational Unit Name (eg, section) []:Personal Server
Common Name (eg, your name or your server's hostname) []:kryukov.ru
Email Address [artur@kryukov.ru]:
#

Некоторые поля заполняются автоматически, ведь не зря мы изменяли содержимое файла vars. Хотя ответы по умолчанию можно было поместить в конфигурационный файл программы openssh — openssl.cnf.

В директории /etc/openvpn появилась директория keys, в которой находятся файлы сертификата и ключ.

Теперь следует создать ключ и сертификат для сервера.

# ./build-key-server artur.kryukov.ru
Generating a 1024 bit RSA private key
...++++++
..++++++
writing new private key to 'artur.kryukov.ru.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) [RU]:
Locality Name (eg, city) [MOSCOW]:
Organization Name (eg, company) [Artur Kryukov]:
Organizational Unit Name (eg, section) []:Personal Server
Common Name (eg, your name or your server's hostname) []:artur.kryukov.ru
Email Address [artur@kryukov.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:
Using configuration from /usr/share/doc/openvpn-2.0.5/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:'RU'
localityName          :PRINTABLE:'MOSCOW'
organizationName      :PRINTABLE:'Artur Kryukov'
organizationalUnitName:PRINTABLE:'Personal Server'
commonName            :PRINTABLE:'kryukov.ru'
emailAddress          :IA5STRING:'artur@kryukov.ru'
Certificate is to be certified until Dec 11 14:31:19 2015 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
#

Сгенериуем сертификаты и ключи для клиентских машин. Я предполагаю заходить на сервер со своего ноутбука и с домашней машины, поэтому буду создавать ключи и сертификаты для двух машин.

# ./build-key master.kryukov.ru
Generating a 1024 bit RSA private key
.......++++++
.............................................++++++
writing new private key to 'master.kryukov.ru.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) [RU]:
Locality Name (eg, city) [MOSCOW]:
Organization Name (eg, company) [Artur Kryukov]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:master.kryukov.ru
Email Address [artur@kryukov.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:
Using configuration from /usr/share/doc/openvpn-2.0.5/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'RU'
localityName          :PRINTABLE:'MOSCOW'
organizationName      :PRINTABLE:'Artur Kryukov'
commonName            :PRINTABLE:'master.kryukov.ru'
emailAddress          :IA5STRING:'artur@kryukov.ru'
Certificate is to be certified until Dec 11 14:39:59 2015 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
#

И для домашней машины.

# ./build-key home.kryukov.ru
Generating a 1024 bit RSA private key
..............................................++++++
.......................................++++++
writing new private key to 'home.kryukov.ru.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) [RU]:
Locality Name (eg, city) [MOSCOW]:
Organization Name (eg, company) [Artur Kryukov]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:home.kryukov.ru
Email Address [artur@kryukov.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:
Using configuration from /usr/share/doc/openvpn-2.0.5/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'RU'
localityName          :PRINTABLE:'MOSCOW'
organizationName      :PRINTABLE:'Artur Kryukov'
commonName            :PRINTABLE:'home.kryukov.ru'
emailAddress          :IA5STRING:'artur@kryukov.ru'
Certificate is to be certified until Dec 11 14:42:06 2015 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
#

В заключении следует создать Diffie Hellman параметры.

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

Посмотрим содержимое директории /etc/openvpn/keys:

# ls /etc/openvpn/keys/
01.pem                ca.key               index.txt.old
02.pem                dh1024.pem           master.kryukov.ru.crt
03.pem                home.kryukov.ru.crt  master.kryukov.ru.csr
04.pem                home.kryukov.ru.csr  master.kryukov.ru.key
artur.kryukov.ru.crt  home.kryukov.ru.key  serial
artur.kryukov.ru.csr  index.txt            serial.old
artur.kryukov.ru.key  index.txt.attr
ca.crt                index.txt.attr.old
#

Теперь необходимо разобраться какие файлы куда помещать.

Файл Машина Назначение Доступ
ca.crt Сервер и клиенты Сертификат корневого СА Публичный
ca.key Только на сервере Необходим для подписи других сертификатов Секретный
1024.pem Только на сервере Diffie Hellman параметры Публичный
artur.kryukov.ru.crt Только на сервере Сертификат сервера Публичный
artur.kryukov.ru.key Только на сервере Ключ сервера Секретный
home.kryukov.ru.crt Только на клиенте Сертификат клиента Публичный
home.kryukov.ru.key Только на клиенте Ключ клиента Секретный

Файлы *.csr можно удалить.

Скопируйте все необходимые файлы на клиенты в директорию /etc/openvpn/keys. Для клиента master.kryukov.ru, я скопировал три файла: ca.crt, master.kryukov.ru.crt и master.kryukov.ru.key.

На всякий пожарный проверьте действительность создаваемых сертификатов.

openssl verify -CApath /etc/openvpn/keys -CAfile ca.crt -purpose sslclient home.kryukov.ru.crt

Для сервера следует изменить значение поля -purpose на sslserver.

Конфигурация Point-to-Point

Настройка сервера

Для конфигурации сервера необходимо создать несколько конфигурационных файлов в директории /etc/openvpn. На каждого клиента или клиентскую сеть требуется создавать отдельный конфигурационный файл с расширением *.conf. За основу возьмем файл пример из документации — tls-office.conf. Скопируем этот файл в директорию /etc/openvpn и назовем master.server.conf.

Определяем устройство, которое будет использоваться openvpn:

dev tun

Указываем IP адрес на нашей стороне и на стороне сервера:

ifconfig 192.168.240.1 192.168.240.2

Разрешаем использование TLS:

tls-server

Заставляем использовать компрессию передаваемых данных:

comp-lzo

Определяем log-файл:

log-append /var/log/openvpn.log

Определяем режим работы:

daemon

Указываем используемые ключи и сертификаты:

dh keys/dh1024.pem
ca keys/ca.crt
cert keys/artur.kryukov.ru.crt
key keys/artur.kryukov.ru.key

Определяем порт, на котором будет слушать запросы openvpn:

port 1194

В целях безопасности понижаем права с которыми будет выполняться программа до прав пользователя и группы nobody:

user nobody
group nobody

Определяем, что openvpn будет передавать системе журнальной регистрации.

  • 0 — только критические ошибки.
  • 1 — не критические ошибки сети.
  • 3 — средний уровень болтливости.
  • 9 — все сообщения
verb 3

В результате конфигурационный файл сервера будет выглядеть так:

dev tun
ifconfig 192.168.240.1 192.168.240.2
tls-server
comp-lzo
log-append /var/log/openvpn.log
daemon
dh keys/dh1024.pem
ca keys/ca.crt
cert keys/artur.kryukov.ru.crt
key keys/artur.kryukov.ru.key
port 1194
user nobody
group nobody
verb 3

Настройка клиента

На стороне клиента тоже необходимо создать конфигурационный файл Назовем его client.conf. Определим используемое устройство:

dev tun

Укажем порт на сервере:

port 1194

Определим IP адреса, которые будут присвоены локальной машине и серверу:

ifconfig 192.168.240.2 192.168.240.1

Заставляем использовать компрессию передаваемых данных:

comp-lzo

Разрешим использование TLS на клиенте:

tls-client

Скажем, что сертификат машины, к которой мы будем подключаться — это сертификат сервера.

ns-cert-type server

Обязательно определим реальный IP адрес машины сервера:

remote 195.2.80.69

Укажем используемые ключи и сертификаты:

ca keys/ca.crt
cert keys/master.kryukov.ru.crt
key keys/master.kryukov.ru.key

Понижаем права с которыми будет выполняться программа до прав пользователя и группы nobody:

user nobody
group nobody

Определяем, что openvpn будет передавать системе журнальной регистрации.

verb 3

В результате конфигурационный файл клиента будет выглядеть следующим образом:

dev tun
port 1194
ifconfig 192.168.240.2 192.168.240.1
tls-client
ns-cert-type server
remote 195.2.80.69
ca keys/ca.crt
cert keys/master.kryukov.ru.crt
key keys/master.kryukov.ru.key
user nobody
group nobody
verb 3

Если через некоторое время соединение пропадает (работа через PPP или NAT), добавьте следующие параметры:

ping 15
ping-resatrt 45
ping-timer-rem
persist-tun
persist-key

Firewall

После создания конфигурационных файлов на сервере и, если это надо – на клиенте, необходимо открыть в firewall хождение для udp пакетов на порт 1194. Кроме этого необходимо открыть пакеты приходящие с интерфейса tun. В примере показано разрешение хождения всех пакетов, это конечно далеко не самый лучший вариант. Желательно писать отдельные правила для каждого случая.

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT

Конфигурация один сервер, несколько клиентов

В случае, когда к одному серверу будет подключаться несколько клиентов рекомендуется использовать другую конфигурацию. Для работы VPN мы будем пользоваться устройствами tap, позволяющими эмулировать сеть на уровне Ethernet.

Настройка сервера

В первую очередь указываем, что будет использоваться устройство tap0:

dev tap0

Затем говорим, что openvpn будет работать в режиме сервера, а не в режиме по умолчанию (точка-точка)

mode server

Заставляем использовать компрессию передаваемых данных:

comp-lzo

Определяем режим работы:

daemon

Определяем log-файл:

log-append /var/log/openvpn.log

Затем выделяем пул IP адресов, которые будут выдаваться клиентам.

ifconfig-pool 192.168.240.2 192.168.240.12

При помощи параметра ifconfig определяем IP адрес сервера и маску подсети.

ifconfig 192.168.240.1 255.255.255.0

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

ifconfig-pool-persist ipp.txt

Он определяет файл, в котором будет сохраняться информация о машине и ее IP. Файл содержит строки: Имя машины,IP адрес. Во время работы, сервер с периодичностью в 600 секунд обновляет содержимое этого файла. При включении, сервер читает содержимое файла.

Еще один полезный параметр:

status /var/log/openvpn-status.log

В этом файле сохраняется информация о текущих соединениях сервера.

Остальные параметры, такие же как и в настройке в режиме точка-точка. В результате конфигурационный файл сервера будет выглядеть так:

dev tap0
proto udp
mode server
comp-lzo
log-append /var/log/openvpn.log
daemon
ifconfig-pool 192.168.240.2 192.168.240.12
ifconfig 192.168.240.1 255.255.255.0
tls-server
dh keys/dh1024.pem
ca keys/ca.crt
cert keys/kryukov.ru.crt
key keys/kryukov.ru.key
port 1194
user nobody
group nobody
persist-tun
persist-key
verb 0

Конфигурация клиента Linux

Определяем используемое устройство:

dev tap

Указываем реальный IP адрес сервера, куда будет подключаться клиент:

remote 195.2.80.69

Говорим, что мы будем работать в режиме клиента:

client

Все остальные параметры как и в примере конфигурации клиента в режиме точка-точка. В результат конфигурационный файл клиента будет выглядеть так:

dev tap
proto udp
remote 195.2.80.69
port 1194
client
tls-client
comp-lzo
ns-cert-type server
ca keys/ca.crt
cert keys/home.kryukov.ru.crt
key keys/home.kryukov.ru.key
user nobody
group nobody
ping 15
ping-restart 120
ping-timer-rem
persist-key
persist-tun
verb 0

Конфигурация клиента Windows

Клиент для Windows берем тут: http://openvpn.net/index.php/downloads.html. Если вы используете Vista, берите клиент 2.1 самой последней версии. Несмотря на то, что на момент написания этого раздел он был в состоянии rc (release candidate), клиент работает великолепно.

Скачайте файлы сертификата (win.st1.kryukov.biz.pem), ключа клиентской машины (win.st1.kryukov.biz.key) и публичного ключа сервера сертификации (/etc/pki/CA/CA.crt). Сделать это можно например, при помощи программы Winscp. Поместите их в директорию C:\Program Files\OpenVPN\config.

После установки клиента, перейдите в директорию C:\Program Files\OpenVPN\config и создайте текстовый конфигурационный файл client.ovpn следующего содержания:

dev tap
proto udp
remote st1.kryukov.biz 1194
client
nobind
tls-client
comp-lzo
ns-cert-type server
ca "C:\\Program Files\\OpenVPN\\config\\CA.crt"
cert "C:\\Program Files\\OpenVPN\\config\\win.st1.kryukov.biz.pem"
key "C:\\Program Files\\OpenVPN\\config\\win.st1.kryukov.biz.key"
ping 15
ping-restart 120
ping-timer-rem
persist-key
persist-tun
verb 1

В составе пакета находится программа OpenVPN GUI. Она позволяет управлять соединениями, доступна через стандартное меню "Пуск".

Обратите внимание на то, что в конфигурационном файле Windows клиента, параметр verb равен 1. Программа OpenVPN GUI по отладочной информации, выдаваемой клиентом понимает, было ли подключение к серверу. И сможет выдавать корректную информацию об установленном соединении.

Если вам необходимо автоматическое подключение к VPN серверу, можно запустить сервис OpenVPN. Посмотрите список доступных сервисов на вашей машине и выберите автоматическое включение сервиса при старте.

Windows реализация может работать и в качестве сервера.

Firewall

После создания конфигурационных файлов на сервере и, если это необходимо – на клиенте, необходимо открыть в firewall хождение для udp пакетов на порт 1194. Кроме этого необходимо открыть пакеты приходящие с интерфейса tap.

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT

Конфигурация "сеть - VPN - сеть"

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

192.168.2/24 --- 192.168.2.1|192.168.240.2----> internet <----192.168.240.1|192.168.1.1 --- 192.168.1/24

Сеть 192.168.240/24 - это сеть которая была настроена в предыдущих примерах

Для решения этой задачи надо использовать параметр push, который позволяет передавать различные конфигурационные параметры openvpn на другой сервер openvpn. Передаваемых параметров достаточно много, их можно посмотреть в man по openvpn.

Мы воспользуемся параметром route. Для доступа к сети 192.168.1/24 на сервере 192.168.2.1 необходимо прописать маршрут к этой сети через роутер 192.168.240.1. Для этого в конфигурационном файле /etc/openvpn.conf на сервере 192.168.1.1 необходимо добавить строку:

push "route 192.168.1.0 255.255.255.0 192.168.240.1"
Внимание! Обратите внимание на то, что push передает не командную строку, которую следует выполнить на стороне противоположного сервера, а параметр программы openvpn, который необходимо применить.

К сожалению, на сервере 192.168.2.1 команда push нам не поможет. Она работает только на VPN сервере. Т.е. только с VPN сервер может передавать команды, которые будут выполняться на клиенте. Поэтому в конфигурационном файле сервера придется писать команду route для каждой сети, подключенной к клиенту.

route 192.168.2.0 255.255.255.0 192.168.240.2

В результате, соответствующие маршруты будут добавлены в таблицы маршрутизации серверов, при запуске или перезапуске OpenVPN

Так же, что бы все работало нормально, вам придется позаботиться, что бы VPN клиенту при каждом соединении выдавался один и тот же IP адрес. Это можно сделать несколькими способами. Если учитывать конфигурацию сервера, приведенную выше. Мы добавим в конфигурационный файл сервера всего один параметр: --ifconfig-pool-persist При помощи этого параметра мы задаем имя файла в котором будет хранится соответствие VPN клиента и IP адреса, который ему присваивается. Этот файл сервер будет заполнять сам.

--ifconfig-pool-persist /etc/openvpn/iplist

Имя файла может быть любым.

В итоге, необходимые маршруты будут автоматически добавляться на клиенте. На сервере маршрут будет присутствовать всегда. Если соединение будет разорвано, и затем восстановлено, маршруты восстановятся автоматически.

Не забудьте в firewall разрешить хождение необходимых пакетов из одной сети в другую.

Стартовые скрипты

Поскольку в Slackware Linux при старте системы не предусмотрен старт OpenVPN. Если необходим автоматический старт при запуске системы придется вручную добавить в скрипт /etc/rc.d/rc.M следующие строки:

# Open VPN
if [ -x /etc/rc.d/rc.openvpn ]; then
    /etc/rc.d/rc.openvpn start
fi

Их необходимо написать сразу после запуска сети:

if [ -x /etc/rc.d/rc.inet1 ]; then
  . /etc/rc.d/rc.inet1
fi

Файл /etc/rc.d/rc.openvpn должен быть исполняемым. Пример стартового скрипта можно найти в документации к OpenVPN. Но на всякий пожарный, ниже показан файл, который я использую на своей машине.

#!/bin/sh
#
# openvpn       This shell script takes care of starting and stopping
#               openvpn on RedHat or other chkconfig-based system.
#
# description: OpenVPN is a robust and highly flexible tunneling application that
#              uses all of the encryption, authentication, and certification features
#              of the OpenSSL library to securely tunnel IP networks over a single
#              UDP port.
#
# Contributed to the OpenVPN project by
# Douglas Keller <doug@voidstar.dyndns.org>
# 2002.05.15
#
# To install:
#   copy this file to /etc/rc.d/rc.openvpn
#   and add something like this to your file
#   /etc/rc.d/rc.M or /etc/rc.d/rc.local
#   #  Start the OpenVPN daemon:
#   if [ -x /etc/rc.d/rc.openvpn ]; then
#     . /etc/rc.d/rc.openvpn start
#   fi
#   make .conf or .sh files in /etc/openvpn (see below)
# To uninstall:
#   run: chmod -x /etc/rc.d/rc.openvpn
#
# Author's Notes:
#
# I have created an /etc/init.d init script and enhanced openvpn.spec to
# automatically register the init script.  Once the RPM is installed you
# can start and stop OpenVPN with "service openvpn start" and "service
# openvpn stop".
#
# The init script does the following:
#
# - Starts an openvpn process for each .conf file it finds in
#   /etc/openvpn.
#
# - If /etc/openvpn/xxx.sh exists for a xxx.conf file then it executes
#   it before starting openvpn (useful for doing openvpn --mktun...).
#
# - In addition to start/stop you can do:
#
#   /etc/rc.d/rc.openvpn reload - SIGHUP
#   /etc/rc.d/rc.openvpn reopen - SIGUSR1
#   /etc/rc.d/rc.openvpn status - SIGUSR2
#
# Modifications:
#
# 2003.05.02
#   * Changed == to = for sh compliance (Bishop Clark).
#   * If condrestart|reload|reopen|status, check that we were
#     actually started (James Yonan).
#   * Added lock, piddir, and work variables (James Yonan).
#   * If start is attempted twice, without an intervening stop, or
#     if start is attempted when previous start was not properly
#     shut down, then kill any previously started processes, before
#     commencing new start operation (James Yonan).
#   * Do a better job of flagging errors on start, and properly
#     returning success or failure status to caller (James Yonan).
#
# 2005.04.04
#   * Added openvpn-startup and openvpn-shutdown script calls
#     (James Yonan).
#
# 2005.12.13
#   * Asssssign openvpn variable directly for package for Slackware Linux
#

# Location of openvpn binary
openvpn="/usr/sbin/openvpn"

# Lockfile
lock="/var/lock/subsys/openvpn"

# PID directory
piddir="/var/run/openvpn"

# Our working directory
work=/etc/openvpn

# Check that binary exists
if ! [ -f  $openvpn ]
then
  echo "openvpn binary not found"
  exit 0
fi

# See how we were called.
case "$1" in
  start)
        echo -n $"Starting openvpn: "

        /sbin/modprobe tun >/dev/null 2>&1

        # From a security perspective, I think it makes
        # sense to remove this, and have users who need
        # it explictly enable in their --up scripts or
        # firewall setups.

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

        # Run startup script, if defined
        if [ -f $work/openvpn-startup ]; then
            $work/openvpn-startup
        fi

        if [ ! -d  $piddir ]; then
            mkdir $piddir
        fi

        if [ -f $lock ]; then
            # we were not shut down correctly
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
              if [ -s $pidf ]; then
                kill `cat $pidf` >/dev/null 2>&1
              fi
              rm -f $pidf
            done
            rm -f $lock
            sleep 2
        fi

        rm -f $piddir/*.pid
        cd $work

        # Start every .conf in $work and run .sh if exists
        errors=0
        successes=0
        for c in `/bin/ls *.conf 2>/dev/null`; do
            bn=${c%%.conf}
            if [ -f "$bn.sh" ]; then
                . $bn.sh
            fi
            rm -f $piddir/$bn.pid
            $openvpn --daemon --writepid $piddir/$bn.pid --config $c --cd $work
            if [ $? = 0 ]; then
                successes=1
            else
                errors=1
            fi
        done

        if [ $errors = 1 ]; then
            echo faliure
        else
            echo success
        fi

        if [ $successes = 1 ]; then
            touch $lock
        fi
        ;;
  stop)
        echo -n $"Shutting down openvpn: "
        for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
          if [ -s $pidf ]; then
            kill `cat $pidf` >/dev/null 2>&1
          fi
          rm -f $pidf
        done

        # Run shutdown script, if defined
        if [ -f $work/openvpn-shutdown ]; then
            $work/openvpn-shutdown
        fi

        echo success
        rm -f $lock
        ;;
  restart)
        $0 stop
        sleep 2
        $0 start
        ;;
  reload)
        if [ -f $lock ]; then
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
                if [ -s $pidf ]; then
                    kill -HUP `cat $pidf` >/dev/null 2>&1
                fi
            done
        else
            echo "openvpn: service not started"
            exit 1
        fi
        ;;
  reopen)
        if [ -f $lock ]; then
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
                if [ -s $pidf ]; then
                    kill -USR1 `cat $pidf` >/dev/null 2>&1
                fi
            done
        else
            echo "openvpn: service not started"
            exit 1
        fi
        ;;
  condrestart)
        if [ -f $lock ]; then
            $0 stop
            # avoid race
            sleep 2
            $0 start
        fi
        ;;
  status)
        if [ -f $lock ]; then
            for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
                if [ -s $pidf ]; then
                    kill -USR2 `cat $pidf` >/dev/null 2>&1
                fi
            done
            echo "Status written to /var/log/messages"
        else
            echo "openvpn: service not started"
            exit 1
        fi
        ;;
  *)
        echo "Usage: openvpn {start|stop|restart|condrestart|reload|reopen|status}"
        exit 1
        ;;
esac
exit 0

Для запуска «в ручную», в SuSE Linux: rcopenvpn start, в Slackware Linux: /etc/rc.d/rc.openvpn start.

На клиенте проверим, был ли поднят сетевой интерфейс. В случае режима Point-to-Point это будет устройство tun0, во втором случае – tap0:

# ifconfig tap0
tap0      Link encap:Ethernet  HWaddr 1A:05:1E:59:61:35
          inet addr:192.168.240.4  Bcast:192.168.240.255  Mask:255.255.255.0
          inet6 addr: fe80::1805:1eff:fe59:6135/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1275 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1424 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:702933 (686.4 Kb)  TX bytes:576292 (562.7 Kb)

#

Далее при помощи ping проверьте соединение:

# ping -c4 192.168.240.1
PING 192.168.240.1 (192.168.240.1) 56(84) bytes of data.
64 bytes from 192.168.240.1: icmp_seq=1 ttl=64 time=1029 ms
64 bytes from 192.168.240.1: icmp_seq=2 ttl=64 time=17.3 ms
64 bytes from 192.168.240.1: icmp_seq=3 ttl=64 time=18.4 ms
64 bytes from 192.168.240.1: icmp_seq=4 ttl=64 time=14.6 ms

--- 192.168.240.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3020ms
rtt min/avg/max/mdev = 14.664/269.939/1029.259/438.395 ms, pipe 2
#

Разное

Еще одна статейка по OpenVPN и роутинг.

Источник — «http://kryukov.biz/wiki/Openvpn»
Инструменты
    
Личные инструменты