OpenVPN Руководство по установке для новичков
Данная статья является руководством для начинающих по установке OpenVPN соединения на OpenWrt. Основная цель данного документа - получить рабочий OpenVPN туннель и установить базовую платформу для дальнейшей настройки.
Ссылки на страницы дальнейшей конфигурации можно найти Other Considerations разделе этого руководства.
Сценарий использования (начальная настройка)
Пользователь хочет безопасно соединиться с 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 как клиент, требуемые сертификаты должны были быть предоставлены вам с вашими конфигурационными данными.
easyrsa init-pki nopass easyrsa build-ca easyrsa gen-dh easyrsa build-server-full my-server nopass easyrsa build-client-full my-client nopass
Вышеприведённые команды создадут сертификат сервера с именем my-server и сертификат клиента с именем my-client.
Путь сохранения сертификатов и ключей по умолчанию /root/pki.
Вы можете создать несколько клиентских сертификатов, запустив easyrsa build-client-full
несколько раз и указав разные имена.
Вы можете создать новый набор сертификатов, запустив clean-all
и те же команды снова.
Распределение сертификатов
Скопируйте ключи сервера в папку /etc/openvpn/.
cp /root/pki/ca.crt /root/pki/private/my-server.* /root/pki/issued/my-server.* /root/pki/dh.pem /etc/openvpn
Скопируйте ключи для клиентов через SCP(SSH для передачи файлов). Теперь вы можете распространять клиентские ключи различными путями (например через USB-накопитель).
scp /root/pki/ca.crt /root/pki/private/my-client.* root@CLIENT_IP_ADDRESS:/etc/openvpn
Настройка сети на OpenWrt маршрутизаторе
Традиционный (TUN) Сервер
- Создайте 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
- Разрешите входящие подключения клиентов открыв порт на сервере (по умолчанию 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
- Создайте зону межсетевого экрана (с именем 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
- (Необязательно) Если вы планируете разрешить клиентам подключаться к компьютерам в вашей локальной сети, вам необходимо разрешить перенаправление трафика 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
- (Необязательно) Точно так же, если вы хотите, чтобы ваши 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
- Внесите изменения:
uci commit network /etc/init.d/network reload uci commit firewall /etc/init.d/firewall reload
Сервер в режиме моста(TAP)
- Создайте 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
- Добавьте интерфейс для LAN моста:
uci set network.lan.ifname="$(uci get network.lan.ifname) tap0"
- Разрешите входящие клиентские соединения, для этого откройте порт на сервере (по умолчанию 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
- Внесите изменения:
uci commit network /etc/init.d/network reload uci commit firewall /etc/init.d/firewall reload
Клиент
- Создайте 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
- Создайте зону межсетевого экрана (с именем 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
- (Необязательно) Если вы планируете разрешить общаться пользователям за вашим 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
- Внесите изменения:
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/dh.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/dh.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
Трафик внутри локальной подсети (192.168.7.XXX) будет маршрутизироваться через VPN без какой-либо дальнейшей настройки. Остальной трафик будет маршрутизироваться на шлюз по умолчанию. Для пинга клиента используйте:
traceroute 192.168.7.100 #Пример IP. Укажите IP вашей подсети.
Если вам требуется только доступ к интрасети и не требуется направлять обычный интернет-трафик (WAN) через VPN, ваша конфигурация завершена!
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).
- Various other configuration examples can be found here: server.tun
- The OpenVPN manual can be found here: OpenVPN 2.3 man-page
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