User Tools

Site Tools


ru:doc:howto:vpn.openvpn

OpenVPN Руководство по установке для новичков

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

Ссылки на страницы дальнейшей конфигурации можно найти Other Considerations разделе этого руководства.

Для просмотра всех статей, относящихся к VPN(в том числе и других VPN технологий) см. overview.

Сценарий использования (начальная настройка)

Пользователь хочет безопасно соединиться с OpenWrt маршрутизатором. На данный момент пользователь уже может получить доступ к OpenWrt маршрутизатору, но через внешнюю сеть, такую как Интернет. Конечным результатом станет прямое частное соединение между OpenVPN клиентом и сервером. В основном это будет выглядеть так, будто OpenVPN клиент находится в подсети маршрутизатора(но не в той подсети, которая является для маршрутизатора внешней).

Это руководство описывает 3 файла конфигурации для OpenVPN:

  • Стандартный (TUN) Сервер: Простейший вид OpenVPN сервера, Клиенты управляются исключительно OpenVPN, им также может быть выделена отдельная подсеть.
  • Сервер в режиме моста (TAP) : Также может называться “ethernet-bridge”. Эта конфигурация создаст виртуальный ethernet кабель между сервером и клиентом. Это означает что OpenVPN клиенты будут такими же участниками подсети, как и те которые подключены к маршрутизатору физически. IP-адреса им будет раздавать DHCP-сервер.
  • Клиент: OpenVPN будет работать в режиме клиента и соединится с OpenVPN сервером.

Следует отметить, что TAP это не синоним сетевого моста, тем не менее TAP адаптер нужен для сетевого моста, в то же время рекомендуется использовать TUN, если не нужен сетевой мост. Для простоты мы будем использовать эти термины как взаимозаменяемые, так как сравнение терминов “сервер” и “сервер-мост” может привести к путанице. TUN будет использоваться для обозначения традиционного сервера, в то время как TAP будет относиться к “серверу-мосту”.

Можно настраивать OpenVPN на OpenWrt удалённо. Однако рекомендуется делать это локально, так как это упростит поиск и устранение неисправностей.

TUN сервер расходует меньше ресурсов и только отсылает трафик, предназначенный только для клиента. В то время, как TAP сервер менее эффективный и отсылает клиентам широковещательный трафик.

TUN сервер может использовать ту же подсеть, что и сервер DHCP, если это требуется, однако рекомендуется выделять диапазон IP-адресов для TUN сервера за пределами диапазона DHCP, иначе могут возникнуть IP конфликты (один IP-адрес будет использоваться как DHCP, так и TUN сервером для двух разных клиентов).

Для TUN сервера легче настроить безопасность, так как его клиенты могут находиться в отдельной подсети, которая может легко контролироваться межсетевым экраном. Благодаря тому, что клиентам в данном режиме не отсылается широковещательная информация, злоумышленник не сможет получить доступ к большому объёму данных.

Сервер TAP объединяет клиентов в сеть более бесшовной образом, это может упростить процесс настройки различных сетевых приложений. Обратите внимание на то, что независимо от выбранного метода, создание правил межсетевого экрана имеет более важное значение безопасности, чем выбор между TUN и TAP сервером.

:!: При использовании TAP сервера рекомендуется изменить маску подсети на отличную от 192.168.0.XXX или 192.168.1.XXX. Они очень распространены и приведут к конфликтам в маршрутизации. Это обычно может быть достигнуто путём изменения IP-адреса OpenWrt/OpenVPN маршрутизатора к чему-то наподобие 192.168.7.1

Системные требования

Для работы по данному руководству нужен OpenVPN сервер на OpenWrt маршрутизаторе с запущенным OpenWrt 15.05 Chaos Calmer.

Установка необходимого ПО

opkg update
opkg install openvpn-openssl openvpn-easy-rsa

Создание сертификатов

