Строим OpenVPN мост под Mac OSX

в 9:10, , рубрики: apple, bridge, mac os, mac os x, openvpn, osx, vpn, метки: , , , ,

Однажды у меня появилась необходимость иметь доступ к локальной сети из удаленного места. Для выполнения данной задачи на iMac был поставлен OSX server в котором был настроен удаленный доступ VPN. Все работало вполне сносно кроме mDNS(Bonjour). Как оказалось данная реализация VPN не поддерживает мультикаст. А он был жизненно необходим из за наличия некоторых специальных приложений которые работают только в локальной сети.

После непродолжительного поиска нашлось несколько решений данной проблемы. Одно из них бесплатное предполагало установку программы «Network Beacon» и прописывания в ней руками путей к службам «Bonjour». Другое решение было платным и предполагало установку специального приложения «ShareTool» которое во первых может строить собственные SSH туннели и во вторых передавать по туннелю информацию о службах на стороне сервера.

Минусов у этого решения два. Первый это то что надо покупать лицензию на каждую машину. Ну и второй заключается в том что это решение все равно костыль. А мне хотелось все сделать как можно чище.

Решением оказалась постройка VPN моста на базе OpenVPN с виртуальным адаптером «tap».
Но как это сделать? В сети я нашел много разных инструкций по настройке подобной конфигурации но ни одного варианта постройки моста под OSX.

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

Шаг первый — Настраиваем OpenVPN

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

sudo -s 

Для начала устанавливаем драйвер TunTap
Загрузить его можно по этой ссылке: tuntap_20111101.tar.gz
Распаковываем, запускаем инсталлятор. После окончания установки загружаем модули в ядро.

kextload /Library/Extensions/tun.kext
kextload /Library/Extensions/tap.kext

Далее устанавливаем и сам OpenVPN посредством MacPorts.

port install openvpn2

Для тех кто еще не знает — Easy-RSA больше не входит в состав пакета OpenVPN по этому качаем его отдельно по ссылке:
easy-rsa-release-2.x.zip

Для большего удобства копируем содержимое папки «openvpn2» в "/etc/openvpn".

cp -r /opt/local/share/doc/openvpn2 /etc/openvpn

Распаковываем в нее Easy-RSA 2.

