Как настроить OpenVPN на Mac OS X
Однажды у меня появилась необходимость иметь доступ к локальной сети из удаленного места. Для выполнения данной задачи на iMac был поставлен OSX server в котором был настроен удаленный доступ VPN. Все работало вполне сносно кроме mDNS(Bonjour). Как оказалось данная реализация VPN не поддерживает мультикаст. А он был жизненно необходим из за наличия некоторых специальных приложений которые работают только в локальной сети.
После непродолжительного поиска нашлось несколько решений данной проблемы. Одно из них бесплатное предполагало установку программы «Network Beacon» и прописывания в ней руками путей к службам «Bonjour». Другое решение было платным и предполагало установку специального приложения «ShareTool» которое во первых может строить собственные SSH туннели и во вторых передавать по туннелю информацию о службах на стороне сервера.
Минусов у этого решения два. Первый это то что надо покупать лицензию на каждую машину. Ну и второй заключается в том что это решение все равно костыль. А мне хотелось все сделать как можно чище.
Решением оказалась постройка VPN моста на базе OPENVPN MAC OS с виртуальным адаптером «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"?>
<!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», выбираем из списка свою конфигурацию и жмем кнопку «Соединится». И если все сделано правильно то через несколько секунд у нас уже есть полный доступ к удаленной локальной сети включая все мультикаст протоколы.