Как стать автором
Обновить

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

Время на прочтение 6 мин
Количество просмотров 51K
Однажды у меня появилась необходимость иметь доступ к локальной сети из удаленного места. Для выполнения данной задачи на 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

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


Далее кликаем на плюс и выбираем «Новый мост…».

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

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


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


Следующий этап представляет из себя создание скрипта который должен выполнить две функции. Во первых убедить ядро пропускать пакеты и во вторых добавить интерфейс «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», выбираем из списка свою конфигурацию и жмем кнопку «Соединится». И если все сделано правильно то через несколько секунд у нас уже есть полный доступ к удаленной локальной сети включая все мультикаст протоколы.

Теги:
Хабы:
+5
Комментарии 2
Комментарии Комментарии 2

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн