Настройка DoubleVPN на базе OpenVPN на вашей собственной VPS.

Настройка DoubleVPN на базе OpenVPN на вашей собственной VPS.

@Web_Security_Channel
https://t.me/Web_Security_Channel
Вся представленная информация несёт лишь ознакомительный характер и не призывает вас к действиям нарушающих закон! Мы помогаем вам защитить свои конфиденциальные данные.
Приветствуем всех участников нашего проекта "Web Security"!
Не забудь вступить и подписаться:
https://t.me/Web_Security_Channel
https://t.me/Web_Security_Chat
Если вы с нами, то вы уже в какой то степени защищены.


В наши дни часто требуется скрыть свой настоящий IP. Кроме того, тысячи сайтов сегодня блокируются по разным причинам, как политическим, так и без особой на то причины.

Здесь мы не будем обсуждать законность обхода блокировок, но если блокировки препятствуют нормальной работе интернета, то каждый пользователь, в конце концов, имеет право на свободный доступ к информации. Здесь мы ни к чему не призываем пользователя. Вся информация дана здесь в образовательных целях, и не является призывом к совершению противоправных действий

(так сказать, дисклеймер).

VPN как таковой шифрует трафик между пользователем и сервером VPN. Это позволяет добиться того, что провайдер не будет пытаться вмешаться в пользовательский трафик и что-либо блокировать (например, через системы глубокой инспекции пакетов, DPI). Кроме того, сайты будут видеть вместо родного IP пользователя, IP его VPN-а. Еще более безопасным является объединение нескольких VPN в цепочку. Ваш провайдер будет видеть Вас подключающимся к входному VPN, а сайты в интернете будут видеть вас выходящим с IP выходного VPN. Поэтому связать данные сайтов и данные провайдера будет сложнее. Т.е., это дает большую анонимность и конфиденциальность.

Пользоваться бесплатными общедоступными VPN-провайдерами, как и платными, я не рекомендую. Эти провайдеры часто обещают не вести логи, не собирать информацию о пользователе, а на деле многие из них не выполняют свои обещания. Более того, уже было несколько прецедентов «слива» баз данных с логами пользователей, т.е., данные конфиденциального характера были выложены в открытый доступ. Поэтому тем, кто действительно заботится о своей приватности и конфиденциальности, я рекомендую настроить VPN самостоятельно, или, в крайнем случае, заказать настройку у фрилансера, на том же kwork.ru.

Здесь мы рассмотрим настройку двойного VPN пользователем на собственных VPS/VDS. VPS/VDS это виртуальная машина, которая полностью находится в распоряжении пользователя. Для настройки VPN, а мы рассмотрим настройку VPN на базе OpenVPN, подходит практически любая VPS с минимальными характеристиками (512 MB — 1 GB памяти и 5 GB диска) под управлением Linux. Единственно что стоит учесть — это чтобы данная VPS позволяла настройку интерфейса tun. Tun это драйвер ядра Linux, который используется для адресации концов туннеля между двумя машинами — клиентом и сервером. Часто на очень дешевых VPS на базе OpenVZ-контейнеров опция активизации модуля tun недоступна. На некоторых хостингах для VPS на базе OpenVZ для загрузки модуля tun бывает спец. галочка в панели управления. Но так не везде. Поэтому лучше брать VPS на базе полноценной виртуализации, типа QEMU/kvm, или VMWare или Xen. А OpenVZ лучше обходить стороной, или, в крайнем случае, проверить, есть ли опция загрузки модуля tun, или нет.

Также следует выбирать локацию хостинга VPS так, чтобы там отсутствовали блокировки. Например, в странах ЕС или США/Канаде. Если мы хотим, чтобы сайты нас видели в определенной стране (т.е., наш видимый IP находился в этой стране), и следует выбирать VPS на хостинге, который имеет в списке локаций эту страну. Для двойных VPN можно, например, иметь входную VPS в Европе, а выходную в США. Иными словами, понадобятся две отдельные VPS, расположенные в двух разных местах. Их мы объединим в цепочку. Т.е., первая VPS соединяется со второй через VPN. Аналогично, можно делать цепочки и из трех и более VPS.

