Настраиваем VPN в Ubuntu Server с пакетом OpenVPN

Запускаем VPN в Ubuntu 16.04 | 17.04 | 18.04 с пакетом OpenVPN.

Сегодня разберём установку и настройку конфигурационных файлов для запуска VPN сервера и клиентской части на ubuntu server 16.04 | 17.04 | 18.04

Зачем же нужен VPN? На то есть целый ряд причин. Например, чтобы ваши пароли, передаваемые по HTTP, не утекли, когда вы сидите с открытых WiFi точек. Да и вообще, даже вашему обычному провайдеру не обязательно знать, на какие сайты вы ходите. Еще — чтобы не палить свой IP в IRC сетях и прочих сервисах, с которыми вы работаете. Им знать ваше местоположение тоже совсем никчему. Также вам может захотеться попробовать какой-нибудь новый сервис, который пока что недоступен для пользователей с российским IP. Кроме того, трафик между вами и VPN сервером не только шифруется, но и сжимается, что нередко может создать ощущение более быстрого интернета. Также OpenVPN может быть полезен в целом ряде других случаев — для доступа сотрудников ко внутренним ресурсам компании, при построении на VDS’ах приложения с микросервисной архитектурой и не только.

Почему VPN, а не какие-нибудь прокси или пробрасывание портов через SSH, надеюсь, тоже понятно. VPN достаточно настроить один раз и сразу весь трафик всех приложений пойдет через VPN сервер, в сжатом и зашифрованном виде.
Чтобы поднять свой VPN, вам потребуется собственный сервер с Ubuntu, Debian, а также права root’а на нем. Если сервер у вас уже есть, хорошо. Если нет, то не расстраивайтесь. В наши дни купить подходящий VDS/VPS можно за 100-150 рублей в месяц. Компаний, предлагающих соответствующие услуги — десятки. Советовать какой-то конкретный сервис я не буду, как говорится: — «На вкус и цвет товарищей нет».

Установка OpenVPN на Ubuntu Server 16.04 | 17.04 | 18.04

приступим к установке пакетов на нашем сервере:

sudo apt update
sudo apt install openvpn

Раньше в OpenVPN входила утилита под названием easy-rsa, предназначенная для генерации ключей и сертификатов. Начиная с версии 2.3 эту утилиту из пакета выпилили, поэтому придется скачать и собрать ее самостоятельно:

cd /tmp
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
cd easy-rsa-master
./build/build-dist.sh
tar xvzf ./EasyRSA-git-development.tgz
cd EasyRSA-git-development

Генерируем все необходимые ключи и сертификаты. Приготовьтесь вводить для них пароли. Так как мы настраиваем персональный VPN сервер, то, видимо, можно использовать один-единственный пароль, но подлиннее:

./easyrsa init-pki
./easyrsa build-ca
./easyrsa build-server server
./easyrsa build-client client1
./easyrsa gen-dh

Выполнение последней команды может занять несколько минут.
Переносим полученные ключи и сертификаты в каталог /etc/openvpn/:

mv ./pki/dh.pem /etc/openvpn/dh2048.pem
mv ./pki/private/client1.key /etc/openvpn/
mv ./pki/private/server.key /etc/openvpn/
mv ./pki/ca.crt /etc/openvpn/
mv ./pki/issued/client1.crt /etc/openvpn/
mv ./pki/issued/server.crt /etc/openvpn/

Настройка конфигурационного файла openvpn на сервере.

В том же каталоге создаем файл server.conf:

sudo touch server.conf

с содержимым:

# Порт для OpenVPN
port 1194
# Протокол для работы
proto tcp
# Тип интерфейса
dev tun
# Сертификат центра сертификации ЦА
ca /etc/openvpn/ca.crt
# Сертификат сервера
cert /etc/openvpn/server.crt
# Ключ сервера
key /etc/openvpn/server.key
# Сертификат для шифрования подключения
dh /etc/openvpn/dh2048.pem
# Защита от DOS атак (для сервера 0 для клиента 1)
tls-server
tls-auth /etc/openvpn/ta.key 0
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
# Выбор криптографического шифра
cipher AES-256-CBC
# IP адрес и маска VPN сети
server 10.8.0.0 255.255.255.0
#Каталог для настройки клиента:
client-config-dir /etc/openvpn/ccd
# Сообщает клиентам что за сервером есть локальная сеть (если есть)
push "route 192.168.0.0 255.255.255.0"
#Прописывает маршрут на сервере чтобы видеть сеть за клиентом (если есть)
route 10.63.10.0 255.255.255.0
# Шлюз
#route-gateway 10.8.0.1
# Каждому клиенту выдается по 1 адресу, без виртуальных портов маршрутизатора
topology subnet
# Количество повторяющихся сообщений
mute 20
# Максимальное кол-во одновременно подключившихся клиентов
max-clients 25
# Записываем в файл IP адреса клиентов
ifconfig-pool-persist ipp.txt
#Время жизни неактивной сессии
keepalive 10 120
# Разрешаем клиентам видеть друг друга
client-to-client
# Включаем сжатие
comp-lzo
persist-key
persist-tun
# Логирование
status openvpn-status.log
log openvpn.log
log-append openvpn.log
# Уровень отладочной информации
verb 3
# Прописываем шлюз у клиента
#push "redirect-gateway def1"
# Прописываем DNS сервера у клиента
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option DNS 8.8.8.8"

Попробуем запустить OpenVPN:

service openvpn start

Проверяем:

netstat -tuwpan

Сервер должен слушать порт 1194. Если это не так, курим /var/log/syslog или же /etc/openvpn/openvpn.log.

Настройка конфигурационного файла openvpn на клиенте.

Теперь что касается клиентской стороны. Нам понадобятся файлы client1.crt, client1.key ta.crt и ca.crt и также установить пакет openvpn:

sudo apt install openvpn
cd /etc/openvpn
scp vpn-server:/etc/openvpn/client1.crt ./
scp vpn-server:/etc/openvpn/client1.key ./
scp vpn-server:/etc/openvpn/ca.crt ./
scp vpn-server:/etc/openvpn/ta.crt ./

Создадим файл client.conf:

sudo touch client.conf

с содержимым:

client
proto tcp
dev tun
# !!! замените на настоящий ip адрес сервера
remote 111.111.111.111 1194
# следующие две строчки актуальны только для Linux систем
# на практике они не очень удобны, так как OpenVPN не сможет
# нормально все за собой почистить по завершению работы
user nobody
group nogroup
# Не перечитывать ключи, не закрывать и переоткрывать TUN\TAP устройства
persist-key
persist-tun
# Пути где располагаются сертификаты
ca ca.crt
cert client1.crt
key client1.key
# Используемое шифрование
cipher AES-256-CBC
# Сжатие трафика
comp-lzo
# Детальность логирования 
verb 3

Подрубаемся к серверу, внимательно читаем логи:

sudo openvpn --config client.conf

В соседнем терминале говорим:

ping 10.8.0.1
traceroute mail.ru

Если все было сделано правильно, вы обнаружите, что пинги успешно доходят до 10.8.0.1 (первая команда), но пакеты через него никуда не проходят (вторая команда). Это потому что мы забыли настроить на сервере NAT.

Настройка NAT для openvpn сервера на ubuntu 16.04

Конфиг сервера:

ppp0 — соединение с провайдером через PPPoE соединение
br0 — сетевой мост объединяющий локальный интерфейс и интерфейс WiFi
enp0s3 — интерфейс смотрит в сеть интернет
enp0s8 — интерфейс смотрит в локальную сеть
wlp1s0 — WiFi интерфейс

На сервере создадим файл под названием nat в директории /etc/network/

sudo touch /etc/network/nat

с содержимым:

#!/bin/sh
# Включаем форвардинг пакетов
echo 1 >> /proc/sys/net/ipv4/ip_forward
# открываем доступ для установленных соединений на интерфейсе подключенного к сети интернет
iptables -A FORWARD -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешаем трафик на интерфейсах
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -A INPUT -i ppp0 -j ACCEPT
# Разрешаем доступ из внутренней сети наружу
iptables -A FORWARD -i br0 -o ppp0 -j ACCEPT
iptables -A FORWARD -i tun0 -o ppp0 -j ACCEPT
#Разрешаем доступ SSH и VPN по порту 22 и 1194
iptables -A INPUT -p tcp -m multiport --dports 22,1194 -j ACCEPT
# Включаем NAT
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp0 -s 10.8.0.0/24 -j MASQUERADE
# Запрещаем доступ снаружи во внутреннюю сеть
iptables -A FORWARD -i ppp0 -o br0 -j REJECT --reject-with icmp-host-prohibited
iptables -A FORWARD -i ppp0 -o tun0 -j REJECT --reject-with icmp-host-prohibited

