OpenVPN (Русский)

From ArchWiki
Jump to: navigation, search

Tango-preferences-desktop-locale.pngЭта страница нуждается в сопроводителеTango-preferences-desktop-locale.png

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

Tango-view-fullscreen.pngЭта статья или раздел нуждается в расширенииTango-view-fullscreen.png

Причина: добавьте хотя бы информацию о поддержке IPv6 и L2 Ethernet bridging (обсуждение: Talk:OpenVPN (Русский)#)

Tango-preferences-desktop-locale.pngЭта статья или раздел нуждается в переводеTango-preferences-desktop-locale.png

Примечания: Страница практически полностью без перевода (обсуждение: Talk:OpenVPN (Русский)#)

Эта статья описывает базовую установку и настройку OpenVPN, чего достаточно для частного использования или малой офисной сети. Больше информации можно найти на странице OpenVPN 2.3 man page и на странице OpenVPN документации.

OpenVPN -- мощный и гибкий кроссплатформенный VPN демон, поддерживающий SSL/TLS безопасность, сетевые мосты, TCP или UDP туннелирование через прокси или NAT, поддерживает DHCP, масштабируется на сотни и тысячи пользователей.

OpenVPN тесно связан с OpenSSL библиотеками и механизмы шифрования основаны в основном на нем.

OpenVPN поддерживает простое шифрование с pre-shared secret key (режим статического ключа) или SSL/TLS (режим открытого ключа безопасности) с использованием клиентских и серверных сертификатов. OpenVPN так же поддерживает незашифрованные TCP/UDP туннели.

OpenVPN использует TUN/TAP виртуальные сетевые интерфейсы, поддерживаемые на множестве платформ. В целом, OpenVPN предлагает многие из основных особенностей IPSec

OpenVPN была написана James Yonan и распространяется под лицензией GNU General Public License (GPL).

Contents

Установка OpenVPN

Установите openvpn из официального репозитория.

Примечание: Пакет OpenVPN поддерживает режим как сервера, так и клиента, поэтому установите его на всех машинах, которые должны создать VPN-соединение.

Настройка поддержки TUN/TAP

OpenVPN требует поддержки TUN/TAP. Удостоверьтесь в загрузке tun модуля.

Прочтите Kernel modules (Русский).

По умолчанию ядро уже настроено, но если Вы используете другое ядро, тогда проверьте что модуль TUN/TAP загружен. Если $ zgrep CONFIG_TUN /proc/config.gz возвратит CONFIG_TUN=n, тогда перенастройте конфигурационный файл ядра и пересоберите ядро.

Kernel config file
 Device Drivers
  --> Network device support
    [M] Universal TUN/TAP device driver support

Подключение к VPN, предоставляемой третьей стороной

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

Note: To connect to servers of the most VPN providers that offer free service, one can plainly use PPTP Server since most offers only this protocol.

Инфраструктура открытых ключей

При настройке OpenVPN с нуля нужно создать инфраструктуру открытых ключей (PKI)

Создайте необходимые сертификаты и ключи следуя Create a Public Key Infrastructure Using the easy-rsa Scripts.

Передайте эти файлы по защищенному каналу машинам, которые будут использовать OpenVPN.

Примечание: Далее будет предполагаться, что ключи и сертификаты будут расположены в /etc/openvpn.

Публичный сертификат ca.crt нужен как серверу так и клиенту. Ключ ca.key секретный используется только машиной, генерируемой ключи и сертификаты.

Для сервера необходимы server.crt, dh2048.pem server.key и ta.key.

Для клиента нужны client.crt, client.key, и ta.key.

Основная конфигурация L3 IP маршрутизации

Примечание: Если иное не оговорено, остальная часть этой статьи предполагает эту базовую конфигурацию.

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

То, что действительно отличает сервер от клиента (помимо используемого типа сертификата) является сам конфигурационный файл.OpenVPN демон при запуске считывает все файлы конфигурации .conf в /etc/openvpn и запускается в соответсвии с ними . Если он находит более одного файла конфигурации, он запустит один процесс OpenVPN на каждый файл конфигурации.

Эта статья объясняет, как настроить сервер с именем elmer и клиент, который подключается к ней по имени bugs. Серверы и клиенты могут быть легко добавлены путем создания новых пар ключ/сертификат и файлов конфигурации сервера и клиента.

Пакет OpenVPN поставляется с набором файлов-примеров конфигураций для различных целей. Эти файлы будут идеальной отправной точкой для базовой настройки OpenVPN со следующими характеристиками:

Для более продвинутых конфигураций смотрите официальную OpenVPN 2.2 справочную страницу и документацию OpenVPN.

Конфигурация сервера

Скопируйте пример конфигурационного файла сервера в /etc/openvpn/server.conf:

# cp /usr/share/openvpn/examples/server.conf /etc/openvpn/server.conf

Отредактируйте следующее:

  • Параметры ca, cert, key, и dh, указав путь, имена ключей и сертификатов. Указанные абсолютные пути позволят вам запустить OpenVPN из любого каталога для проверки.
  • Включите HMAC защиту SSL/TLS . Обратите внимание на использование параметра 0 для сервера.
  • В целях безопасности рекомендуется запускать OpenVPN с пониженными правами. Раскомментируйте строки user и group.
/etc/openvpn/server.conf
ca /etc/openvpn/ca.crt
cert /etc/openvpn/elmer.crt
key /etc/openvpn/elmer.key

dh /etc/openvpn/dh2048.pem

tls-auth /etc/openvpn/ta.key 0

user nobody
group nobody
Примечание: Обратите внимание, что если сервер находится за брандмауэром или за NAT маршрутизатора, вам придется пробросить порт OpenVPN UDP (1194) на сервер

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

Скопируйте пример конфигурационного файла клиента в /etc/openvpn/client.conf:

# cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client.conf

Отредактируйте следующее:

  • В remote строке укажите подключаемый сервер Полное имя домена, hostname (as known to the client), либо IP адрес.
  • Раскоментируйте user и group строки для понижения привилегий.
  • Параметры ca, cert, and key указав путь, имена ключей и сертификатов.
  • Включите HMAC защиту SSL/TLS . Обратите внимание на использование параметра 1 для клиента.
/etc/openvpn/client.conf
remote elmer.acmecorp.org 1194
.
.
user nobody
group nobody
.
.
ca /etc/openvpn/ca.crt
cert /etc/openvpn/bugs.crt
key /etc/openvpn/bugs.key
.
.
tls-auth /etc/openvpn/ta.key 1

Проверка настроек OpenVPN

Запустите # openvpn /etc/openvpn/server.conf на сервере, и # openvpn /etc/openvpn/client.conf на клиенте. Вы должны увидеть следующее:

# openvpn /etc/openvpn/server.conf
Wed Dec 28 14:41:26 2011 OpenVPN 2.2.1 x86_64-unknown-linux-gnu [SSL] [LZO2] [EPOLL] [eurephia] built on Aug 13 2011
Wed Dec 28 14:41:26 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Wed Dec 28 14:41:26 2011 Diffie-Hellman initialized with 2048 bit key
.
.
Wed Dec 28 14:41:54 2011 bugs/95.126.136.73:48904 MULTI: primary virtual IP for bugs/95.126.136.73:48904: 10.8.0.6
Wed Dec 28 14:41:57 2011 bugs/95.126.136.73:48904 PUSH: Received control message: 'PUSH_REQUEST'
Wed Dec 28 14:41:57 2011 bugs/95.126.136.73:48904 SENT CONTROL [bugs]: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5' (status=1)
# openvpn /etc/openvpn/client.conf
Wed Dec 28 14:41:50 2011 OpenVPN 2.2.1 i686-pc-linux-gnu [SSL] [LZO2] [EPOLL] [eurephia] built on Aug 13 2011
Wed Dec 28 14:41:50 2011 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Wed Dec 28 14:41:50 2011 LZO compression initialized
.
.
Wed Dec 28 14:41:57 2011 GID set to nobody
Wed Dec 28 14:41:57 2011 UID set to nobody
Wed Dec 28 14:41:57 2011 Initialization Sequence Completed

На сервере найдите IP адрес назначенный интерфейсу tunX:

# ip addr show
.
.
40: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0

Here we see that the server end of the tunnel has been given the IP address 10.8.0.1. Здесь мы видим, что серверу туннеля был выдан IP-адрес 10.8.0.1.

Сделайте то же самое на клиенте:

# ip addr show
.
.
37: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0

И на стороне клиента был выдан IP-адрес 10.8.0.6.

Теперь попробуйте пропинговать интерфейсы

На сервере:

# ping -c3 10.8.0.6
PING 10.8.0.6 (10.8.0.6) 56(84) bytes of data.
64 bytes from 10.8.0.6: icmp_req=1 ttl=64 time=238 ms
64 bytes from 10.8.0.6: icmp_req=2 ttl=64 time=237 ms
64 bytes from 10.8.0.6: icmp_req=3 ttl=64 time=205 ms

--- 10.8.0.6 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 205.862/227.266/238.788/15.160 ms

На клиенте:

# ping -c3 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=158 ms
64 bytes from 10.8.0.1: icmp_req=2 ttl=64 time=158 ms
64 bytes from 10.8.0.1: icmp_req=3 ttl=64 time=157 ms

--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 157.426/158.278/158.940/0.711 ms

Теперь Вы имеете рабочую OpenVPN, и ваш клиент (bugs) может пользоваться сервисами сервера (Elmer) и наоборот.

Примечание: Если используется брандмауэр, убедитесь, что IP-пакеты на TUN устройстве не блокируются.

Настройка размеров MTU и MSS

Примечание: Если Вы не настроите MTU, тогда будут передаваться маленькие пакеты, такие как пинг и DNS будут работать, но просмотр веб страниц работать не будет.

Теперь необходимо настроить максимальный размер сегмента (MSS). Для того чтобы сделать это, мы должны выяснить, какой MTU является наименьши между клиентом и сервером. Для этого проверьте связь с сервером и отключите фрагментацию. Укажите максимальный размер пакета.

# ping -c5 -M do -s 1500 elmer.acmecorp.org
PING elmer.acmecorp.org (99.88.77.66) 1500(1528) bytes of data.
From 1.2.3.4 (99.88.77.66) icmp_seq=1 Frag needed and DF set (mtu = 576)
From 1.2.3.4 (99.88.77.66) icmp_seq=1 Frag needed and DF set (mtu = 576)
From 1.2.3.4 (99.88.77.66) icmp_seq=1 Frag needed and DF set (mtu = 576)
From 1.2.3.4 (99.88.77.66) icmp_seq=1 Frag needed and DF set (mtu = 576)
From 1.2.3.4 (99.88.77.66) icmp_seq=1 Frag needed and DF set (mtu = 576)

--- core.myrelay.net ping statistics ---
0 packets transmitted, 0 received, +5 errors

We received an ICMP message telling us the MTU is 576 bytes. The means we need to fragment the UDP packets smaller then 576 bytes to allow for some UDP overhead.

# ping -c5 -M do -s 548 elmer.acmecorp.org
PING elmer.acmecorp.org (99.88.77.66) 548(576) bytes of data.
556 bytes from 99.88.77.66: icmp_seq=1 ttl=48 time=206 ms
556 bytes from 99.88.77.66: icmp_seq=2 ttl=48 time=224 ms
556 bytes from 99.88.77.66: icmp_seq=3 ttl=48 time=206 ms
556 bytes from 99.88.77.66: icmp_seq=4 ttl=48 time=207 ms
556 bytes from 99.88.77.66: icmp_seq=5 ttl=48 time=208 ms

--- myrelay.net ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4001ms
rtt min/avg/max/mdev = 206.027/210.603/224.158/6.832 ms

After some trial and error..., we discover that we need to fragment packets on 548 bytes. In order to do this we specify this fragment size in the configuration and instruct OpenVPN to fix the Maximum Segment Size (MSS).

/etc/openvpn/client.conf
remote elmer.acmecorp.org 1194
.
.
fragment 548
mssfix
.
.
user nobody
group nobody
.
.
ca /etc/openvpn/ca.crt
cert /etc/openvpn/bugs.crt
key /etc/openvpn/bugs.key
.
.
tls-auth /etc/openvpn/ta.key 1
Примечание: Это добавит около 3 минут к запуску OpenVPN. Желательно настроить размер фрагмента, если только ваш клиент не является ноутбуком, который будет подключен через множество различных сетей и будет горлышком бутылки на стороне клиента.

Вы также можете позволить OpenVPN делать проверку пинга каждый раз, когда клиент подключается к VPN.

/etc/openvpn/client.conf
remote elmer.acmecorp.org 1194
.
.
mtu-test
.
.
user nobody
group nobody
.
.
ca /etc/openvpn/ca.crt
cert /etc/openvpn/bugs.crt
key /etc/openvpn/bugs.key
.
.
tls-auth /etc/openvpn/ta.key 1

Запуск OpenVPN

Ручной старт

Для отладки VPN подключений, запускайте демон вручную: # openvpn /etc/openvpn/client.conf.

Настройка запуска через systemd

Синтаксис автозапуска OpenVPN : systemctl enable openvpn@<configuration>.

Например, если файл конфигурации /etc/openvpn/client.conf, то название сервиса будет openvpn@client.service.

OpenVPN не поднимается после выхода из сна

Tango-emblem-important.pngПравильность информации, представленной в этой статье или разделе, оспариваетсяTango-emblem-important.png

Причина: Чтобы избежать проблем после обновлений в systemd, измененная конфигурация должна быть помещена в/etc/systemd/system/ (обсуждение: Talk:OpenVPN (Русский)#)

На случай, если при возобновлении работы из спящего режима OpenVPN не перезапускается, что приводит к битому подключению:

/usr/lib/systemd/system-sleep/vpn.sh
#!/bin/sh
if [ "$1" == "pre" ]
then
  killall openvpn
fi

Дайте файлу права на исполнение chmod a+x /usr/lib/systemd/system-sleep/vpn.sh

Добавьте Restart=always в /usr/lib/systemd/system/openvpn@.service

Развертывание L3 IP маршрутизации

Необходимые условия для маршрутизации локальной сети

IPv4 переадресация

Чтобы хост мог пересылать IPv4 пакеты между локальной сетью и VPN, он должен уметь перенаправлять пакеты между его NIC и tun/tap устройствами.

Отредактируйте или создайте etc/sysctl.d/99-sysctl.conf чтобы включить постоянную пересылку пакетов IPv4 (изменения вступят в силу при следующей загрузке):

/etc/sysctl.d/99-sysctl.conf
# Enable packet forwarding
net.ipv4.ip_forward=1
Совет: Для временного включения без необходимости перезагрузки: # echo 1 > /proc/sys/net/ipv4/ip_forward

Неразборчивый режим LAN интерфейса

Для переадресации хост NIC (к примеру enp1s0) должен быть установлен в таком состоянии, чтобы он мог принимать пакеты с отличных от настроенного IP-адреса, называемом неразборчивый режим. Установите enp1s0 в неразборчивый режим средствами systemd, используя этот файл службы и задействуйте его, выполнив:

 # systemctl enable promiscuous@enp1s0
Совет: Чтобы временно включить без перезагрузки, выполните: # ip link set dev enp1s0 promisc on.
Примечание: Хорошим тоном будет отдать эту работу правилу MASQUERADE.

Маршрутизация

Tango-emblem-important.pngПравильность информации, представленной в этой статье или разделе, оспариваетсяTango-emblem-important.png

Причина: Выясните, какие из протоколов маршрутизации могут быть использованы (RIP, QUAGGA, BIRD,и т.д.) (обсуждение: Talk:OpenVPN (Русский)#)

По умолчанию все IP пакеты из LAN направляются на шлюз по умолчанию. Если LAN/VPN шлюз является шлюзом по умолчанию, то проблем нет. Однако в противном случае шлюз не будет знать куда направлять пакеты. Решается это следующим образом.

  • Добавлением статических маршрутов через VPN шлюз на подсеть LAN/VPN.
  • Добавлением статических маршрутов на каждый хост в сети для отправки IP пакетов обратно на VPN.
  • Использование iptables' NAT на LAN/VPN шлюзе для маскарадинга входящих с VPN IP пакетов.

Связь локальной сети сервера с клиентом

Пусть на стороне сервера используется подсеть 10.66.0.0/24. Чтобы эта подсеть была доступна клиенту, добавьте параметр push в файл конфигурации сервера:
/etc/openvpn/server.conf
push "route 10.66.0.0 255.255.255.0"
Примечание:
  • Не забудьте включить IPv4 переадресацию и перевести LAN интерфейс сервера в неразборчивый режим. Убедитесь, что локальная сеть на стороне сервера знает, как связаться с клиентом VPN.
  • Для маршрутизации других локальных сетей со стороны сервера к клиенту, укажите их в параметре push файла конфигурации сервера. Однако имейте в виду, что эти сети также должны знать, как установить связь с клиентом VPN.

Связь локальной сети клиента с сервером

Необходимые условия:

  • Любая подсеть, используемая на стороне клиента, должна быть уникальной и не используемой на сервере или любом другом клиенте. Например пусть локальная подсеть клиента будет 192.168.4.0/24.
  • Сертификат каждого клиента должен иметь уникальное имя, в данном примере bugs.
  • The server may not use the duplicate-cn directive in its config file.

Создайте каталог настройки клиентов на сервере (например ccd - client config dir). Сервер в нем будет искать файлы с именем, идетничным названию клиента, и указанные в нем параметры будут применяться к клиенту при подключении.

# mkdir -p /etc/openvpn/ccd

Создайте в этом каталоге файл, назвав его bugs, содержащий iroute 192.168.4.0 255.255.255.0 параметр. Это укажет серверу направлять пакеты с подсети к клиенту

/etc/openvpn/ccd/bugs
iroute 192.168.4.0 255.255.255.0

Добавьте в конфиг. сервера строку с параметром каталога настройки клиентов . Укажите серверу направлять пакеты подсети туннеля на сервер локальной сети route 192.168.4.0 255.255.255.0

/etc/openvpn/server.conf
client-config-dir ccd
route 192.168.4.0 255.255.255.0
Примечание:
  • Не забудьте включить IPv4 переадресацию и перевести LAN интерфейс клиента в неразборчивый режим. Убедитесь, что локальная сеть на стороне клиента знает, как связаться с сервером VPN.
  • Для маршрутизации других LAN от клиента к серверу,укажите их в параметрах iroute и route в соответствующих файлах конфигурации. Однако имейте в виду, что эти подсети также должны знать, как установить связь с сервером VPN

Связь клиента и сервера с их локальными сетями

Совмещает два предыдущих раздела:

/etc/openvpn/server.conf
push "route 10.66.0.0 255.255.255.0"
client-config-dir ccd
route 192.168.4.0 255.255.255.0
/etc/openvpn/ccd/bugs
iroute 192.168.4.0 255.255.255.0
Примечание: Не забудьте включить IPv4 переадресацию и перевести в неразборчивый режим интерфейсы LAN как на клиенте и на сервере. Убедитесь в том, что все хосты локальной сети могут установить маршрут ко всем адресатам.

Связь клиентов с другими локальными сетями

По умолчанию клиенты не видят друг друга. Чтобы разрешить обмениваться пакетами между клиентами и клиентскими сетями, добавьте client-to-client в файл конфигурации сервера:
/etc/openvpn/server.conf
client-to-client


Чтобы клиенты сервера и другие сети были доступны друг для друга, пропишите маршруты для каждой подсети в файл конфигурации сервера

/etc/openvpn/server.conf
client-to-client
push "route 192.168.4.0 255.255.255.0"
push "route 192.168.5.0 255.255.255.0"
Примечание: Убедитесь, что маршрутизация настроена правильно.

L2 Ethernet мосты

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Please add a well thought out section on L2 bridging. (Discuss in Talk:OpenVPN (Русский)#)

For now see: OpenVPN Bridge

Contributions that do not yet fit into the main article

Tango-emblem-important.pngПравильность информации, представленной в этой статье или разделе, оспариваетсяTango-emblem-important.png

Причина: Нет уверенности, что данная информация подходит для этой статьи (обсуждение: Talk:OpenVPN (Русский)#)

Routing client traffic through the server

Append the following to your server's openvpn.conf configuration file:

push "redirect-gateway def1"
push "dhcp-option DNS 192.168.1.1"

Change "192.168.1.1" to your preferred DNS IP address.

If you have problems with non responsive DNS after connecting to server, install BIND as simple DNS forwarder and push the IP address of the OpenVPN server as DNS to clients.

Configure ufw for routing

Configure your ufw settings to enable routing traffic from clients through server.

You must change default forward policy as in #IPv4 forwarding.

And then configure ufw in /etc/default/ufw:

/etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

Now change /etc/ufw/before.rules, and add the following code after the header and before the "*filter" line. Don't forget to change the IP/subnet mask to match the one in /etc/openvpn/server.conf.

/etc/ufw/before.rules
# NAT (Network Address Translation) table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Allow traffic from clients to enp1s0
-A POSTROUTING -s 10.8.0.0/8 -o enp1s0 -j MASQUERADE

# don't delete the "COMMIT" line or the NAT table rules above won't be processed
COMMIT

Open OpenVPN port 1194:

ufw allow 1194

Использование iptables

Use an iptable for NAT forwarding:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp1s0 -j MASQUERADE

If running Arch Linux in a OpenVZ VPS environment [1]:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to (venet0 ip)

If all is well, make the changes permanent:

Edit /etc/conf.d/iptables and change IPTABLES_FORWARD=1

# iptables-save > /etc/iptables/iptables.rules

Deprecated older wiki content

Tango-emblem-important.pngПравильность информации, представленной в этой статье или разделе, оспариваетсяTango-emblem-important.png

Причина: Эта старая информация, возможно, может быть включена в новую статью (обсуждение: Talk:OpenVPN (Русский)#)

Using PAM and passwords to authenticate

port 1194
proto udp
mtu-test
dev tap
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/<MYSERVER>.crt
key /etc/openvpn/easy-rsa/keys/<MYSERVER>.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 192.168.56.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;learn-address ./script
client-to-client
;duplicate-cn
keepalive 10 120
;tls-auth ta.key 0
comp-lzo
;max-clients 100
;user nobody
;group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
client-cert-not-required
username-as-common-name
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so login

Аутентификация по сертификатам

port 1194
proto tcp
dev tun0

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/<MYSERVER>.crt
key /etc/openvpn/easy-rsa/keys/<MYSERVER>.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3

log-append /var/log/openvpn
status /tmp/vpn.status 10

Routing traffic through the server

Append the following to your server's openvpn.conf configuration file:

push "dhcp-option DNS 192.168.1.1"
push "redirect-gateway def1"

Change "192.168.1.1" to your external DNS IP address.

Use an iptable for NAT forwarding:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o enp1s0 -j MASQUERADE

If running Arch Linux in a OpenVZ VPS environment [2]:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to (venet0 ip)

If all is well, make the changes permanent:

Edit /etc/conf.d/iptables and change IPTABLES_FORWARD=1

# iptables-save > /etc/iptables/iptables.rules

Setting up the client

The client-side .conf file

With password authentication
client
dev tap
proto udp
mtu-test
remote <address> 1194
resolv-retry infinite
nobind
persist-tun
comp-lzo
verb 3
auth-user-pass passwd
ca ca.crt

passwd file (referenced by auth-user-pass) must contain two lines:

  • first line - username
  • second - password
Certificates authentication
client
remote <MYSERVER> 1194
dev tun0
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
verb 2
ca ca.crt
cert client1.crt
key client1.key
comp-lzo

Copy three files from server to remote computer.

ca.crt
client1.crt
client1.key

Install the tunnel/tap module:

# modprobe tun

To have the tun module loaded automatically at boot, read Kernel modules (Русский).

DNS

The DNS servers used by the system are defined in /etc/resolv.conf. Traditionally, this file is the responsibility of whichever program deals with connecting the system to the network (e.g. Wicd, NetworkManager, etc...) However, OpenVPN will need to modify this file if you want to be able to resolve names on the remote side. To achieve this in a sensible way, install openresolv, which makes it possible for more than one program to modify resolv.conf without stepping on each-other's toes. Before continuing, test openresolv by restarting your network connection and ensuring that resolv.conf states that it was generated by "resolvconf", and that your DNS resolution still works as before. You should not need to configure openresolv; it should be automatically detected and used by your network system.

Next, save the following script at /usr/share/openvpn/update-resolv-conf:

#!/bin/bash
#
# Parses DHCP options from openvpn to update resolv.conf
# To use set as 'up' and 'down' script in your openvpn *.conf:
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
#
# Used snippets of resolvconf script by Thomas Hood <jdthood@yahoo.co.uk>
# and Chris Hanson
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.
# 07/2013 colin@daedrum.net Fixed intet name
# 05/2006 chlauber@bnc.ch
#
# Example envs set from openvpn:
# foreign_option_1='dhcp-option DNS 193.43.27.132'
# foreign_option_2='dhcp-option DNS 193.43.27.133'
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'
# foreign_option_4='dhcp-option DOMAIN-SEARCH bnc.local'

set -e

## You might need to set the path manually here, i.e.
# RESOLVCONF=/usr/bin/resolvconf
RESOLVCONF=$(which resolvconf)
[ -x $RESOLVCONF ] || exit 0

case $script_type in

up)
   for optionname in ${!foreign_option_*} ; do
      option="${!optionname}"
      echo $option
      part1=$(echo "$option" | cut -d " " -f 1)
      if [ "$part1" == "dhcp-option" ] ; then
         part2=$(echo "$option" | cut -d " " -f 2)
         part3=$(echo "$option" | cut -d " " -f 3)
         if [ "$part2" == "DNS" ] ; then
            IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
         fi
         if [[ "$part2" == "DOMAIN" || "$part2" == "DOMAIN-SEARCH" ]] ; then
            IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"
         fi
      fi
   done
   R=""
   for DS in $IF_DNS_SEARCH ; do
           R="${R}search $DS
"
   done
   for NS in $IF_DNS_NAMESERVERS ; do
           R="${R}nameserver $NS
"
   done
   #echo -n "$R" | $RESOLVCONF -p -a "${dev}"
   echo -n "$R" | $RESOLVCONF -a "${dev}.inet"
   ;;
down)
   $RESOLVCONF -d "${dev}.inet"
   ;;
esac

Remember to make the file executable with:

 $ chmod +x /usr/share/openvpn/update-resolv-conf

Next, add the following lines to your OpenVPN client configuration file:

script-security 2
up /usr/share/openvpn/update-resolv-conf
down /usr/share/openvpn/update-resolv-conf

Now, when your launch your OpenVPN connection, you should find that your resolv.conf file is updated accordingly, and also returns to normal when your close the connection.

Caveat: The script will fail to restore the original DNS settings if your OpenVPN client.conf is set-up to drop root privileges after connection.

Webmin

webmin-plugin-openvpnAUR[ссылка недействительна: сохранено в aur-mirror] is available in the AUR.

Примечание: You must add "openvpn" to the end of /etc/webmin/webmin.acl

Connecting to the server

You need to start the service on the server

systemctl start openvpn@server

To make it permanent:

systemctl enable openvpn@server

On the client, in the home directory create a folder that will hold your OpenVPN client config files along with the .crt/.key files. Assuming your OpenVPN config folder is called .openvpn and your client config file is vpn1.conf, to connect to the server issue the following command:

# cd ~/.openvpn && openvpn vpn1.conf

Troubleshooting

Resolve issues

If you are having resolve issues when starting your profile:

# journalctl _SYSTEMD_UNIT=openvpn@profile.service
RESOLVE: Cannot resolve host address: example.com: Name or service not known

Tango-emblem-important.pngПравильность информации, представленной в этой статье или разделе, оспариваетсяTango-emblem-important.png

Причина: Выставление порядка для After=network.target работает не универсально. Смотрите страницу network.target (обсуждение: Talk:OpenVPN (Русский)#)

Then, only if your network setup can be started before OpenVPN, you should force OpenVPN to wait for the network by adding Requires=network.target and After=network.target to the OpenVPN systemd service file:

/usr/lib/systemd/system/openvpn@.service
[Unit]
Description=OpenVPN connection to %i
Requires=network.target
After=network.target
...

Don't forget to restart OpenVPN:

# systemctl daemon-reload
# systemctl restart openvpn@profile

Ссылки