Если вы создаёте OpenVPN сервер (любого типа), вы должны создать сертификаты безопасности по нижеприведённым инструкциям. Если вы используете OpenVPN как клиент, требуемые сертификаты должны были быть предоставлены вам с вашими конфигурационными данными.

build-ca
build-dh
build-key-server my-server
build-key-pkcs12 my-client

Вышеприведённые команды создадут сертификат сервера с именем my-server и сертификат клиента с именем my-client. Вы можете создать несколько клиентских сертификатов, запустив build-key-pkcs12 несколько раз и указав разные имена.

Вы можете создать новый набор сертификатов, запустив clean-all и те же команды снова.

Распределение сертификатов

Скопируйте ключи сервера в папку /etc/openvpn/.

cp /etc/easy-rsa/keys/ca.crt /etc/easy-rsa/keys/my-server.* /etc/easy-rsa/keys/dh2048.pem /etc/openvpn

Скопируйте ключи для клиентов через SCP(SSH для передачи файлов). Теперь вы можете распространять клиентские ключи различными путями (например через USB-накопитель).

scp /etc/easy-rsa/keys/ca.crt /etc/easy-rsa/keys/my-client.* root@CLIENT_IP_ADDRESS:/etc/openvpn

Настройка сети на OpenWrt маршрутизаторе

Традиционный (TUN) Сервер

  1. Создайте VPN интерфейс (с именем vpn0):
    uci set network.vpn0=interface
    uci set network.vpn0.ifname=tun0
    uci set network.vpn0.proto=none
    uci set network.vpn0.auto=1
  2. Разрешите входящие подключения клиентов открыв порт на сервере (по умолчанию 1194) в вашем межсетевом экране:
    uci set firewall.Allow_OpenVPN_Inbound=rule
    uci set firewall.Allow_OpenVPN_Inbound.target=ACCEPT
    uci set firewall.Allow_OpenVPN_Inbound.src=*
    uci set firewall.Allow_OpenVPN_Inbound.proto=udp
    uci set firewall.Allow_OpenVPN_Inbound.dest_port=1194
  3. Создайте зону межсетевого экрана (с именем vpn) для новой vpn0 сети. Это разрешит входящие и исходящие соединения, необходимые для VPN туннеля. Измените значение по умолчанию в соответствии с требованиями. Это (пока) не разрешит получить доступ к LAN или WAN сетям, но разрешит клиентам взаимодействовать с сервисами на маршрутизаторе и может разрешить соединения VPN клиентам, если это позволяет конфигурация вашего OpenVPN сервера:
    uci set firewall.vpn=zone
    uci set firewall.vpn.name=vpn
    uci set firewall.vpn.network=vpn0
    uci set firewall.vpn.input=ACCEPT
    uci set firewall.vpn.forward=REJECT
    uci set firewall.vpn.output=ACCEPT
    uci set firewall.vpn.masq=1
  4. (Необязательно) Если вы планируете разрешить клиентам подключаться к компьютерам в вашей локальной сети, вам необходимо разрешить перенаправление трафика VPN и LAN зонами межсетевого экрана:
    uci set firewall.vpn_forwarding_lan_in=forwarding
    uci set firewall.vpn_forwarding_lan_in.src=vpn
    uci set firewall.vpn_forwarding_lan_in.dest=lan

    И вы, вероятно, захотите разрешить LAN компьютерам общаться с VPN клиентами.

    uci set firewall.vpn_forwarding_lan_out=forwarding
    uci set firewall.vpn_forwarding_lan_out.src=lan
    uci set firewall.vpn_forwarding_lan_out.dest=vpn
  5. (Необязательно) Точно так же, если вы хотите, чтобы ваши VPN клиенты имели доступ к интернету (WAN) через туннель, вы должны разрешить перенаправление трафика межу VPN и WAN зонами межсетевого экрана:
    uci set firewall.vpn_forwarding_wan=forwarding
    uci set firewall.vpn_forwarding_wan.src=vpn
    uci set firewall.vpn_forwarding_wan.dest=wan
  6. Внесите изменения:
    uci commit network
    /etc/init.d/network reload
    uci commit firewall
    /etc/init.d/firewall reload