Переподключаемся клиентом, попробуем зайти на какие-нибудь 2ip.ru или ip.xss.ru — теперь все должно работать. Если это не так, курим логи. Так же добавим в файл /etc/network/interfaces строчку:

 pre-up /etc/network/nat

Перезагружаем наш сервер и проверяем, что настройки держатся после перезагрузки:

cat /proc/sys/net/ipv4/conf/all/forwarding
iptables -L -n

Так же имеется возможность настроить наш клиент при помощи графической программки:

sudo apt-get install network-manager-openvpn-gnome

Делается это несложно, фактически нужно повторить текстовый конфиг клиента при помощи галочек и полей ввода. Понять, какая галочка какой строчке в конфиге соответствует, очень легко.

Несмотря на то, что заметка получилась довольно длинной, настройка OpenVPN действительно занимает всего лишь несколько минут. Безопасного и быстрого вам веб-серфинга!

Если есть вопросы, то пишем в комментариях и не забываем проголосовать за статью.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Настраиваем VPN в Ubuntu Server с пакетом OpenVPN
5 (100%) 5 votes

15
Оставить комментарий

avatar
11 Цепочка комментария
4 Ответы по цепочке
0 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
11 Авторы комментариев
UniversalSYSadminКофрVikaThomasUsefs Авторы недавних комментариев
  Подписаться  
новее старее большинство голосов
Уведомление о
Universal
Гость
Universal

У кого вылезает ошибка:
:/tmp/easy-rsa-master# ./build/build-dist.sh
/usr/bin/python: No module named markdown
/usr/bin/python: No module named markdown
/usr/bin/python: No module named markdown
/usr/bin/python: No module named markdown
/usr/bin/python: No module named markdown
/usr/bin/python: No module named markdown
build-dist NOTE: tarball created at: ./EasyRSA-git-development.tgz
./build/build-dist.sh: line 128: zip: command not found
build-dist ERROR:
zip failed

———————-
Нужно прописать следующее:
sudo apt-get install python3-markdown

Кофр
Гость
Кофр

Интересует две модели настроек защиты от утечки трафика без VPN:
1. Обычный VPN-клиент на машине Linux.
2. VPN-клиент работает на виртуальной машине на Linux за NAT.

Хочется понять, как читать и настраивать маршруты в любой ситуации.

Спасибо.

Кофр
Гость
Кофр

Расскажите, как теперь сделать, чтобы при падении VPN, на клиенте пропал интернет и не было утечек трафика.
С реальным примером.
А то везде все говорят, что это просто, и на словах объясняют, что нужно запретить дефолтный маршрут, оставив только маршрут до IP сарвера с ВПН.
А как это сделать, никаких мануалов 🙁

Vika
Гость
Vika

При вводе команды ./build/build-dist.sh выводит:
Remove existing DIST_ROOT at: ‘dist-staging’ ?
y/n: (где я прописываю «y»)
После этого оно выводит :
build-dist ERROR:
user abort
А после все команды естественно игнорируются.

ThomasUsefs
Гость
ThomasUsefs

Это очень интересно, хорошо что наткнулся на ваш сайт. Спасибо вам.

Илья
Гость
Илья

Не работает команда «tar -xf master.zip», пишет:
tar -xf master.zip
tar: Это не похоже на tar-архив
tar: Пропускается до следующего заголовка
tar: Завершение работы с состоянием неисправности из-за возникших ошибок

Alonsorut
Гость
Alonsorut

Спасибо за актульную информацию.

Robertmot
Гость
Robertmot

Как хорошо, что наткнулся на ваш сайт, очень много информации почерпнул.

DevakReero
Гость
DevakReero

А, что очень даже интересно,спасибо за информацию.

Фагит
Гость
Фагит

Урааааа, Получилось!!!!! Большое спасибо за вашу пошаговую инструкцию!!!!! Больше статей очень хороший ресурс, Еще раз спасибо!!!!

Игорь
Гость
Игорь

Спасибо, все настроил как в вашей статье. Все заработало с первого раза.

Меню

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Рейтинг@Mail.ru