По умолчанию OpenVPN использует tcp/udp-порты 1194 для пересылки своего трафика, но эти порты могут блокироваться провайдерами. Поэтому мы рекомендуем использовать порт 443/tcp или 53/udp. Эти порты обычно всегда открыты. 443/tcp используется для защищенного веб-трафика (https), а 53/udp это порт DNS. Https-трафик всегда зашифрован, поэтому если повесить OpenVPN на этот порт, то его будет трудно отличить от обычного https-трафика.

Для удобства рекомендую на каждую из VPS установить следующие программы:

apt install mc nano screen net-tools

Здесь mc это Midnight Commander — удобный двухпанельный файловый менеджер для консоли Unix/Linux. Nano — удобный редактор для текстовых файлов, предоставляющий дружественный интерфейс пользователя. Screen это программа-мультиплексор терминала. Позволяет запустить набор программ на нескольких экранах, переключаться мажду ними и восстанавливать сеанс после обрыва связи. Очень удобная вещь, рекомендую. Net-tools это пакет с командами netstat, ifconfig, telnet и др., очень полезными для диагностики проблем. Почему-то, в последнее время не входит в дефолтный набор установленных программ, и его надо ставить отдельно. По этим программам есть хелпы в интернетах, поэтому не будем на них подробно останавливаться.

Будем считать, что у нас есть два сервера с IP 1.1.1.1 и IP 2.2.2.2. Первый сервер — входной, второй выходной. В данном материале мы будем использовать VPS под управлением Debian. Будем считать, что версия Debian 9 (stretch) либо 10 (buster). Заходим вначале на первый сервер и выполняем команды:

apt update
apt upgrade
cd /root

— Здесь мы обновили кеш пакетов и обновили систему из репозитория. Теперь наша система обновлена до последней версии. Будем использовать для удобства скрипт openvpn-install.sh. Следующая команда скачает скрипт с его сайта и запустит его на нашей машине:

wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh

— На все вопросы отвечаем утвердительно и выбираем «client» в качестве имени создаваемого клиента. Будут созданы нужные ключи и сертификаты и установлен OpenVPN. Далее, открываем главный конфиг сервера в нашем любимом редакторе:

nano /etc/openvpn/server.conf

Удаляем все строки (Ctrl-k) и вставляем вот это:

port 443
proto tcp
dev tun
tls-server
server 192.168.100.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
# status openvpn-status.log
push redirect-gateway
push "route 192.168.100.0 255.255.255.0"
duplicate-cn
#comp-lzo
mssfix 0
auth-nocache
auth SHA512
cipher AES-256-CBC

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

ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

max-clients 50

verb 0
log /dev/null
status /dev/null
log-append /dev/null

Сохраняем (Ctrl-x), жмем «Y» и соглашаемся с именем файла по умолчанию. Переименуем файл tc.key в ta.key. Также откроем файл /root/client.ovpn и поменяем в нем <tls-crypt> и </tls-crypt> на <tls-auth> и </tls-auth>. Здесь мы используем в конфигах опцию tls-auth вместо tls-crypt, т.к. с последней были проблемы с виндовым клиентом openvpn (он отказывался импортировать конфигурационный файл с последней опцией). Поэтому мы решили использовать более совместимую опцию tls-auth. После этого прибиваем OpenVPN командой kill и запускаем его снова:

# ps ax | grep vpn
15696 pts/4    S      1:09 openvpn --config server.ovpn

kill 15696
# ps ax | grep vpn
5625 pts/12   S+     0:00 grep vpn

cd /etc/openvpn/server
nohup openvpn --config server.conf &
# ps ax | grep vpn
15697 pts/4    S      1:09 openvpn --config server.ovpn

Наш сервер перезапустился. Теперь переходим ко 2-му серверу. Как и на первом, выполняем команды:

apt update
apt upgrade
cd /root
wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh

— Мы обновили систему из репозитория и установили openvpn при помощи скрипта openvpn-install.sh. Также везде отвечаем утвердительно и выбираем «client» как имя клиента. Редактируем конфиг:

nano /etc/openvpn/server.conf

Все строки удаляем, и вставляем вот такой кусок:

port 53
proto udp
dev tun
tls-server
server 192.168.101.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
# status openvpn-status.log
push "route 192.168.101.0 255.255.255.0"
duplicate-cn
comp-lzo yes
mssfix 0
auth SHA512
cipher AES-256-CBC

ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

