Оглавление
Рассмотрим процесс установки OpenVPN на примере дистрибутива Debian 8.2. Задача состоит том, чтобы использовать сервер на базе OpenVPN в качестве шлюза для выхода в интернет. В результате мы получаем белый ip, можем обойти ограничения провайдера и дополнительно сжать и зашифровать весть трафик, который идет через сервер.
Я выбрал OpenVPN благодаря его надёжности и безопасности. По сравнению с аналогичными туннельными протоколами, OpenVPN абсолютно не прихотлив к способу доступа к сети интернет. При необходимости, клиент OpenVPN можно настроить даже через HTTP прокси-сервер.
Для работы OpenVPN необходима поддержка TUN/TAP интерфейса на сервере. Как правило, с этим не должно возникнуть проблем при использовании физической машины или виртуализации KVM. А вот в случае использования OpenVZ, необходимо активировать поддержку TUN/TAP в настройках контейнера. Чтобы проверить, что система поддерживает TUN-интерфейс, необходимо выполнить команду:
ls l /dev/net/tun
crw-rw-rw 1 root root 10, 200 Nov 19 23:02 /dev/net/tun
Установим OpenVPN на сервере:
apt-get install openvpn easy-rsa
В качестве способа авторизации клиента на сервере мы будем использовать аутентификацию по ключу. Для этого создаём директорию в которую будут скопированы сгенерированные ключи:
1 2 3 |
mkdir /etc/openvpn/easy-rsa/ |
Копируем в нее утилиты и конфиги для работы с ключами:
1 2 3 |
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/ |
Переходим в директорию:
1 2 3 |
cd /etc/openvpn/easy-rsa/ |
При необходимости, в файле vars можно настроить параметры ключей и сертификатов. Данный пункт не обязательный и при желании его можно смело пропустить.
1 2 3 |
nano vars |
Меняем следующие строки на свои значения:
1 2 3 4 5 6 7 |
export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="<a class="email" href="mailto:me@myhost.mydomain">me@myhost.mydomain</a>" |
После правки vars необходимо инициировать переменные:
1 2 3 4 |
source ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys |
Очищаем каталог keys/server от старых сертификатов и ключей:
1 2 3 |
./clean-all |
Создаем корневой сертификат:
1 2 3 |
./build-ca |
В квадратных скобках указаны значения по умолчанию, которые были заданы в файле vars. Если вы хотите оставить значения без изменений, нужно просто нажимать клавишу «Ввод».
Далее генерируем сертификаты сервера и клиента:
1 2 3 4 5 |
./build-key-server server ./build-key client1 ./build-key client2 |
Для каждого клиента нужно сгенерировать отдельные ключи.
Генерируем ключ Диффи — Хеллмана:
1 2 3 |
./build-dh |
Cоздаем ключ для tls-аутификации:
1 2 3 |
openvpn --genkey --secret keys/ta.key |
Все сгенерированные сертификаты и ключи находятся в директории:
1 2 3 |
/etc/openvpn/easy-rsa/keys/ |
Копируем сертификаты и ключи сервера в директорию OpenVPN:
1 2 3 4 5 |
cd keys cp server.crt server.key ca.crt dh2048.pem ta.key /etc/openvpn/ |
Для настройки клиента OpenVPN, необходимо скопировать ключи и сертификаты из списка ниже:
- client1.crt
- client1.key
- ca.crt
- ta.key
На этом этапе установка OpenVPN закончена. Теперь выполним настройку сервера OpenVPN.
Настройка сервера OpenVPN
Копируем и распаковываем пример конфигурационного файла в содержимое директории OpenVPN:
1 2 3 4 |
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ gzip -d /etc/openvpn/server.conf.gz |
В зависимости от наших потребностей, изменяем настройки сервера OpenVPN:
1 2 3 |
nano /etc/openvpn/server.conf |
Пример настройки OpenVPN:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
local 90.90.90.90 # Внешний ip сервера, указываем если на машине несколько адресов. port 1194 # Порт на котором будет принимать соединения сервер OpenVPN. proto tcp # Для лучшего быстродействия рекомендуется указать udp. # Если вы используете прокси, необходимо указать tcp. dev tun # Интерфейс туннеля ca ca.crt # Путь к корневому сертификату cert server.crt # Путь к сертификату сервера key server.key # Путь к ключу сервера dh dh1024.pem # Путь к ключу Диффи - Хеллмана server 10.8.0.0 255.255.255.0 # Пул DHCP виртуальной сети OpenVPN. Работает только с TLS-клиентами в режиме tun. ifconfig-pool-persist ipp.txt # Запоминать динамически выданные адреса. ;client-config-dir ccd # Директория для клиентских конфигов ;push "route 10.0.1.1 255.255.255.0" # Передаем маршрут клиенту (сеть-клиента). push "redirect-gateway def1" # Установить шлюзом по умолчанию удаленный сервер. ;push "dhcp-option DNS 8.8.8.8" # Передаем DNS клиенту. ;client-to-client # Если нужно, чтобы клиенты видели друг друга. keepalive 10 120 # Каждые 10 секунд посылать ping, перезапустить туннель если сервер не отвечает в течении 120 секунд. tls-server # Включаем TLS auth SHA512 # Для аутентификации используются ключи SHA512 tls-auth ta.key 0 # Путь к ключу TLS cipher BF-CBC # Метод шифрования comp-lzo adaptive # Включить сжатие user nobody # Права, с которыми будет работать OpenVPN. group nogroup persist-key # Не перечитывать файлы ключей при перезапуске туннеля. persist-tun # Оставить без изменения устройства tun/tap при перезапуске OpenVPN. status openvpn-status.log # Лог с информацией о текущих соединениях. log /var/log/openvpn.log # Путь к лог-файлу. verb 3 # Уровень детализации лога. mute # В лог будет записываться до 10 сообщений из одной категории. |
Создадим директорию для клиентских настроек:
1 2 3 |
mkdir /etc/openvpn/ccd |
После завершения настройки OpenVPN, перезагружаем сервер:
1 2 3 |
reboot |
В случае успешного запуска OpenVPN в системе должен появится новый tun0 интерфейс:
1 2 3 4 5 6 7 8 9 10 |
ifconfig tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) |
Это означает, что OpenVPN сервер запущен. В случае проблем с запуском OpenVPN, используем лог-файл:
1 2 3 |
nano /var/log/openvpn.log |
Настройки маршрутизации для клиентов OpenVPN
После подключения клиента к серверу OpenVPN, шлюз будет изменен на IP виртуальной сети сервера. Если клиент OpenVPN находится в локальной сети, вам необходимо дополнительно настроить маршрутизацию для доступа к ресурсам внутри сети. Для этого создаем файл в каталоге ccd с тем же именем ключа клиента:
1 2 3 |
nano /etc/openvpn/ccd/client1 |
Добавим в файл следующие параметры:
1 2 3 4 |
push "route 192.168.1.0 255.255.255.0" push "dhcp-option DNS 192.168.1.1" |
Первая строка добавляет маршрут в локальную сеть клиента. Вторая строка задает DNS-сервер, который будет использоваться после подключения.
Включаем NAT на OpenVPN сервере
Чтобы использовать OpenVPN для выхода в интернет, на сервере необходимо задать правило для маршрутизации трафика из сети OpenVPN в локальную сеть или сеть интернет-провайдера.
Включаем поддержку IP forwarding, открываем в файл:
1 2 3 |
nano /etc/sysctl.conf |
В котором необходимо раскомментировать строку:
1 2 3 |
#net.ipv4.ip_forward=1 |
Загрузим переменные ядра:
1 2 3 |
sysctl -p |
Прописываем правила iptables (при условии, что он установлен). Нужно разрешить клиентам из подсети 10.8.0.0/24 доступ в интернет, разрешить принимать пакеты из интернета и пропустить трафик клиентов через NAT.
1 2 3 4 5 |
iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE |
Замените eth0 на имя своего внешнего интерфейса. Следует отметить, правило MASQUERADE создает нагрузку на процессор. Поэтому, предпочтительнее использовать SNAT:
1 2 3 |
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source ВНЕШНИЙ_IP |
Сохраним и добавим правила в автозагрузку:
1 2 3 4 |
iptables-save > /etc/iptables.conf echo "iptables-restore < /etc/iptables.conf" >> /etc/rc.local |
Настройка клиента OpenVPN
Если OpenVPN не установлен, для установки клиента в Debian или Ubuntu необходимо выполнить команду:
1 2 3 |
apt-get install openvpn |
Копируем на компьютер клиента ключи и сертификаты из списка ниже:
- client1.crt
- client1.key
- ca.crt
- ta.key
Переносим ключи и сертификаты в директорию OpenVPN:
1 2 3 |
/etc/openvpn/ |
1 2 3 |
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/ |
1 2 3 |
nano /etc/openvpn/client.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
client dev tun proto tcp remote 90.90.90.90 1194 # Адрес и порт сервера OpenVPN resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key tls-auth ta.key 1 auth SHA512 cipher BF-CBC comp-lzo adaptive ;log /var/log/openvpn.log ;status /var/log/openvpn-status.log verb 3 mute 20 ;route 192.168.1.0 255.255.0.0 # Можно прописать маршрут в локальную сеть, если это не сделано на сервере. |
1 2 3 |
C:\Program Files\OpenVPN\config |
1 2 3 |
service openvpn restart |
Проверка
Пингуем 10.8.0.1, если пинг проходит, значит все хорошо.
1 2 3 |
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data. 64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=30 ms |