OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек.
Варианты применения данной статьи
Исходные данные
Локальная сеть 1
192.168.1.0/24 192.168.1.1 Белый внешний IP (здесь будет сервер OpenVPN) Внутренний IP сервера OpenVPN - 192.168.1.100
Локальная сеть 2
192.168.0.0/24 192.168.0.1 Динамический IP (или даже серый - не важно для клиента OpenVPN) Внутренний IP клиента OpenVPN - 192.168.0.100. Клиент в данном случае будет являться шлюзом для устройств в своей подсети.
Настройка OpenVPN
Установка
И на сервере и на клиенте ставим один и тот же пакет.
apt-get install openvpn
Создание сервера
Создание ключей и сертификатов
Защита соединения в OpenVPN в данном случае строится на использовании сертификатов и ключей для сервера и для клиентов. Для их генерации в пакете OpenVPN имеются специальные скрипты, расположенные в /usr/share/doc/openvpn/examples/easy-rsa/2.0
Перед началом работы скопируем их, чтобы не изменять оригиналы.
(для 12.04 LTS)
mkdir /etc/openvpn/easy-rsa cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
(для 14.04 LTS) С лета 2013 года easy-rsa не входит в OpenVPN и команда указанная выше не сработает(не найдет easy-rsa), тогда делаем следующее:
sudo apt-get install easy-rsa
mkdir /etc/openvpn/easy-rsa cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa/2.0
Переходим в созданную директорию, где и займёмся генерацией ключей и сертификатов
cd /etc/openvpn/easy-rsa/2.0
Редактируем файл переменных
nano vars
Здесь можно заполнить например так:
# По умолчанию здесь просто openssl, которого нет в директории, в результате чего мы получим ошибку, если не укажем существующий. Я выбрал последнюю версию. Указывается без расширения .conf.
export OPENSSL="openssl"# В самом низу файла, заполняем информацию о сертификатах по умолчанию (ваши значения).
export KEY_COUNTRY="RU" export KEY_PROVINCE="Amur Region" export KEY_CITY="Blagoveschensk" export KEY_ORG="server" export KEY_EMAIL="vash@email.tut" export KEY_EMAIL=vash@email.tut# PKCS11 я не использовал, поэтому оставил без изменений.
export PKCS11_MODULE_PATH=changeme export PKCS11_PIN=1234#Добавить
export KEY_ALTNAMES="VPNsRUS"
копируем конфиг openssl
cp openssl-1.0.0.cnf openssl.cnf
Загружаем переменные
source ./vars
Очищаем от старых сертификатов и ключей папку keys и создаем серийный и индексные файлы для новых ключей
./clean-all
Создаем сертификат. По умолчанию поля будут заполняться данными, введенными ранее в vars, поэтому можно ничего не менять.
./build-ca
Создаем ключ сервера
A challenge password []:
Заполняется произвольным значением, насколько я понял это нужно только для создания ключа и больше нам не потребуется../build-key-server server
В конце соглашаемся с запросом на подпись и добавление сертификаты в базу.
Создаем ключ Диффи Хельман
./build-dh
Cоздаем ключ для tls-аутификации
openvpn --genkey --secret keys/ta.key
Перемещаем сертификаты
cp -r /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn/
Создание файла конфигурации сервера
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ cd /etc/openvpn gunzip -d /etc/openvpn/server.conf.gz nano /etc/openvpn/server.conf
port 1194# Протокол может быть UDP или TCP, я выбрал 1-й вариант.
proto udp# Если вы выберите протокол TCP, здесь должно быть устройство tap. Однако, это вариант я не проверял, поэтому ищите информацию отдельно.
dev tun# Указываем где искать ключи
ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key# This file should be kept secret
dh /etc/openvpn/keys/dh2048.pem# Для 12.04 dh1024.pem
# Задаем IP и маску виртуальной сети. Произвольно, но если не уверены лучше делайте как показано здесь
server 10.8.0.0 255.255.255.0# Указыем, где хранятся файлы с настройками IP-адресов клиентов (создадим ниже)
client-config-dir ccd# Запоминать динамически выданные адреса для VPN-клиентов и при последующих подключениях назначать те же значения.
ifconfig-pool-persist ipp.txt# Указываем сети, в которые нужно идти через туннель (сеть-клиента).
route 192.168.0.0 255.255.255.0# Включаем TLS
tls-server tls-auth /etc/openvpn/keys/ta.key 0 tls-timeout 120 auth SHA1# по-умолчанию. Можно ещё MD5.
cipher BF-CBC# Если нужно, чтобы клиенты видели друг друга раскомментируйте
;client-to-client
keepalive 10 120# Сжатие трафика
comp-lzo# Максимум клиентов
max-clients 10 user nobody group nogroup# Не перечитывать ключи, не закрывать и переоткрывать TUNTAP устройство, после получения SIGUSR1 или ping-restart
persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log# Детальность логирования
verb 3# Защита от повторов (максимум 20 одинаковых сообщений подряд)
mute 20# Файл отозванных сертификатов. Разремить, когда такие сертификаты появятся.
;crl-verify /etc/openvpn/crl.pem
Создадим директорию для клиентских конфигов
mkdir /etc/openvpn/ccd
Можно запускать наш сервер OpenVPN
service openvpn restart
Смотрим список интерфейсов
ifconfig
Если среди прочих видим
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.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)
значит VPN-сервер завелся. Если нет, то смотрим лог
tail -f /var/log/openvpn.log
Настройка маршрутизации на стороне сервера
Если сервер имеет «белый» IP то никакой маршрутизации на стороне сервера настраивать не нужно. Если сервер находится в локальной сети за NAT роутера то необходимо настроить маршрутизацию.
Для того, чтобы клиенты могли достучаться до сервера нужно пробросить порты с роутера на сервер. В разных моделях это делается по разному. Суть в том, чтобы стучась на внешний порт, например 12345 1), клиенты попадали на порт OpenVPN-сервера 1194 (или другой, который мы задали для нашего сервера). Кроме того устройствам в локальной сети нужно сообщить, что для доступа к сети за OpenVPN-сервером нужно обращаться к нему. Но проще задать этот маршрут на роутере, который обслуживает локалку.
Создаем файл в каталоге ccd с тем же именем, что и ключ для клиента, т.е. /etc/openvpn/ccd/client
# Маршрут в сеть клиента. Требуется для доступа к сетевым устройствам в сети клиента. Если не требуется - не прописывайте.
iroute 192.168.0.0 255.255.255.0# Задаем маршрут для клиента, чтобы он видел сеть за OpenVPN-сервером.
push "route 192.168.1.0 255.255.255.0"
Включаем ipv4_forwarding
В /etc/sysctl.conf расскомментируем #net.ipv4.ip_forward=1 после чего
sudo sysctl -p
Настраиваем NAT на сервере
# Открываем доступ OpenVPN
iptables -A INPUT -p udp --dport 1194 -j com-allow iptables -A INPUT -i $TUN -j com-allow# Разрешаем проход пакетов от тунеля
iptables -A FORWARD -i $TUN -j com-allow iptables -A FORWARD -o $TUN -j com-allow# Разрешаем выход тунеля openvpn
iptables -t nat -A POSTROUTING ! -s 192.168.1.1 -o $LOCALE1 -j SNAT --to 192.168.1.1 iptables -t nat -A POSTROUTING -s $IPTUN -o $INET -j SNAT --to-source $IPINET
Создание клиента
Создание ключей и сертификатов
Ключи клиента создаются на сервере
Переходим в созданную директорию, где и замёмся генерацией ключей и сертификатов
cd /etc/openvpn/easy-rsa/2.0
Загружаем переменные
source vars
Создаем ключ клиента
Common Name (eg, your name or your server's hostname) []:
нужно вписать название файла ключа, в данном случае client
./build-key client
Если хотим защитить ключ паролем, то генерируем его другой командой
./build-key-pass client
В этом случае при запуске соединения нужно будет каждый раз вводить пароль на ключ.
ca.crt, dh1024.pem, client.crt, client.key, ta.key
) на клиента OpenVPN в /etc/openvpn/keys/
Создание файла конфигурации клиента
/etc/openvpn/client.conf
client dev tun proto udp# Внеший IP, на или за которым находится ваш сервер OpenVPN и порт (на сервере или роутере, за которым стоит сервер)
remote 111.222.333.444 1194# необходимо для DynDNS
resolv-retry infinite ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/client.crt key /etc/openvpn/keys/client.key tls-client tls-auth /etc/openvpn/keys/ta.key 1 auth SHA1# по-умолчанию. Можно MD5
cipher BF-CBC remote-cert-tls server comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 3 mute 20
Можно запускать наш клиент OpenVPN
service openvpn restart
Настройка маршрутизации на стороне клиента
Машина с openvpn уже готова работать с сервером в чём можно убедится
ping -c 2 10.8.0.1 ping -c 2 192.168.1.100
Но для того, чтобы пользоваться туннелем в другой офис могли другие устройства в локальной сети нужно указать им, чтобы доступ в подсеть 192.168.1.0/24 осуществляется через 192.168.0.100. Или, что часто проще и быстрее прописать это правило маршрутизации на роутере, который является шлюзом для устройств в сети.
Включаем ipv4_forwarding
Также как в случае с сервером.
В /etc/sysctl.conf расскомментируем #net.ipv4.ip_forward=1 после чего
sudo sysctl -p
Отзыв сертификата
cd /etc/openvpn/easy-rsa/2.0 . ./vars ./revoke-full client2
Скрипт revoke-full создаст CRL-файл (certificate revocation list, список отозванных сертификатов) с именем crl.pem в подкаталоге keys. Файл должен быть скопирован в каталог, в котором сервер OpenVPN может получить к нему доступ. Ранее в конфиге мы прописали, что этот файл должен находится в /etc/openvpn, туда и копируем.
Отключение автозапуска OpenVPN
Это бывает полезно, например для клиента с ключем защищенным паролем, т.к. всё равно при старте системы такое соединение не поднимется в виду отсутствия пароля для ключа. Да и в том случае, если вы сделали ключ с паролем, значит, скорее всего, вам не нужно постоянное соединение.
nano /etc/default/openvpn
Раскомментируем строчку
AUTOSTART="none"
Источники:
OpenVPN | Русскоязычная документация по Ubuntu
OpenVPN, нет доступа к сети за сервером. - Форум 3DNews