[Из песочницы] Обходим РКН в домашней сети

imageНедавно, понадобилось скачать утилитку, в голове сразу пронеслась мысль скачать её с rutracker.org. Перейдя по url’у из поисковика, увидел сообщение о блокировке данного ресурса Роскомнадзором. Ну да, как я мог забыть, столько шума же было… Ладно, подумал я и отправился искать её на просторах интернета, ту версию которая была нужна мне, так и не удалось найти, но она есть на рутрекере! Благо есть у меня слабенькая заморская VPS’ка и это избавило меня от гугления быстрых способов обхода блокировки РКН. Быстренько поднимаю SSH-тунель до VPS’ки в режиме SOCKS-Proxy, меняю в браузере настройки и я на рутрекере — цель достигнута!

Прошло некоторое время, у меня опять возникла необходимость зайти на одноименный ресурс, но уже с другого гаджета, опять та же история, качаю Putty, поднимаю тунель, меняю настройки в браузере, захожу на сайт, после просмотра ресурса закрываю тунель и опять меняю настройки прокси. Не наш это метод! VPN поднимать на клиентах? Нет, не вариант, хотелось бы избавится от лишних действий, да и скорости нормальной (из VPN’а много не выжмешь). И в голову пришла мысль, а не поднять ли мне VPN и завернуть необходимый траффик через VPS’ку? Как говорится «Сказано — сделано!».
И так, что необходимо:

  • Домашний маршрутизатор с прошивкой DD-WRT (в моём случае «DD-WRT v3.0-r28976 std (01/27/16)»)
  • VPS’ка с Linux/FreeBSD (В примере использован CentOS release 6.6 (Final))


Условимся, что:

  • Домашня подсеть у нас: 192.168.0.0/24
  • Подсеть для VPN: 192.168.10.0/24
  • Локальный IP адрес присваемый нашему роутеру: 192.168.10.10


Для начала поднимем pptpd на VPS’ке:

# yum install pptpd -y


После установки, настраиваем конфиги:

/etc/pptpd.conf приводим к такому виду:

option /etc/ppp/options.pptpd
logwtmp
localip 192.168.10.1
remoteip 192.168.10.100-200


/etc/ppp/options.pptpd к такому:

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
lock
nobsdcomp 
novj
novjccomp
nologfd


В /etc/ppp/chap-secrets прописываем логин, пароль и IP адрес назначаемый сервером этому клиенту:

ddwrtrouter  *       XHqe9xBky10h3h2WN       192.168.10.10


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

~# touch /etc/ppp/ip-up.local
~# chmod +x /etc/ppp/ip-up.local


Этот скрипт исполняется каждый раз, когда клиенты подключаются, а так же в него передаются некоторые параметры, где $5 — это IP адрес, присвоеный клиенту, адрес у нас статический (указывали выше). Нам необходимо добавить маршрут к нашей домашней сети 192.168.0.0/24 при подключении нашего роутера.

Содержимое скрипта /etc/ppp/ip-up.local:

#!/bin/bash

case "$5" in
    192.168.10.10)
        /sbin/route add -net 192.168.0.0/24 gw 192.168.10.10 dev ppp0
        ;;
    *)
esac


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

~# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
~# sysctl -p


Добавить правила в файервол:

~# iptables -A INPUT -i eth0 -p tcp -m tcp --dport 1723 -j ACCEPT
~# iptables -A INPUT -i eth0 -p gre -j ACCEPT
~# iptables -A FORWARD -i ppp+ -o eth0 -j ACCEPT
~# iptables -A FORWARD -i eth0 -o ppp+ -j ACCEPT
~# iptables-save
~# service iptables restart


И запустить pptpd сервер:

~# service pptpd start


На этом настройка VPS’ки закончена, переходим к настройки роутера, открываем Web-GUI DD-WRT 192.168.0.1. Переходим Services > VPN и включаем PPTP Client:

PPTP Client Options: Enable
Server IP or DNS Name: ip_вашего_vpn_сервера
Remote Subnet: 192.168.10.1
Remote Subnet Mask: 255.255.255.0
MPPE Encryption: mppe required, no40, no56, stateless
MTU: 1500
MRU: 1500
NAT: Disable
Username: ddwrtrouter
Password: XHqe9xBky10h3h2WN

