Как поднять собственный VPN на сервере. Ч.3.

by @redterror
Как поднять собственный VPN на сервере. Ч.3.

Шалом, бродяги. Продолжаем рубрику для тех, кто в теме. Сегодня ещё больше практики!

Поднимаем OpenVPN вручную

Итак, собственно, поднимаем OpenVPN-server.

Начнем с установки каких-то пакетов. Некоторые из них вы уже могли ставить, если производили первичную настройку из раздела выше.

Обновим систему:

apt-get update && apt-get dist-upgrade -y
apt-get install -y sudo nano htop curl perl python wget git openssl ca-certificates iptables

И три основных пакета:

apt-get install -y openvpn easy-rsa ufw

После установки пакетов, разархивируем пример конфигурационного файла в папку /etc/openvpn/:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Файл /etc/openvpn/server.conf - основной серверный конфигурационный файл OpenVPN.

Теперь немного отредактируем его:

nano /etc/openvpn/server.conf

Файл длиный, с большим количесвом комментариев (все, что идет в строчке после символа # - комментарий). Строки, которые начинаются с символа ; в данном файле - тоже комментарии.

Частичный разбор конфига будет ниже в статье.

Редактируем. В самом верху сразу будет port:

port 1194

Я поменяю порт на какой-нибудь совсем не стандартный:

port 16122

(Диапазон от 0 до 65000), я выбрал рандомно. Не займите порт, который слушает другой сервис, например в моем случае sshd случает 1488.

Идем дальше. Выбираем протокол - пара строк ниже:

proto udp

И видим, что она никак не закоментированная. Потому что по-умолчанию OpenVPN будет работать по UDP. Если вам нужен TCP, выше есть строчка proto tcp - раскоментируйте ее, удалите символ ; в нчале строки, а proto udp закоментируйте, добавив символ #. Оба нельзя, или то или другое. Я буду показывать на примере UDP, поэтому оставляю как есть.

Опускаемся ниже в конфиге и находим строку:

dh dh1024.pem

Меняем на dh2048.pem:

dh dh2048.pem

Идем ниже и находим закоментированную строку:

;push "redirect-gateway def1 bypass-dhcp"

Раскоментируем:

push "redirect-gateway def1 bypass-dhcp"

Еще чуть ниже находим две раскоментированные строки рядом:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Это то, какой DNS будет использоваться. По-умолчанию прописаны сервера OpenDNS, но можем прописать публичные сервера Google:

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

Можете оставить и OpenDNS.

Идем дальше и натыкаемся на строку

;tls-auth ta.key 0 # This file is secret

Просто раскоментируем:

tls-auth ta.key 0 # This file is secret

Листаем ниже и находим строку:

;cipher AES-128-CBC   # AES

Это шифрование. Раскоментируем строку и переделаем на AES-256-CBC:

cipher AES-256-CBC

Еще чуть ниже в файле находим две закоментированные строки:

;user nobody
;group nogroup

Раскоментим их:

user nobody
group nogroup

Далее, ниже находим строку, которая начинается со слова status и переделываем ее в следующий вид:

#status /dev/null 2>&1

Закоментированная.

Еще чуть ниже, находим строку, которая начинается со слова log, и придаем ей такой вид:

log /dev/null 2>&1

Не закоментированная. Это логи. Отключить логирование OpenVPN нельзя в привычном понимании, поскольку если закоментировать строку, то по-умолчанию будет писаться в syslog файл (/var/log/syslog).

Строку

;log-append

не трогаем

Еще чуть ниже, verb 3 меняем на:

verb 0

Сохраняем, закрываем. Мы еще вернемся к этому файлу позже.

Теперь включаем перенаправление пакетов, вводим команду:

echo 1 > /proc/sys/net/ipv4/ip_forward

Затем:

cat /proc/sys/net/ipv4/ip_forward

Если возвращает единицу, значит все ОК.

Теперь надо чтобы изменения были и при перезагрузке сервера, поэтому редактирум файл /etc/sysctl.conf:

nano /etc/sysctl.conf

Ищем строку:

#net.ipv4.ip_forward=1

Раскоментируем ее:

net.ipv4.ip_forward=1

Если такой строки в файле нет вообще, добавьте вручную.



Настроим Firewall

Ранее мы установили пакет ufw. Теперь нам нужно добавить некоторые правила. Во-первых, нам нужно дать разрешить траффик на SSH. Я ввожу:

ufw allow 1488

Поскольку у меня sshd слушает порт 1488, если вы не меняли и у вас sshd слушает 22 порт, то вводите:

ufw allow ssh

Далее, нам нужно разрешить траффик на порт, который будет слушать OpenVPN, в моем случае это port 16122, потому что я менял его в конфиг. файле (выше):

ufw allow 16122/udp

Поскольку OpenVPN будет слушать UDP порт, я в конце добавил /udp. Если у вас OpenVPN настроен не на UDP, а на TCP, без слеша на конце (или /tcp).

Если вы ничего не меняли в конфиге, то у вас слушает порт 1194 UDP, а значит:

ufw allow 1194/udp

Теперь нужно изменить Forward Policy, редактируем файл /etc/default/ufw:

nano /etc/default/ufw

Ищем строку:

DEFAULT_FORWARD_POLICY="DROP"

И меняем ее значение на:

DEFAULT_FORWARD_POLICY="ACCEPT"

Теперь нам нужно разобраться с сетевыми интерфейсами, вводим команду:

ip addr

Команда выведет ваши интерфейсы. Там будет интерфейс lo и еще какой-нибудь, например eth0 или venet0. В моем случае интерфейс называется venet0 (ибо OpenVZ). У меня такой вывод:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/void 
    inet 127.0.0.2/32 scope host venet0
    inet МОЙ IP/32 brd МОЙ IP scope global venet0:0

Вам нужен интерфейс, который показывает ваш внешний IP. Из кода выше понятно, что venet0 показывает внешний IP. (inet МОЙ IP)

Далее, что нужно редактировать файл /etc/ufw/before.rules:

nano /etc/ufw/before.rules

И куда-нибудь наверх, вставляем следующее:

# START
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o <ВАШ ИНТЕРФЕЙС> -j MASQUERADE
COMMIT
# END

где вместо <ВАШ ИНТЕРФЕЙС> пишем интерфейс, в моем случае это venet0 и получилось так:

# START
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o venet0 -j MASQUERADE
COMMIT
# END

После всего этого включаем ufw:

ufw enable

Cмотрим на наши правила:

ufw status

Выводом покажет правила, которые вы создавали выше, у меня так:

root@ppVPS:~# ufw status
Status: active

To                  Action      From
--                  ------      ----
1488                ALLOW       Anywhere
16122/udp           ALLOW       Anywhere
1488                ALLOW       Anywhere (v6)
16122/udp           ALLOW       Anywhere (v6)

где 1488 - для SSH и 16122 - UDP опенвпн.

Отключить ufw можно так:

ufw disable

Генерируем ключи для сервера. Ранее мы ставили пакет easy-rsa. Теперь копируем папку со скриптами easy-rsa в папку openvpn:

cp -r /usr/share/easy-rsa/ /etc/openvpn

внутри папки easy-rsa создаем папку keys:

mkdir /etc/openvpn/easy-rsa/keys

Теперь сгенерируем Diffie-Hellman длиной 2048 и поместим его в /etc/openvpn:

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

Еще сгенерируем файл ta.key в папку /etc/openvpn, для tls-auth:

openvpn --genkey --secret /etc/openvpn/ta.key

Далее...

Переходим в папку easy-rsa:

cd /etc/openvpn/easy-rsa

Тут лежит файл vars с какими-то переменными, редактируем его:

nano vars

Крутим вниз пока не наткнемся на блок:

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"

# X509 Subject Field
export KEY_NAME="EasyRSA"

В первых 6 строках можете менять значения, можете оставить как есть. Я оставлю как есть. Пофиг. Главное нельзя оставлять их пустыми.

Но конкретно здесь нас интересует строка

export KEY_NAME="EasyRSA"

Здесь значение меняем на server, что бы было вот так:

export KEY_NAME="server"

Можно поменять на любое другое, но не ебем мозг и меняем как я, потому что иначе вам придется менять значения в server.conf.

Если дали название отличное от server - запомните его.

Вот так. Сохраняем, закрываем файл.

Далее вводим следующее:

source vars

Далее, вводим:

./clean-all &amp;&amp; ./build-ca

Будет предлогать вводить какие-то значения, но мы их меняли (или не меняли) в файле vars. Просто везде жмем Enter и все. При этом, дойдя до пункта Name, нажимая Enter будет то имя, которое вы указывали ранее в KEY_NAME у меня это server.

Следующим делом вводим:

./build-key-server &lt;ИМЯ В KEY_NAME&gt;

где: <ИМЯ В KEY_NAME> - это то имя, которое вы давали в файле vars. Если ничего не давали, то по-умолчанию там было Easy-RSA. Я давал имя server, поэтому:

./build-key-server server

Точно таким же образом, везде жмем Enter. Даже там, где предложит ввести 'A challenge password', жмем enter.

Потом дважды вводим символ y, где попросит:

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

В конце вы увидите:

Write out database with 1 new entries

Data Base Updated

Теперь нам нужно переместить все сгенерированные ключи и сертификаты в папку /etc/openvpn.

Всё добро находится в папке /etc/oepnvpn/easy-rsa/keys. Нас интересуют 3 файла (исплючая dh2048.pem и ta.key, которые мы сгенерировали ранее) - ca.crt, server.crt, server.key,

где файлы server.crt и server.key - имеют название, которое вы указывали в KEY_NAME, я указывал server, помним да.

Перемещаем их следующим образом:

cp /etc/openvpn/easy-rsa/keys/{ca.crt,server.crt,server.key} /etc/openvpn/

Идем обратно в папку openvpn:

cd /etc/openvpn

Вводим к консоли ls и смотрим, какие файлы лежат. На данный момент должны быть следующие файлы: ca.crt, dh2048.pem (который мы генерировали ранее), server.conf (основной конфиг), server.crt, server.key и ta.key Еще может быть файл update-resolv-conf.

root@ppVPS:/etc/openvpn# ls
ca.crt	dh2048.pem  easy-rsa  server.conf  server.crt  server.key  update-resolv-conf

Теперь запускаем openvpn:

systemctl start openvpn

или

/etc/init.d/openvpn start

Проверяем, запустился ли:

systemctl status openvpn

или

/etc/init.d/openvpn status

Должно гореть зелененьким (лол), вы увидите надпись:

Active: active (exited) since

Проверяем, слушает ли порт:

netstat -tulpn | grep vpn

Должно вывести один сервис, который слушает на порту, который вы указывали.

У меня вывод такой:

udp  0   0 0.0.0.0:16122   0.0.0.0:*     484/openvpn

Все проверили, молодцы. Теперь остановим:

systemctl stop openvpn

или

/etc/init.d/openvpn stop

Делаем клиента, генерируем ключи.

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

Скопируем его в папочку /etc/openvpn/easy-rsa/keys и переименуем (даем расширение .ovpn):

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

Редактируем файл клиента:

nano /etc/openvpn/easy-rsa/keys/client.ovpn

Листаем файл вниз, натыкаемся на строку

remote my-server-1 1194

где: my-server-1 - IP адрес вашего сервера. Тот, что пришел вам на почту или смотрите по команде ip addr | grep inet и ищите. 1194 - Порт, на котором слушает OpenVPN на вашем сервере, в моем случа это 16122.

Меняйте эту строку, я меняю:

remote 111.222.111.222 16122

Листаем ниже, находим строку:

ns-cert-type server

стираем ее и меняем на:

remote-cert-tls server

Еще чуть ниже строка:

;cipher x

Меняем шифрование на то, которое вы указывали в server.conf. Я указывал AES-256-CBC:

cipher AES-256-CBC

Если вы в server.conf ничего не указывали, то эту строку не трогайте.

Все. Сохраняем и закрываем.

Теперь нужно сгенерировать ключи и серты для клиента.

Перейдем в папку easy-rsa:

cd /etc/openvpn/easy-rsa

Генерим:

./build-key client1

где: client1 - название клиента. Может быть любым. Я сделал client1.

Таким же образом, как и с сервом, везде жмем Enter. И соглашаемся, нажимая y, там где это нужно.

Клиентский конфиг состоит из:

.ovpn файла. В моем случае это client.ovpn.

файла ca.crt - который общий для сервера и все клиентов.

файл ta.key - тоже общий для сервера и клиента. Это для tls-auth, что не обязательно.

файлов client1.crt и client1.key - которые индивидуальные для каждого клиента.

Дело в том, что все эти файлы нужны .ovpn конфигу, без них он не будет работать. Но не будем же мы их везде вместе таскать! Поэтому есть возможность все эти файлы строить в .ovpn конфиг, чтобы был один единый файл и все.

Нужно проделать кое-какие манипуляции, поэтому для удобства создаем папку client1:

mkdir /etc/openvpn/easy-rsa/keys/client1

Нужно скопировать туда конфиг.файл .ovpn и все серты и ключи,

по аналогии с сервером, файлы client1.crt и client1.key имеют названия специфические, в зависимости от того, какое вы указывали имя клиента, выполняя команду выше. Я назвал client1 поэтому у меня они называются именно так.

Копируем:

cp /etc/openvpn/easy-rsa/keys/{ca.crt,client1.crt,client1.key} /etc/openvpn/easy-rsa/keys/client1

За одно копируем client.ovpn (называться может как угодно, хоть xuy.ovpn):

cp /etc/openvpn/easy-rsa/keys/client.ovpn /etc/openvpn/easy-rsa/keys/client1

И не забываем про ta.key, которые лежит в папке openvpn:

cp /etc/openvpn/ta.key /etc/openvpn/easy-rsa/keys/client1/

Переходим в папку client1:

cd /etc/openvpn/easy-rsa/keys/client1

На данный момент там находится 5 файлов:

ca.crt client.ovpn (конфиг файл) client1.crt client1.key ta.key

Теперь нужно быть внимательнее! В особенности с именами файлов.

Внедряем содержимое нужных файлов в наш конфиг .ovpn.

По очереди, в том порядке, в котором это у меня, выполняем следующие команды.

Для ca.crt:

echo '' &gt;&gt; client.ovpn
cat ca.crt &gt;&gt; client.ovpn
echo '' &gt;&gt; client.ovpn

где client.ovpn название конфиг файла.

Теперь для client1.crt:

echo '' &gt;&gt; client.ovpn
cat client1.crt &gt;&gt; client.ovpn
echo '' &gt;&gt; client.ovpn

где client1.crt - серт. файл, которые генерировали выше.

Теперь для client1.key:

echo '' &gt;&gt; client.ovpn
cat client1.key &gt;&gt; client.ovpn
echo '' &gt;&gt; client.ovpn

Теперь для ta.key, нужно для tls-auth:

echo 'key-direction 1' &gt;&gt; client.ovpn
echo '' &gt;&gt; client.ovpn
cat ta.key &gt;&gt; client.ovpn
echo '' &gt;&gt; client.ovpn

Таким образом, все ключи и сертификаты теперь в одном файле .ovpn, и он может работать сам по себе.

Теперь нужно еще немного отредактировать файл client.ovpn:

nano client.ovpn

Листаем, пока не наткнемся на блок:

ca ca.crt
cert client.crt
key client.key

Нам это не нужно, поэтому закоментируем их:

#ca ca.crt
#cert client.crt
#key client.key

Собственно, конфиг клиента готов. Он будет работать, если вы запустите его на OpenVPN клиенте вашего устройства.

Можем запускать OpenVPN:

systemctl start openvpn

или

/etc/init.d/openvpn start

После любых манупуляций в файле server.conf, для того что бы применились изменения, нужно перезапускать OpenVPN:

systemctl restart openvpn

или

/etc/init.d/openvpn restart

Но я хочу еще проделать какие-то модификации на server.conf и client.ovpn

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

Сделать это легко. Но для начала, на всякий случай, сделаем backup:

server.conf

cp /etc/openvpn/server.conf /etc/openvpn/server.conf.bak

и client.ovpn:

cp /etc/openvpn/easy-rsa/keys/client1/client.ovpn /etc/openvpn/easy-rsa/keys/client1/client.ovpn.bak

теперь одной командой удаляем все комментарии (# и ; в начале строки) и пустые строки:

server.conf

sed -i '/^[#;]\|^$/ d' /etc/openvpn/server.conf

client.ovpn

sed -i '/^[#;]\|^$/ d' /etc/openvpn/easy-rsa/keys/client1/client.ovpn

И оба наших конфига примут более читабельный вид.

Открываем server.conf

nano /etc/openvpn/server.conf

И куда-нибудь в середину прихерачим следующее:

sndbuf 0
rcvbuf 0
topology subnet
auth SHA512

И на клиенте.

nano /etc/openvpn/easy-rsa/keys/client1/client.ovpn

Куда-нибудь в конфиг, до начала сертификатов и ключей:

sndbuf 0
rcvbuf 0
keepalive 10 120
auth SHA512

Таким образом, мой конфиг server.conf выглядит так:

port 16122
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-256-CBC
auth SHA512
comp-lzo
persist-key
persist-tun
log /dev/null 2&gt;&amp;1
verb 0

А client.ovpn так (Безключей и сертификатов):

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 111.222.111.222 14500
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
keepalive 10 120
comp-lzo
verb 3

Можете использовать эти конфиги.

Разберем немного конфиг.

proto udp

Какой протокол юзать, TCP или UDP?

UDP обычно работает быстрее.

TCP более надежный, стабильный, лучше обходит фаерволл - например можно повестить на порт 443.

UDP, также можно повесить на порт, который обычно не блокируют - 53.

Если вас не блокируют, то лучше я думаю UDP. Сам юзаю UDP. На сервере и клиенте должен быть указан один протокол.

Port 16122

На какой порт повесить? Лучше на нестандартный, как у меня. Или замаскировать под какой-то сервис - 443/ssl для tcp и 53/dns для udp

cipher AES-256-CBC

Какое шифрование использовать?

Используйте AES-256-CBC или AES-128-CBC. Если явно не задать, то по-умолчанию будет исопльзоваться Blowfish (cipher BF-CBC).

Этот параметр должен быть и на сервере и на клиенте. Если на сервере есть, на клиенте нет или они отличаются, может не законнектить.

auth SHA512

Если не задавать, будет использоваться auth SHA1. Используйте auth SHA512 или auth SHA256. Этот параметр должен быть и на сервере и на клиенте. Если на сервере есть, на клиенте нет или они отличаются, может не законнектить.

#status /dev/null 2&gt;&amp;1

По умолчанию будет записываться в файл какой-то, какие клиенты сейчас онлайн. Чтобы ничего не писало, нужно закомментировать строку. Я также ЗАЧЕМ то написал /dev/null 2>&1 ...

log /dev/null 2&gt;&amp;1

Это то самое логирование OpenVPN которое для безопасности лучше выключить. Дело в том, что выключить его нельзя, а если закоментировать, то логи будут писаться в /var/log/syslog

Поэтому я раскоментировал и сказал писать в /dev/null.

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

Какие DNS юзать?

Юзайте паблик DNS от Google (8.8.8.8 и 8.8.4.4.) или от OpenDNS (208.67.222.222 и 208.67.220.220).

На сегодня всё. В следующей статье, посвящённой этой же теме, я расскажу вам об утечках DNS, о том, как поднять OpenVPN скриптом, а также о различных клиентах OpenVPN для разных ОС.

July 21, 2018
by @redterror