Сервер в режиме моста(TAP)

  1. Создайте VPN интерфейс (с именем vpn0):
    uci set network.vpn0=interface
    uci set network.vpn0.ifname=tap0
    uci set network.vpn0.proto=none
    uci set network.vpn0.auto=1
  2. Добавьте интерфейс для LAN моста:
    uci set network.lan.ifname="$(uci get network.lan.ifname) tap0"
  3. Разрешите входящие клиентские соединения, для этого откройте порт на сервере (по умолчанию 1194) в вашем межсетевом экране:
    uci set firewall.Allow_OpenVPN_Inbound=rule
    uci set firewall.Allow_OpenVPN_Inbound.target=ACCEPT
    uci set firewall.Allow_OpenVPN_Inbound.src=*
    uci set firewall.Allow_OpenVPN_Inbound.proto=udp
    uci set firewall.Allow_OpenVPN_Inbound.dest_port=1194
  4. Внесите изменения:
    uci commit network
    /etc/init.d/network reload
    uci commit firewall
    /etc/init.d/firewall reload

Клиент

  1. Создайте VPN интерфейс (с именем vpn0)):
    uci set network.vpn0=interface
    uci set network.vpn0.ifname=tun0
    uci set network.vpn0.proto=none
    uci set network.vpn0.auto=1
  2. Создайте зону межсетевого экрана (с именем vpn) для новой vpn0 сети. Это разрешит входящие и исходящие соединения, необходимые для VPN туннеля. Отредактируйте эти настройки по своему усмотрению. Это (пока) не разрешит получить доступ к LAN или WAN сетям, но разрешит клиентам взаимодействовать с сервисами на маршрутизаторе и может разрешить соединения VPN клиентам, если это позволяет конфигурация вашего OpenVPN сервера :!: Если вы планируете использовать OpenVPN как второй сетевой адаптер (или замену) WAN адаптеру, рекомендуется отклонять остальной сетевой трафик(см. комментарий в коде):
    uci set firewall.vpn=zone
    uci set firewall.vpn.name=vpn
    uci set firewall.vpn.network=vpn0
    uci set firewall.vpn.input=ACCEPT #REJECT(Отклонить) если используется как замена WAN
    uci set firewall.vpn.forward=REJECT
    uci set firewall.vpn.output=ACCEPT
    uci set firewall.vpn.masq=1
  3. (Необязательно) Если вы планируете разрешить общаться пользователям за вашим LAN с клиентами за VPN сервером, вам необходимо внести соответствующее правило(для входящих данных):
    uci set firewall.vpn_forwarding_lan_in=forwarding
    uci set firewall.vpn_forwarding_lan_in.src=vpn
    uci set firewall.vpn_forwarding_lan_in.dest=lan

    (для исходящих данных)

    uci set firewall.vpn_forwarding_lan_out=forwarding
    uci set firewall.vpn_forwarding_lan_out.src=lan
    uci set firewall.vpn_forwarding_lan_out.dest=vpn
  4. Внесите изменения:
    uci commit network
    /etc/init.d/network reload
    uci commit firewall
    /etc/init.d/firewall reload

Конфигурация OpenVPN

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

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

Для простоты и последовательности, остальная часть этого руководства будет использовать интерфейс OpenWRT UCI для настройки OpenVPN, как описано ниже. Следует отметить, что раздел Routing Traffic section содержит инструкции для UCI интерфейса (Пользователям, использующим традиционные файлы конфигурации, придется подкорректировать эти команды под свою систему).

Традиционный (TUN) Сервер