Логин и пароль указывали в /etc/ppp/chap-secrets. Переходим в Security > VPN Passthrough. PPTP Passthrough: Enable.

Далее в Administration > Commands в инпут вставляем следующий скрипт:

#!/bin/sh

while [ ! -f /tmp/pptpd_client/ip-up ]
do
sleep 1
done
cd /tmp/pptpd_client
cp ip-up ip-up.old
grep -v 'exit 0' ip-up.old > ip-up
# rutracker.org
echo "/sbin/route add -net 195.82.146.214 netmask 255.255.255.255 gw 192.168.10.10 dev ppp0" >> ip-up
# 2ip.ru
echo "/sbin/route add -net 178.63.151.224 netmask 255.255.255.255 gw 192.168.10.10 dev ppp0" >> ip-up
# archive.org
echo "/sbin/route add -net 207.241.224.2 netmask 255.255.255.255 gw 192.168.10.10 dev ppp0" >> ip-up
echo "/bin/cat /proc/net/ip_conntrack_flush" >> ip-up
echo "exit 0" >> ip-up


Жмем »Save Startup». Только что мы создали скрипт который запускается при старте нашего роутера, в нем мы модифицируем дефолтный скрипт ip-up, который выполняется после подключения PPTP клиента к серверу, здесь мы добавляем маршруты подсетей, которые мы хотим маршрутизировать через наш VPN сервер.

195.82.146.214 — IP адрес веб сервера rutracker.org
178.63.151.224 — IP адрес веб сервера 2ip.ru (добавил для проверки работоспособности)

Можно так же добавлять и подсети, к примеру:

echo "/sbin/route add -net 195.82.146.214 netmask 255.255.254.0 gw 192.168.10.10 dev ppp0" >> ip-up


Переходим Administration > Management и жмем Reboot Router, на этом всё, настройка закончена. После перезагрузки роутера, из домашней сети переходим по адресу 2ip.ru если видим внешний адрес нашего VPN сервера, значит у нас все получилось.

P.S.: после настройки меня все равно перекидывало на страницу провайдерской блокировки, после чистки куки и кеша все заработало, как надо.

Плюсы и минусы такого подхода:

+ Простота в настройке
+ Доступность ресурса с любого хоста в домашней сети
+ Нет необходимости настраивать все хосты в домашней сети
+ Доступность без дополнительных манипуляций
+ Вы точно знаете с какого адреса зайдете на тот или иной ресурс (в отличии от реализации с Tor’ом)

— Обход производится по IP адресу, если у домена сменится IP адрес, придется его обновить на роутере
— Добавление маршрутов руками

UPD:
Спасибо inkvizitor68sl за идею, поправил скрипт для подгрузки всех IP адресов с reestr.rublacklist.net/api/ips, таблица маршрутизации порядка ~11300 записей, полет нормальный, роутер не тормозит…

#!/bin/sh

while [ ! -f /tmp/pptpd_client/ip-up ]
do
sleep 1
done
cd /tmp/pptpd_client
cp ip-up ip-up.old
grep -v 'exit 0' ip-up.old > ip-up
#rutracker.org
echo "/sbin/route add -net 195.82.146.214 netmask 255.255.255.255 gw 192.168.10.10 dev ppp0" >> ip-up
#2ip.ru
echo "/sbin/route add -net 178.63.151.224 netmask 255.255.255.255 gw 192.168.10.10 dev ppp0" >> ip-up
#archive.org
echo "/sbin/route add -net 207.241.224.2 netmask 255.255.255.255 gw 192.168.10.10 dev ppp0" >> ip-up
echo "/usr/bin/wget -q -O - http://reestr.rublacklist.net/api/ips | /bin/sed -e 's/\;/\n/g' -e 's/\\\"//g' > /tmp/pptpd_client/rkn.ip" >> ip-up
echo "/bin/cat /tmp/pptpd_client/rkn.ip | /usr/bin/awk '{printf(\"/sbin/route add -host %s gw 192.168.10.10 dev ppp0\n\",\$0) | \"/bin/sh\" }'" >> ip-up
echo "/bin/cat /proc/net/ip_conntrack_flush" >> ip-up
echo "exit 0" >> ip-up

Кстати в этом списке reestr.rublacklist.net/api/ips нет адреса рутрекера…

© Habrahabr.ru