Double VPN

Теория

Про настройку OpenVPN мы уже рассказывали. Сегодня речь пойдёт о двойном VPN (он же double vpn).
Двойной VPN это принцип когда ты обращаешься к серверу А, а он в свою очередь перенаправляет весь трафик на сервер Б и сервер Б перенаправляет пакеты уже в интернет. Вычислив сервер Б его могут взломать и не увидеть в логах ничего кроме адреса на сервер А. Его конечно тоже можно взломать, либо конфисковать, но речь лишь о том как этот процесс усложнить. Сервер А будем называть vpn-in, а сервер Б - vpn-out.
VPS-ки для vpn-in и vpn-out следует выбирать у разных хостеров и желательно в разных странах (желательно ещё и “воинствующих”).

Подготовка vpn-in

Весь трафик будем перенаправлять на vpn-out средставми OpenSSH.
Генерируем связку ключей:

# ssh-keygen -b 4096

Создаём скрипт /root/forward_vpn.sh:

#!/bin/sh

PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin

VPN_IN_IP='XXX.XXX.XXX.XXX'
VPN_OUT_LOCAL_IP="YYY.YYY.YYY"
VPN_OUT_IP='vpn@ZZZ.ZZZ.ZZZ.ZZZ'
VPN_IN_LOCAL_PORT='XXX'
VPN_OUT_REMOTE_PORT='XXX'

ident=`ps ax | grep ssh | grep $VPN_OUT_IP | grep $VPN_OUT_REMOTE_PORT | grep -v grep`
if [ "$ident" ]
then
        echo "$VPN_OUT_IP ... OK"
else
        command="ssh -Nf -L $VPN_IN_IP:$VPN_IN_LOCAL_PORT:$VPN_OUT_LOCAL_IP:$VPN_OUT_REMOTE_PORT $VPN_OUT_IP"
        echo $command
        $command
fi

где VPN_IN_IP - внешний адрес вашего сервера vpn_in, VPN_OUT_LOCAL_IP - локальный адрес OpenVPN на vpn_out, VPN_OUT_IP - внешний адрес vpn_out. VPN_IN_LOCAL_PORT, VPN_OUT_REMOTE_PORT - локальный и удалённый порт vpn (чтобы не привлекать лишнего внимания - можно настроить vpn на 443 порт).

Добавляем в crontab задание:

# crontab -l
* * * * * /bin/sh /root/forward_vpn.sh

Подготовка vpn-out

vpn-out настраивается точно так же как и любой openvpn-сервер, для удобства можно воспользоваться скриптом openvpn_paranoid_installer.
Кроме того необходимо создать пользователя vpn:

# useradd vpn

и добавить ему публичный ключ vpn_in для входа без пароля (заходим на vpn-in и выполняем ssh-copy-id vpn@vpn_out)

Общие рекомендации для vpn-in/vpn-out

  • заходить на vpn-out следует исключительно через сервер vpn-in (в том числе по ssh), иначе теряется смысл двойного vpn
  • выполнить netstat -tulpan и посмотреть какие порты светят наружу, удалить/выключить всё лишнее (вроде ntpd, rpcbind)
  • отключить вход по паролю для ssh
  • включить автоматическое обновление ОС и её компонентов на vpn-in/vpn-out
  • при генерации новых ключей с конфигами на vpn-out не забывать менять параметр server в конфиге на адрес VPN_IN_IP
  • на локальном компьютере запретить доступ ко всему кроме VPN_IN_IP