echo > /etc/config/openvpn # очистите UCI конфигурацию для OpenVPN
uci set openvpn.myvpn=openvpn
uci set openvpn.myvpn.enabled=1
uci set openvpn.myvpn.verb=3
uci set openvpn.myvpn.port=1194
uci set openvpn.myvpn.proto=udp
uci set openvpn.myvpn.dev=tun
uci set openvpn.myvpn.server='10.8.0.0 255.255.255.0'
uci set openvpn.myvpn.keepalive='10 120'
uci set openvpn.myvpn.ca=/etc/openvpn/ca.crt
uci set openvpn.myvpn.cert=/etc/openvpn/my-server.crt
uci set openvpn.myvpn.key=/etc/openvpn/my-server.key
uci set openvpn.myvpn.dh=/etc/openvpn/dh2048.pem
uci commit openvpn

Сервер в режиме моста (TAP)

echo > /etc/config/openvpn # очистите UCI конфигурацию для OpenVPN
uci set openvpn.myvpn=openvpn
uci set openvpn.myvpn.enabled=1
uci set openvpn.myvpn.verb=3
uci set openvpn.myvpn.proto=udp
uci set openvpn.myvpn.port=1194
uci set openvpn.myvpn.dev=tap
uci set openvpn.myvpn.mode=server
uci set openvpn.myvpn.tls_server=1
uci add_list openvpn.myvpn.push='route-gateway dhcp'
uci set openvpn.myvpn.keepalive='10 120'
uci set openvpn.myvpn.ca=/etc/openvpn/ca.crt
uci set openvpn.myvpn.cert=/etc/openvpn/my-server.crt
uci set openvpn.myvpn.key=/etc/openvpn/my-server.key
uci set openvpn.myvpn.dh=/etc/openvpn/dh2048.pem
uci commit openvpn

Клиент

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

echo > /etc/config/openvpn # очистите UCI конфигурацию для OpenVPN
uci set openvpn.myvpn=openvpn
uci set openvpn.myvpn.enabled=1
uci set openvpn.myvpn.dev=tun
uci set openvpn.myvpn.proto=udp
uci set openvpn.myvpn.verb=3
uci set openvpn.myvpn.ca=/etc/openvpn/ca.crt
uci set openvpn.myvpn.cert=/etc/openvpn/my-client.crt
uci set openvpn.myvpn.key=/etc/openvpn/my-client.key
uci set openvpn.myvpn.client=1
uci set openvpn.myvpn.remote_cert_tls=server
uci set openvpn.myvpn.remote="SERVER_IP_ADDRESS 1194"
uci commit openvpn

Если ваш сервер требует проверки подлинности пароля:

uci set openvpn.myvpn.auth_user_pass=/path/to/password.txt

Файл password.txt должен содержать в себе логин на первой строке и пароль на второй. Этот файл следует хранить в безопасном месте.

Вы можете также использовать опцию route.nopull. Это отключит автоматическую маршрутизацию. Имейте ввиду, что вам придётся самостоятельно прописывать все маршруты, к тому же сервер по-прежнему будет сам определять свойства TCP/IP для вашего TUN/TAP устройства:

uci set openvpn.myvpn.route_nopull=1

На этом вы закончили базовую настройку. Запустите OpenVPN:

/etc/init.d/openvpn enable
/etc/init.d/openvpn start

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

Создайте клиентский конфигурационный файл OpenVPN, сохраните его с .ovpn расширением для Windows или .conf для *nix систем и отошлите его вашему клиенту:

Традиционный (TUN) Клиент

dev tun
proto udp

log openvpn.log
verb 3

ca /etc/openvpn/ca.crt
cert /etc/openvpn/my-client.crt
key /etc/openvpn/my-client.key

client
remote-cert-tls server
remote SERVER_IP_ADDRESS 1194

Клиент в режиме моста (TAP)

dev tap
proto udp

log openvpn.log
verb 3

ca /etc/openvpn/ca.crt
cert /etc/openvpn/my-client.crt
key /etc/openvpn/my-client.key

client
remote-cert-tls server
remote SERVER_IP_ADDRESS 1194

Проверка туннеля

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

Проверьте соединение в соответствии с инструкциями вашей ОС.

На OpenWrt это можно сделать с помощью команды traceroute.