verb 0
log /dev/null
status /dev/null
log-append /dev/null

Перезапускаем сервер (точно так же, как мы это делали на первом сервере). Теперь смотрим в файл /root/client.ovpn. Должен начинаться примерно так:

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 178.33.86.165 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
comp-lzo
setenv opt block-outside-dns
key-direction 1
mssfix 0
auth-nocache
verb 3
<ca>
-----BEGIN CERTIFICATE-----
MIIDKzCCAhOgAwIBAgIJAI9xq8rqEEWfMA0GCSqGSIb3DQEBCwUAMBMxETAPBgNV
...

Теперь удаляем все строки до <ca> и вставляем вместо них:

client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 2.2.2.2 53
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
#comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3
comp-lzo yes
auth-nocache
mssfix 0
script-security 2
#script-security 2 system
up /etc/openvpn/route_rules.sh

Здесь вместо 2.2.2.2 должен быть IP 2-го сервера. Сохраняем и выходим. Копируем файл client.ovpn со 2-го сервера на 1-ый под именем /etc/openvpn/to_another_server.conf. Создаем там же файл /etc/openvpn/route_rules.sh:

nano /etc/openvpn/route_rules.sh

и вставляем скрипт:

#! /bin/sh
#

echo '150 vpn.out' >> /etc/iproute2/rt_tables
ip rule add from 192.168.100.0/24 table vpn.out
ip route add default dev tun1 table vpn.out
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o tun1 -j MASQUERADE

Скрипт при поднятии линка добавляет роутинги и правила файрволла (маскарадинг). Это нужно для того, чтобы пользователи VPN прятались за IP 1-го сервера (это и есть маскарадинг). Далее, делаем скрипт исполняемым:

chmod 777 route_rules.sh

Стартуем впн с 1-го сервера на 2-ой:

nohup openvpn --config /etc/openvpn/to_another_server.ovpn &

Проверяем по команде ifconfig, должно показывать два интерфейса tun0 и tun1. Это значит, что оба впн-а поднялись. Также, для автоподнятия впн-а на второй сервер после перезагрузки заходим в /etc/default/openvpn и прописываем строку:

AUTOSTART="to_another_server"

Теперь редактируем на 1-й машине конфиг клиента:

nano /root/client.ovpn

— здесь также удаляем строки до строки <ca> и вставляем вместо них следующие:

client
dev tun
proto tcp
sndbuf 0
rcvbuf 0
remote 1.1.1.1 443
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
#comp-lzo
# --- windows ---
setenv opt block-outside-dns
ignore-unknown-option block-outside-dns
block-outside-dns
# --- windows ---
# --- linux ---
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
# --- linux ---
key-direction 1
verb 3

Заменяем 1.1.1.1 на IP 1-го сервера в вышеприведенном конфиге. Полученный конфиг клиента можно скопировать на свою локальную машину. Строки, помеченные как «— windows —«, подойдут для клиентов под управлением Windows и MacOS. Строки, помеченные как «— linux —«, подойдут для Linux (Unix). Если у вас windows, то строки, нужные для Linux, лучше закомментировать, и наоборот. Данные строки необходимы для поднятия DNS через туннель (чтобы не было «утечки DNS» и не использовался DNS провайдера). Теперь следует перейти опять на 2-ю машину и настроить правила файрволла:

apt install iptables-persistent

Соглашаемся с сохранением настроек файрволла в файлы /etc/iptables/rules.v4 (IPv4) и /etc/iptables/rules.v6 (IPv6). Здесь настройку для IPv6 оставим за рамками нашей статьи. Откроем файл для IPv4:

nano /etc/iptables/rules.v4

Удаляем все строки и вставляем следующий кусок:

# Generated by iptables-save v1.6.0 on Thu Oct 17 21:23:19 2019
*filter
:INPUT ACCEPT [560:118664]
:FORWARD ACCEPT [30:1800]
:OUTPUT ACCEPT [548:110691]
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.101.0/24 -j ACCEPT
COMMIT
# Completed on Thu Oct 17 21:23:19 2019
# Generated by iptables-save v1.6.0 on Thu Oct 17 21:23:19 2019
*nat
:PREROUTING ACCEPT [49511:4242962]
:INPUT ACCEPT [10052:625143]
:OUTPUT ACCEPT [33:2315]
:POSTROUTING ACCEPT [33:2315]
-A POSTROUTING -s 192.168.101.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Oct 17 21:23:19 2019

