Debian. Поднимаем свой OpenVPN сервер, настраиваем форвардинг и клиента
Мне понадобилось настроить OpenVPN сервер, для того, чтобы возможно было выходить через него в интернет и сделать доступными сервера во внутренней сети. Проиллюстрировать результат можно так:
Инструкция для Debian, но не думаю что будет что-то сильно отличаться на FreeBSD.
Установка и настройка сервера
Входим на сервер и устанавливаем OpenVPN:
apt-get install openvpn
Создаем файл /etc/openvpn/server.conf со следующим содержимым:
mode server daemon vpn-server #local 203.0.113.42 port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh2048.pem # либо dh1024.pem, в зависимости от размера ключа tls-server tls-auth ta.key 0 cipher DES-EDE3-CBC server 192.168.50.0 255.255.255.0 push "redirect-gateway" ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 4 mute 20 client-to-client client-config-dir ccd route 192.168.50.0 255.255.255.0
А теперь поясню параметры:
- mode server - означает, что OpenVPN будет работать в режим сервера;
- daemon
- указываем что будет работать в режиме демона, stderr/stdout будет посылаться в syslog; - local 203.0.113.42 - можете указать конкретный IP-адрес на котором надо слушать (например если у вас несколько внешних сетевых интерфесов);
- port 1194 - порт который будет слушать;
- proto udp - будем использовать UDP, так как он экономичнее по трафику, вы можете также указать "tcp";
- dev tun - использовать управляемый IP-туннель, также возможно использовать "tap" (ethernet tunnel);
- ca ca.crt - путь до сгенерированного нами файла корневого сертификата;
- cert server.crt - путь до сгенерированного нами файла сертификат сервера;
- key server.key - путь до сгенерированного нами файла приватного ключа сервера;
- dh dh2048.pem - путь до сгенерированного нами файла с параметрами Diffie Hellman (используется только для подключения через TLS-сервер);
- tls-server - включаем TLS и во время handshake представиться сервером;
- tls-auth ta.key 0 - предоставляем tls-ключ, как дополнительный слой защиты. Опция "0" (directionality) - говорит о направлении, на другой стороне (клиенте) надо указывать другое направление "1";
- cipher DES-EDE3-CBC - используемый тип шифрования пакетов;
- server 192.168.50.0 255.255.255.0 - выделяем IP-адреса с диапазоном "192.168.50.1-192.168.50.255", причем адрес "192.168.50.1" займет сам сервер, остально для клиентов;
- push "redirect-gateway" - при успешном подключении к серверу, клиенту будет установлен новый default-gateway от vpn-сервера (см. netstat -r после соединения), таким образом весь трафик пойдет через vpn-сервер;
- ifconfig-pool-persist ipp.txt - файл, в котором будут храниться связи "профиль клиента, выделенный ip-адрес", и после переподключения будет выдан снова прежний адрес;
- keepalive 10 120 - устанаваливаем количество секунд для ping и ping-restart соответвенно (Нужно для поддержания подключенного состояния между соединениями к vpn-серверу);
- comp-lzo - включаем LZO-компрессию трафика;
- user nobody - понижаем пользовательские привелегии vpn-сервера;
- group nogroup - понижаем пользовательские привелегии vpn-сервера;
- persist-key - при получении сигнала SIGUSR1 или срабатывания ping-restart не нужно перечитывать сертификаты, так как у сервера не хватит привелегий (См. предыдущий пункт, "nobody:nogroup") на эти действия;
- persist-tun - при получении сигнала SIGUSR1 или срабатывания ping-restart не нужно пересоздавать tun/tap устройства;
- status /var/log/openvpn/openvpn-status.log - путь до status-лога;
- log-append /var/log/openvpn/openvpn.log - путь до лога vpn-сервера;
- verb 4 - уровень вербойса логов, от 0 до 11, детализация по нарастающей:
- 0 - только фатальные ошибки;
- 1 - загрузочная информация, информация о соединении, сетевые ошибки;
- 2,3 - TLS данные и маршрутная информация;
- 4 - показывает параметры;
- 5 - показывает 'RrWw' символы в консоли для каждого пакета, отправленные и принятые по TCP/UDP (caps) или tun/tab (lc);
- 6-11 - отладочная информация повышающая детализацию лога;
- mute 20 - ограничиваем количество однотипных логов;
- client-to-client - разрешаем клиентам видеть друг-друга в сети;
- client-config-dir ccd - каталог с кастомными настройками для клиента (создайте файл "ccd/<someclient>" для того чтобы указывать кастомные настройки для профиля someclient);
- route 192.168.50.0 255.255.255.0 - добавляем роуты в таблицу роутов сервера, для клиентов надо использовать iroute 192.168.50.0 255.255.255.0, либо пушать роуты:
push "route 192.168.50.0 255.255.255.0"
Для того чтобы разобраться с параметрами, я читал OpenVPN: Server configuration file и man openvpn.
Создаем каталог для логов:
mkdir /var/log/openvpn/
Дальше ищем каталог "easy-rsa":
find /usr -type d -name "easy-rsa"
В новых версиях easy-rsa надо устанавливать отдельно:после чего надо перейти в каталог "/usr/share/easy-rsa/".apt-get install easy-rsa
Теперь необходимо создать ssl-сертификаты и ключи. Для этого перейдем в каталог easy-rsa, активируем окружение vars и выполним необходимые команды:
В новых версиях, например Easy-RSA 3 изменился способ создания ключей, подробнее в этой статье
# Переходим в каталог "easy-rsa", который мы нашли ранее # cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/ cd /usr/share/easy-rsa/ # Сделаем симлинк на настройки openssl (если будет другая версия, то сами укажите какая нужна вместо "openssl-1.0.0.cnf") ln -s openssl-1.0.0.cnf openssl.cnf # Активация окружения source vars # Создаем сертификат ./build-ca # Создаем ключ сервера ./build-key-server server # Создаем ключ Диффи Хельман ./build-dh # Генерируем tls-auth ключ openvpn --genkey --secret keys/ta.key
Вы можете предварительно отредактировать файл vars, указав необходимые настройки, например "код страны", "город", "название организации", "email" и т.д. Чтобы не указывать их каждый раз при генерации сертификата.
Далее, скопируем сгенерированные ключи в /etc/openvpn:
cp keys/{ca.crt,server.crt,dh2048.pem,server.key,ta.key} /etc/openvpn
Запускаем OpenVPN:
/etc/init.d/openvpn start
Предоставляем нашим клиентам доступ в интернет
Теперь, необходимо настроить на сервере доступ в интернет подключившимся по OpenVPN клиентам. Допустим, что IP-адрес внешнего интерфейса "203.0.113.42" (вы можете узнать какой у вас в ifconfig) и так как у нас Debian, то создадим правила в iptables:
iptables -A FORWARD -s 192.168.50.0/24 -j ACCEPT iptables -A FORWARD -d 192.168.50.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -j SNAT --to-source 203.0.113.42
Если вы впервые используете iptables, то создайте файл "/etc/iptables.rules" и выгрузите туда инструкции приведенные выше:После чего, добавьте в автозагрузку:iptables-save > /etc/iptables.rules
И при загрузке ОС будут активироваться ваши правила в /etc/iptables.rulesecho "pre-up iptables-restore < /etc/iptables.rules" >> /etc/network/interfaces
Если быть точнее, то надо в секцию вашего интерфейса добавить pre-up, но так как чаще всего именно в конце файла определён нужный интерфейс, то рекомендация выше будет верна. Развернутый пример:auto eth0 iface eth0 inet static hwaddress aa:bb:cc:dd:ee:ff address 203.0.113.42 netmask 255.255.240.0 gateway 203.0.113.1 pre-up iptables-restore < /etc/iptables.rules
Включаем форвардинг в ядре, в файле /etc/sysctl.conf раскомментируем строчку:
net.ipv4.ip_forward=1
Чтобы не перезагружаться сообщаем ядру о включении форвардинга:
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
На стороне сервера все настроили, теперь настроим клиента и уже можно будет пользоваться!
Генерация ключей для клиента
Эти действия производятся на сервере! Теперь необходимо сгенерировать сертификаты для каждого клиента, которому потребуется доступ к подключению к серверу OpenVPN:
# cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/ cd /usr/share/easy-rsa/ # Активация окружения source vars # Создаем ключ для пользователя ./build-key someclient # Либо с дополнительной защитой по паролю #./build-key-pass someclient # Создаем архив с ключами для клиента (ниже мы его будем скачивать) cd keys tar -czf /home/<username>/openvpn_keys.tgz someclient.* ca.crt ta.key
Если понадобится добавить еще одного пользователя, то сделайте тоже самое, только меняйте "someclient" на что-то другое.
Использование
Переключаемся на клиентский компьютер (в моём случае это Xubuntu) и копируем ключи с сервера:
mkdir /etc/openvpn/someserver cd /etc/openvpn/someserver scp username@someserver:openvpn_keys.tgz . tar -xzf openvpn_keys.tgz rm openvpn_keys.tgz
Создаем файл /etc/openvpn/someserver.conf:
client remote 203.0.113.42 redirect-gateway def1 port 1194 dev tun proto udp resolv-retry infinite nobind pull user nobody group nogroup persist-key persist-tun ca /etc/openvpn/someserver/ca.crt cert /etc/openvpn/someserver/someclient.crt key /etc/openvpn/someserver/someclient.key tls-client tls-auth /etc/openvpn/someserver/ta.key 1 cipher DES-EDE3-CBC comp-lzo mute 20 verb 3 log openvpn.log
А теперь поясню параметры:
- client - говорим что мы подключаемся как клиент;
- remote 203.0.113.42 - указываем адрес vpn-сервера;
- redirect-gateway def1 - режим, который разрешает смену default-gateway, а после остановки vpn-соединения возвращает gateway вашего провайдера;
- port 1194 - указываем порт vpn-сервера;
- dev tun - указываем такое же устройство, как и у vpn-сервера;
- proto udp - используем UDP, так как vpn-сервер тоже на UDP;
- resolv-retry infinite - ресолвим vpn-сервер до бесконечности, полезно после потери соединения и подключения снова (например после suspend в ноутбуках);
- nobind - не создаем постоянный порт для подключения клиента;
- pull - разрешаем клиенту получать от vpn-сервера push-инструкции и применять их у себя (например, изменение таблицы роутов);
- user nobody - понижаем пользовательские привелегии;
- group nogroup - понижаем пользовательские привелегии;
- persist-key - при получении сигнала SIGUSR1 или срабатывания ping-restart не нужно перечитывать сертификаты, так как у клиента не хватит привелегий (См. предыдущий пункт, "nobody:nogroup") на эти действия;
- persist-tun - при получении сигнала SIGUSR1 или срабатывания ping-restart не нужно пересоздавать tun/tap устройства;
- ca /etc/openvpn/someserver/ca.crt - путь до сгенерированного нами файла корневого сертификата;
- cert /etc/openvpn/someserver/someclient.crt - путь до сгенерированного нами файла сертификата клиента;
- key /etc/openvpn/someserver/someclient.key - путь до сгенерированного нами файла приватного ключа клиента;
- tls-client - включаем TLS и во время handshake представиться клиентом;
- tls-auth /etc/openvpn/someserver/ta.key 1 - предоставляем tls-ключ, как дополнительный слой защиты;
- cipher DES-EDE3-CBC - используемый тип шифрования пакетов (должен совдадать с серверным);
- comp-lzo - включаем LZO-компрессию трафика;
- verb 3 - уровень вербойса логов, от 0 до 11. Подробнее описывал в такой же секции конфига сервера;
- mute 20 - ограничиваем количество однотипных логов;
- log openvpn.log - путь до лога клиента.
Для того чтобы разобраться с параметрами, я читал OpenVPN: Client configuration file и man openvpn.
Запускаемся
Можно запустить все указанные в AUTOSTART (смотрите /etc/default/openvpn) подключения:
service openvpn start
Или запустить конкретное подключение так:
sudo openvpn /etc/openvpn/someserver.conf # Или так sudo service openvpn start someserver
Проверить подключение можно так:
$ sudo route -n | grep "tun0"
Если видим подключения с интерфейсом "tun0", то всё впорядке.
Проверим работает ли интернет через наш OpenVPN-сервер, для этого зайдите на сайт
Отключаем автоматическое поднятие соединения на клиенте
Я пользуюсь Xubuntu, и отключаю автостарт всех OpenVPN-профайлов так:
emacs /etc/default/openvpn
Находим AUTOSTART="none" и расскоментируем. Также там будут примеры как указать нужный профиль, например можно указать созданный нами профиль AUTOSTART="someserver".
Если у вас клиент FreeBSD, то надо добавить в /etc/rc.conf:
openvpn_enable="YES" openvpn_if="tun" openvpn_configfile="/etc/openvpn/someserver.conf"
Что еще почитать?
- Записки в хомяке - OpenVPN сервер для доступа в интернет
- Установка и настройка OpenVPN в Ubuntu Server
- Ubuntu OpenVPN Server (Настройка, соединение филиалов сеть)
- OpenVPN - Русскоязычная документация по Ubuntu
- HOWTO: Sample OpenVPN 2.0 configuration files
- OpenVPN: создание полноценного openVPN gateway
- Генерирование сертификатов для OpenVPN с помощью Easy-RSA 3
Комментарии
спасибо за статью.
одна опечатка, у вас: ln -s openssl-1.0.0.cnf openssl
а нужно:
ln -s openssl-1.0.0.cnf openssl.cnf
Спасибо, исправил!
Если у вас несколько OpenVPN-серверов, то в клиенте можно использовать их так:
То есть можно указывать сразу port и proto.
Чтобы не поднимать свой OpenVPN-сервер, можно воспользоваться услугами готовых серверов. Например https://www.vpntunnel.com/, который предоставляет:
Цены от 5 EUR в месяц. Можете заказать бесплатный период на 10 дней, для этого нажмите "live help" (который есть на каждой странице, в левом сайдбаре) и попросите дать демо.
Но скорость работы оставляет желать лучшего... Подробнее я писал тут http://adw0rd.com/2013/3/14/ipfw-forward-vpn/
Если ваш сервер пушает роуты и меняет default-gateway, а вам этого не надо, то используйте опцию в клиентском конфиге: "route-noexec" или "route-nopull". Взято отсюда.
Если вы используете аутентификацию по паре username/password, и не хотите вводить каждый раз их, надо создать файл "/path/to/openvpn/auth.conf" в формате:
и указать в клиентском конфиге:
Если ваш клиент на FreeBSD, то при установке порта security/openvpn надо выбрать "PW_SAFE".
Взято отсюда.
Alternative OpenVPN:
Client IPSec for old Windows and Linux: http://shrew.net/software
Благодарю за статью, мне - помогла!
Класс!
А проверить подключение можно проще: "ifconfig"
Ну одно дело интерфейс, другое дело таблица роутов, в таблице сразу видно используется или нет
Я, не вникая в тему маршрутизации, ничего не понял от вывода route, а вот факт того, что интерфейс поднялся мне помог определить ошибку.
Ваша статья превосходна именно для новичков, поэтому, мне кажеться, проверки факта наличия самого интерфейса будет достаточно. Поправьте, если я ошибаюсь.
И еще вопрос — можно ли назначить одному клиенту статический IP из пула. http://openvpn.net/index.php/open-source/documentation/howto.html#policy — здесь показано как назначить 1 IP на 1 клиента. А можно ли сделать так, чтобы 1 клиент получал IP из какого-то пула. Т.е. я предполагаю, что у меня будет несколько компьютеров с 1 клиентским сертификатом, задача — выдавать им разные IP. Опять таки, я могу ошибаться в архитектурном плане и, возможно, так делать не стоит.
Спасибо!
Поднятый интерфейс не говорит о том, чтобы вы его используете для обмена данными по сети. Таблица роутов как раз говорит о том, какие интерфейсы используются и каким шлюзом вы пользуетесь по умолчанию.
Можно, но клиентов надо определелять. А определяются они по клиентскому сертификату.
Спасибо за ответы.
Насколько я понял: 1 сертификат == 1 клиент и я не могу сделать, чтобы эти клиенты получали разные IP из пула, имея 1 сертификат?
Я сам не настраивал, но видел у сервисов предоставляющих услуги OpenVPN, что они дают разные логин/пароль, и как я понял сертификат у них один на всех. В общем надо гуглить
Вопрос: есть сервер, который работает в качестве шлюза (Debian на iptables). Когда я ставлю OpenVPN есть ли какие-то нюансы здесь. Т.е. что нужно, чтобы одно другому не мешало и работало так, как это от них требуется? Спасибо.
Как сервер или клиент?
как сервер?
Подскажите, каким образом в linux, ubuntu в частности, можно настроить клиента который поднимет два сетевых интерфейса подключаясь к разным серверам? Спасибо.
Спасибо! Все заработало!
.
подскажите пожалуйста в чем проблема?
проблема решена - был закрыт порт на сервере
Спасибо за пост. В некоторых случаях нужно быстро поднять тунель между двома точками. И самый быстрый способ с минимальной безопасностью, это общий ключ, как пишут, к примеру здесь - http://sysadm.pp.ua/linux/shifrovanie/openvpn-point-to-point.html . Генерацию ключей через OpenSSL никто не подскажет как делать?
Настроил сервак как написано в данном мануале. Но возникла трудность с компьютером Мак и Виндовс 2012 сервер. В общем суть такая, сервак на линухе настроен, Винда с 8 с виртуальный машины конектится и пашет все четко. Но мак бук конектится и нет интернета, также вин2012 сервер также не работает инет, путем многих реконектов, иногда работает. в чем может быть проблема?
Большое спасибо. Делал по мануалу из официального вики тут ubuntu http://help.ubuntu.ru/wiki/openvpn, но попасть в интернет через мой сервер так и не удалось, пока не нашел ваш конфиг клиента и в частности вот эту строчку redirect-gateway def1. Еще раз спасибо.
Добрый день! Спасибо, очень интересная статья, единственное хотелось бы уточнить по IP в конфигах. Комп, на котором я думаю поднять сервер: inet addr:192.168.2.62 Bcast:192.168.2.255 Mask:255.255.255.0, 192.168.2.1 - это роутер, раздающий инет на домашнюю сеть. Можете подсказать, как в моем случае изменится конфиг? На удаленном клиенте нужен интернет через vpn и максимально полный доступ к ресурсам домашней сети.
@Leonid Kuznetsov, можете схемку сети обрисовать, я не совсем понял ваш случай? Удаленный клиент, он в другой сети? У роутера есть внешний интерфейс или он сам подключен к другому источнику?
@adw0rd, ну сеть достаточно простая: роутер, он же шлюз, он же DHCP, имеет постоянный внешний IP, сама сеть спрятана за NAT. В сети виндовый комп жены, мой ноут под Debian, небольшой сервер под Gentoo, на который перенаправляются все ssh запросы из вне, и я его использую, как git сервер, и через него же получаю доступ по ssh к сетевым ресурсам из вне, так же старый комп под Debian, на котором крутится принт-сервер, позднее он же стал и файло-помойкой. Есть желание, когда куда-нибудь с собой беру ноут, иметь с него удобный доступ к домашней файло-помойке, и при работе в незащищенной сети иметь возможность по vpn получить доступ к интернету из домашней сети.
По сути есть три варианта: можно поднять vpn непосредственно на роутере, либо на сервере с Debian, либо на Gentoo. Изначально я начал с первого варианта, но, пока у меня с ним ничего не выходит, поэтому я за одно смотрю и альтернативы...
@Leonid Kuznetsov, что за роутер? Он может у себя запустить OpenVPN сервер?
получается на роутере есть и внешний адрес, вот на его интерфейсе и надо запускаться
Очень интересная статья!
Хочу спросить, как реализовать маршрутизацию без client-to-client?
Ведь с включённым client-to-client, openvpn сам рулит правилами и правила фаервола не дествуют на внутрение маршруты тунеля.
Без опции client-to-client, клиенты, по умолчанию, могут видеть только сервер openvpn.
Я же хочу использовать openvpn как маршрутизатор. Т.е. прописать маршруты для что бы клиенты видели друг друга и применить к ним свои правила
Оставьте свой комментарий