Традиционный (TUN) Сервер

Проверьте соединение, введя команду:

traceroute 10.8.0.1

Тем не менее соединение с интернетом не будет идти через OpenWrt сервер без соответствующих маршрутов

traceroute 8.8.8.8 #Google-DNS сервер

После проверки работоспособности соединения вам нужно настроить встраивание маршрутов клиентам.

Server-Bridge (TAP) Server

Traffic within the local subnet (192.168.7.XXX) will be routed through the VPN without any further configuration. Other traffic will be sent through the default gateway. Ping a client using:

traceroute 192.168.7.100 #Example IP. Change to match your local subnet.

If you only require intranet access and do not want to route normal internet (WAN) traffic through your VPN, your configuration is now complete!

Client

Unless the OpenVPN option route-nopull was specified by the client, routes pushed by the server should be in place. If route-nopull was used, only the server will be accessible. Using traceroute on any address with a route pushed by the server should result in that traffic being sent through the VPN, while other addresses should be sent through the default gateway.

The OpenVPN gateway can generally be found on *nix systems using:

ifconfig tun0

And you can then test it using:

traceroute 10.8.0.1 #Arbitrary example IP

If you are not using route-nopull, then your configuration should now be complete!

Routing Traffic

Routes are what tell clients where to look for an IP address (or subnet). By having our server push routes to clients, we can direct their traffic through the VPN. If we don't push the route, then the client will send traffic through their normal gateway instead.

If you are running a client instead of a server, then the server you connected to should have pushed the appropriate routes to you already. Advanced users may wish to alter this behavior.

:!: Please be aware that just because a route is not pushed doesn't mean the client can't add it themselves and send that traffic through the VPN anyway. That is when your firewall configuration should take effect. A notable example is our TAP configuration, which has no firewall rules preventing WAN access since clients are treated the same as any other LAN client.

Traditional (TUN) Server

In order to route local LAN traffic to the server, ensure you've made the appropriate firewall changes from the network section, and have the server push the route to clients using:

uci add_list openvpn.myvpn.push='route 192.168.1.0 255.255.255.0' #Change to match your router's subnet

If you wish to route ALL (internet, WAN, etc) traffic through your VPN (effectively making a proxy), ensure you've made the appropriate firewall changes from the network section and have the server push this route instead:

uci add_list openvpn.myvpn.push='redirect-gateway def1'

Server-Bridge (TAP) Server

Traffic within your LAN network should be routed without any further configuration. If you wish to route all (internet, WAN, etc) traffic through your tunnel, have the server push the route to clients using the following:

uci add_list openvpn.myvpn.push='redirect-gateway def1'

Client

Корректные маршруты должны автоматически предоставляться сервером без дополнительной настройки. Однако, в зависимости от потребностей, продвинутый пользователь может изменить маршруты самстоятельно. Это можно сделать опцией клиента route-nopull, которая заставляет игнорировать маршруты указанные сервером. После поднятия VPN-канала пользователь может добавлять свои собственные маршруты вручную или скриптом. Это можно сделать с использованием приведенного ниже примера:

uci set openvpn.myvpn.route_nopull='1'
uci add_list openvpn.myvpn.route='123.456.789.0 255.255.255.0'
uci add_list openvpn.myvpn.route='234.567.891.0 255.255.255.0'

Обратите внимание, что использование опции route-nopull приведет к появлению ошибок в журнале OpenVPN, после того, как он отклонит перенаправленные маршруты сервера. Это нормально.

Маршрутизация из сети сервера в сеть клиента

Все указанные в этой статье настройки позволяют организовать доступ из сетей маршрутизаторов, работающих в роли клиента OpenVPN, в сеть маршрутизатора, работающего в роли сервера. После успешного поднятия канала VPN, компьютеры сети серверного маршрутизатора пингуются и доступны из клиентских сетей. Однако обратное при таких настройках невозможно. Из сети сервера ip-адреса компьтеров сети клиента не пингуются и недоступны. Сервер просто «не знает» о внутренних адресах клиентских маршрутизаторов, так как они изначально скрыты от него.