mkdir /etc/openvpn/easy-rsa
unzip –j easy-rsa-release-2.x.zip easy-rsa-release-2.x/easy-rsa/2.0/* -d /etc/openvpn/easy-rsa/2.0/

Правим под себя vars и генерируем ключи. Правка «vars» заключается в исправлении информации о держателе сертификата и ключа а также изменении (при необходимости) длинны параметров Диффи — Хеллмана.

cd /etc/openvpn/easy-rsa/2.0
nano vars
source vars
./clean-all
./build-ca

Для сервера.

./build-key-server server

И клиента.

./build-key client

В заключении генерируем параметры Диффи — Хеллмана.

./build-dh

Правим образец из "/etc/openvpn/sample-config-files/" или создаем новый «server.conf».
Для примера мой вариант

# Порт сервера
port 1194
# Протокол
proto udp
# Тип виртуального интерфейса. Это важно.
dev tap
# Ключи и сертификаты созданные ранее
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
# Параметры Диффи Хелмана в зависимости от выбранных при редактировании vars. "dh1024.pem" или "dh2048.pem"
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
# Сохраняем адреса клиентов между сессиями
ifconfig-pool-persist /etc/openvpn/ipp.txt
# Настраиваем мост и выделяем адресное пространство. 
server-bridge 192.168.2.2 255.255.255.0 192.168.2.224 192.168.2.254
# Обьясняем клиенту где искать нашу сеть
push "route 192.168.2.0 255.255.255.0"
# Указываем скрипт который запускается после успешной настройки виртуального интерфейса
script-security 2
up /etc/openvpn/scripts/up.sh
# Здесь указываем скрипт который запускается после удачного подключения клиента. 
# Например для прописывания маршрута к удаленной сети в таблицу маршрутизации.
learn-address /etc/openvpn/scripts/routes.sh
# Хочу что бы клиенты видели друг друга.
client-to-client
# Хочу иметь возможность подключатся с одинаковыми ключами с разных машин
duplicate-cn
# Пингуем клиента каждые 10 секунд и перезапускаем туннель если в течении 60 секунд не получили ответа.
keepalive 10 60
# Включаем сжатие
comp-lzo
# Не читаем заново ключи при перезапуске туннеля
persist-key
# Не сносим виртуальный интерфейс при перезапуске OpenVPN
persist-tun
# Устанавливаем уровень отладки. После удачного запуска можно смело менять на 1 или даже 0
verb 3

Теперь переходим к следующему этапу создаем мост средствами самой MacOS.

Шаг второй — «Мостостроительство»

Запускаем Системные настройки и выбираем Сеть.
image

Жмем на шестеренку и выбираем «Управлять виртуальными интерфейсами».
Строим OpenVPN мост под Mac OSX

Далее кликаем на плюс и выбираем «Новый мост…».
Строим OpenVPN мост под Mac OSX
Здесь мы никогда не увидим наш интерфейс «tap» даже при запущенном сервере OpenVPN. Но как оказалось при всей «дружественности» MacOs дает возможность создать сетевой мост с одним интерфейсом. А это как раз то что нам необходимо. Выбираем адаптер которым мы подключены к сети и обзываем мост по своему усмотрению. Жмем «создать» и «готово».

Далее настраиваем подключение моста также как был настроен сетевой интерфейс и кликаем Применить.
Строим OpenVPN мост под Mac OSX

Все, сеть настроена и окно можно закрывать. Оно больше не понадобится.
Теперь можно проверить в терминале наличие моста с одним членом. Запускаем команду «ifconfig» и убеждаемся в наличии моста bridge0 с одним членом в роли которого выступает интерфейс который мы выбрали при его создании.
Строим OpenVPN мост под Mac OSX

Следующий этап представляет из себя создание скрипта который должен выполнить две функции. Во первых убедить ядро пропускать пакеты и во вторых добавить интерфейс «tap» в мост.

Шаг третий — Запуск

Создаем файл "/etc/openvpn/scripts/up.sh".

#!/bin/bash
# Убеждаем ядро пропускать ARP ко всем интерфейсам
/usr/sbin/sysctl -w net.link.ether.inet.proxyall=1
# Просим ядро поработать рутером и перенаправлять пакеты между интерфейсами 
/usr/sbin/sysctl -w net.inet.ip.forwarding=1
# Добавляем интерфейс tap в мост
/sbin/ifconfig bridge0 addm tap0

Сохраняем и делаем его исполняемым.

chmod +x /etc/openvpn/scripts/up.sh

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

Проверяем конфигурацию

/opt/local/sbin/openvpn2 –config /etc/openvpn/server.conf

Сервер запустился? Если да то убиваем его «Control+C». Если вылетел с ошибками то смотрим с какими и исправляем.

Теперь переходим к автозапуску сервера.

Создаем файл "/Library/LaunchDaemons/org.openvpn.bridge.plist" следующего содержания.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<true/>
	<key>Label</key>
	<string>org.openvpn.bridge</string>
	<key>ProgramArguments</key>
	<array>
		<string>/opt/local/sbin/openvpn2</string>
		<string>--config</string>
		<string>/etc/openvpn/server.conf</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>

Сохраняем и запускаем сервер.

launchctl load /Library/LaunchDaemons/org.openvpn.bridge.plist

Все, с запуском сервера справились. Переходим к клиенту.

Шаг четвертый — Клиент

Я коротко опишу только вариант запуска клиента из под MacOS. Так как я подключаюсь к этому серверу с МакБука, и у меня не было необходимости ставить на него Xcode и MacPorts, я решил использовать решение типа «все включено» каким является «Tunnelblick».

Создаем папку конфигурации. Например на рабочем столе. Делать это проще на сервере. Далее будет понятно почему.
В папке создаем файл «config.ovpn» и прописываем конфигурацию.

Пример.

client
dev tap
proto udp
# Указываем адрес и порт своего сервера
# Если адрес статический то достаточно прописать IP.
remote my.server.tld 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
comp-lzo
verb 3

Сохраняем и копируем в ту же папку ключи и сертификаты созданные в начале.

cp /etc/openvpn/easy-rsa/2.0/keys/ca.crt /Users/username/Desktop/MyVpnConfig/
cp /etc/openvpn/easy-rsa/2.0/keys/client.crt /Users/username/Desktop/MyVpnConfig/
cp /etc/openvpn/easy-rsa/2.0/keys/client.key /Users/username/Desktop/MyVpnConfig/

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

chown -R username:staff /Users/username/Desktop/MyVpnConfig
exit

Далее переименовываем папку с конфигурацией и ключами (имя папки будет названием конфигурации в «Tunnelblick») и добавляем расширение ".tblk"

mv /Users/username/Desktop/MyVpnConfig /Users/username/Desktop/MyVpnConfig.tblk

После этого переносим конфигурацию на клиент с установленным «Tunnelblick» любым удобным способом. После чего открываем «Finder» находим расположение конфигурации и щелкаем по ней дважды. Она автоматически добавится к конфигурациям.
Запускаем «Tunnelblick», выбираем из списка свою конфигурацию и жмем кнопку «Соединится». И если все сделано правильно то через несколько секунд у нас уже есть полный доступ к удаленной локальной сети включая все мультикаст протоколы.

Автор: EDLV

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js