Настройка DoubleVPN на базе OpenVPN на вашей собственной VPS.
@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