Тем не менее разработчики технологии OpenVPN предусмотрели возможность такого взаимодействия, однако, на момент написания этой части статьи (июнь 2018) возможность настроек этих опций в интерфейсе Luci или в командной строке uci разработчиками OpenWRT не была реализована. Тем не менее этот механизм доступен для использования через подключения конфигурационного файла OpenVPN. На примере сервера TUN делается это следующим образом -

Через команды uci создается VPN-соединение

uci set openvpn.myvpn=openvpn
uci set openvpn.myvpn.enabled=1
uci set openvpn.myvpn.config=/etc/easy-rsa/vpn.cfg/server.ovpn
uci commit openvpn

Файл /etc/easy-rsa/vpn.cfg/server.ovpn создается как стандартный конфигурационный файл OpenVPN, содержащий те же самые настройки, что и описаны в настоящей статье. Например:

dev tun 
proto tcp 
server 172.26.58.0 255.255.255.0 
keepalive 10 120 
port 1194 
ca /etc/easy-rsa/keys/ca.crt 
cert /etc/easy-rsa/keys/server.crt 
key /etc/easy-rsa/keys/server.key 
dh /etc/easy-rsa/keys/dh2048.pem 
 
client-config-dir /etc/easy-rsa/vpn.cfg 
ccd-exclusive 
 
verb 3 
log /etc/easy-rsa/openvpn.log 
 
push route 192.168.10.0 255.255.255.0 
route 192.168.20.0 255.255.255.0

Где строка push route 192.168.10.0 255.255.255.0 указывает на адрес сети сервера, а строка route 192.168.20.0 255.255.255.0 - маршрут к сети клиента

Основное назначение этого файла — обеспечение возможности использования опции client-config-dir и ccd-exclusive, которые на момент написания настоящей статьи (июнь 2018) не была реализована в интерфейсе uci. В опции client-config-dir сохраняется путь к каталогу содержащему индивидуальные конфигурационные файлы для маршрутизации к каждой из сетей клиентов. Имя файла должно совпадать с именем сертификата (Внимание! не путать с именем файла сертификата) В каждом файле прописывается правило маршрутизации для сервера OpenVPN пример конфигурационного файла (обычно) содержит две строки

iroute 192.168.20.0 255.255.255.0 
ifconfig-push 172.26.58.5 172.26.58.6

iroute — адрес сети клиента к которому осуществляется маршрутизация из сети сервера

ifconfig-push — указание клиентскому маршрутизатору на адрес шлюза

Подробности можно найти в описании этих стандартных опций в документации на OpenVPN

Клиентские файлы читаются сервером при создании нового vpn-соединения

После указанных действий сеть клиента должна пинговаться из сети сервера.

Other Considerations

When attempting to add an OpenVPN option which would normally use a hyphen (such as route-nopull), OpenWRT's UCI system requires you to replace the hyphen with an underscore (route_nopull).

Troubleshooting

If something doesn't work as expected while following this HOWTO:

  • Check that the client can ping the server:
    ping SERVER_IP_ADDRESS
  • Check that the OpenVPN daemon is running:
    ps | grep "openvpn"
  • Check that there is a TUN interface:
    ifconfig | grep "tun"
  • Check the log:
    cat /tmp/openvpn.log
  • You can try temporarily disabling the firewall on the OpenVPN server:
    /etc/init.d/firewall stop
  • You can clear the OpenVPN configuration and start again from scratch:
    echo > /etc/config/openvpn

Asking for help

You can ask for help on the OpenWrt forum: https://forum.openwrt.org/.

When asking for help, you should at a minimum include the contents of the following files:

cat /tmp/openvpn.log
cat /etc/config/network
cat /etc/config/firewall
cat /etc/config/openvpn
ru/doc/howto/vpn.openvpn.txt · Last modified: 2018/06/14 15:10 by dmitry_stg