- Из песочницы
- Tutorial
Однажды у меня появилась необходимость иметь доступ к локальной сети из удаленного места. Для выполнения данной задачи на 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.
Шаг второй — «Мостостроительство»
Запускаем Системные настройки и выбираем Сеть. Жмем на шестеренку и выбираем «Управлять виртуальными интерфейсами». Далее кликаем на плюс и выбираем «Новый мост…». Здесь мы никогда не увидим наш интерфейс «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" <plist><dict><key>KeepAlive</key><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></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», выбираем из списка свою конфигурацию и жмем кнопку «Соединится». И если все сделано правильно то через несколько секунд у нас уже есть полный доступ к удаленной локальной сети включая все мультикаст протоколы.Список литературыprovideotech.org/bonjour-and-vpn-or-how-i-learned-to-stop-googling-and-love-simplicitywww.yazsoft.com/products/sharetooltuntaposx.sourceforge.netcode.google.com/p/tunnelblickДекабрь, 10th 2017Рубрика:Apple | Советы 28076Подписаться накомментарии по RSS
Продолжаю знакомить своих подписчиков с защищенными канала связи. Недавно публиковался пост про установку OpenVPN сервера и клиента на роутер с прошивкой DD-WRT. Сегодня хочу рассказать о настройке OpenVPN клиента на macOS, что позволяет легко и безопасно связываться с удаленным офисом, собственным домом или любым сервером, на котором настроен OpenVPN.
Собственно, углубляться в подробные повествования тут особенно не нужно, настройку OpenVPN клиента для Windows я описывал ранее в блоге. В Mac OS X все еще проще. Есть замечательный бесплатный клиент — Tunnelblick.
- Первым делом создаем папку (где удобно) в которую положим наш файл конфигурации VPN соединения и ключи
- Создаем в этой папке сам файл конфигурации .ovpn (подробнее читайте OpenVPN клиент для Windows)
- Туда же положим клиентcкий ключ и сертификаты клиента и сервера (client.key, client.crt, ca.crt).Даем папке расширение
.tblk</ol>
Остается только добавить созданную конфигурацию в программу Tunnelblick:
Хочу заметить, что Tunnelblick прекрасно воспринимает и стандартные настройки конфигурации, как это делалось в Windows, но разработчики рекомендуют использовать формат .tblk
Используемые источники:
- https://habr.com/post/206322/
- https://mdex-nn.ru/page/tunnelblick-openvpn-klient-dlja-mac.html