Здесь следует отметить правила для маскарадинга и для запрещения пинга (ICMP type 8 — echo reply). При помощи правила маскарадинга, 1-ая машина прячется за IP 2-ой машины. Запрещение пинга желательно делать для того, чтобы сайты вроде гугла не могли определить наличие туннеля по различию задержек при пинге из браузера пользователя и с сайта до внешнего IP пользователя. Это также называется «двусторонний пинг».

Теперь идем вот сюда:

cd /etc/network/if-pre-up.d
nano iptables

И вставляем вот такой скрипт:

#! /bin/sh
#

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables-restore </etc/iptables/rules.v4
exit 0

Теперь делаем этот файл исполняемым:

chmod 777 iptables

Данный файл пишет «1» в служебный файл /proc/sys/net/ipv4/ip_forward, что включает IP-форвардинг, иными словами, маршрутизацию пакетов между сетевыми интерфейсами машины, например, tunX и ethX. Далее, при помощи команды iptables-restore восстанавливаются правила файрволла из файла /etc/iptables/rules.v4. Этот этот скрипт будет выполняться перед поднятием сетевого интерфейса eth0.

Замечание: в некоторых VPS основной сетевой интерфейс может называться не eth0, а, например, ens3. Как он на самом деле называется, легко определить командой ifconfig (при запуске без параметров она выводит полный список интерфейсов). Если это ваш случай, то надо поправить файл /etc/iptables/rules.v4 (eth0 заменить на ваше имя интерфейса).

Теперь пробуем соединиться клиентом openvpn к серверу. Когда будет готово, проверяем, есть ли пинг. Если пинга нету, то где-то ошибка. Частой ошибкой бывает, когда забыли включить маскарадинг на 2-й машине. Также бывает, что забыли включить компрессию на одной стороне туннеля, и включили на другой. Соответственно, линк не поднимается. В таком случае, бывает полезно включить логи на стороне клиента и/или сервера и смотреть подробнее. Полезным методом диагностики еще может быть команда:

# traceroute 192.168.101.1
traceroute to 192.168.101.1 (192.168.101.1), 30 hops max, 60 byte packets
 1  192.168.100.1 (192.168.100.1)  37.444 ms  112.117 ms  112.081 ms
 2  192.168.101.1 (192.168.101.1)  227.136 ms  291.842 ms  291.819 ms

Здесь мы трассируем пакеты по цепочке из двух туннелей (первый соединяет клиента и 1-й VPS, а второй 1-ю VPS со 2-ой). Из трейса выше видно, что трейс дошел до 2-й VPS (IP 192.168.101.1). Если же трейс прервется на 1-й VPS (IP 192,168.100.1), это будет означать, что есть проблемы со связью между 1-й и 2-й VPS. Так можно определить, на какой стадии затык.

Еще следует заметить опцию «mssfix 0» в конфигах всех VPN. Эта опция убирает «VPN fingerprint» («отпечаток пальца», который представляет собой MTU VPN-канала). MTU это максимальный размер пакета, который может пройти через канал связи без фрагментации. У ethernet mtu обычно равен 1500 байт. Т.к. пакеты VPN инкапсулируются в пакеты того же ethernet, то mtu у VPN обычно бывает меньше. И по mtu можно косвенно определить туннель. Т.е., mtu служит «отпечатком», по которому можно определить VPN. Так вот, опция mssfix меняет MTU канала. При задании «mssfix 0» для MTU выбирается максимальный размер. Таким образом, становится нельзя определить туннель по его mtu.

Если пинг идет, то следующим шагом будет проверка анонимности на сайтах типа whoer.net или 2ip.ru/privacy/. Эти сайты должны показать возможные ошибки, которые нужно устранить. Например, наличие VPN fingerprint, двустороннего пинга, утечек DNS и прочих проблем.

На этом все.

Пока я пишу для тебя новую статью, можешь почитать:
https://t.me/Web_Security_Channel
и посетить наш чат:
https://t.me/Web_Security_Chat



Report Page