Как человек постоянно работающий в интернете, я привык к полному и беспрепятственному доступу ко всем его ресурсам независимо от содержания данных ресурсов, а в силу того, что обеспечиваю работу части ресурсов (работаю в хостинг-провайдере), мне просто необходим такой доступ.
Обойти блокировки не так сложно, есть куча способов. Наиболее распространенный и стабильный из них — VPN. Но у VPN большой недостаток — это потеря скорости, завышается пинг и т.д. От суда у меня возникла идея, использовать VPN только для обхода блокировок, а на остальные ресурсы ходить через провайдера.
Делать я это все буду на роутере TP-Link WR841N, чтобы обеспечить беспрепятственный доступ в интернет для всех сетевых устройств, а не только для рабочего компьютера.
Для начала нам потребуется поднять OpenVPN сервер или воспользоваться услугами VPN провайдера. Если же вы решите поднять собственный сервер, я бы рекомендовал использовать OpenVPN Access Server, т.к. с помощью него можно просто и быстро его развернуть, а также имеет веб-интерфейс. Достаточно просто установить пакет и задать пароль на учетную запись openvpn.
Я не буду описывать как прошить роутер под OpenWRT, уже есть такая статья. Я скажу даже больше, есть даже решение проблемы с отсутствием OpenVPN в прошивке OpenWRT под TP-Link WR841N — вот эта статья. Единственное, из этой статьи мне пришлось немного подправить init-скрипт, т.к. возникла проблема с автозапуском, а также я добавил условие при котором скрипт не будет скачивать дистрибутив OpenVPN при каждом запуске, а только при первом.
#!/bin/sh /etc/rc.common START=99 start() { local TMPPATH=/tmp/openvpn if [ ! -f "${TMPPATH}/usr/sbin/openvpn" ]; then sleep 60; [ ! -d ${TMPPATH} ] && mkdir ${TMPPATH} cd ${TMPPATH} opkg update || exit 1 tar xzf $(opkg download libopenssl | grep Downloaded | cut -d\ -f4 | sed '$s/.$//') tar xzf data.tar.gz tar xzf $(opkg download openvpn-openssl | grep Downloaded | cut -d\ -f4 | sed '$s/.$//') tar xzf data.tar.gz rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh for i in $(ls ${TMPPATH}/usr/lib) do [ ! -f /usr/lib/$i ] && ln -s /tmp/openvpn/usr/lib/$i /usr/lib/$i done fi ${TMPPATH}/usr/sbin/openvpn --writepid /tmp/ovpn_ciberterminal.pid --daemon --cd /etc/openvpn --config my.conf } stop() { PIDOF=$(ps | egrep openvpn | egrep -v grep | awk '{print $1}') kill ${PIDOF} }
Итак, допустим у нас есть роутер с установленной прошивкой OpenWRT и OpenVPN. Правим файл-конфигурации подключения OpenVPN, у меня он находится в /etc/openvpn/my.cnf. Добавляем в него следующие параметры:
route-noexec #Этот параметр не дает перезаписать default route. auth-user-pass login.conf #Для автоматической авторизации keepalive 3 10 #Перезапуск соединения при разрыве persist-tun #Не ложить tun/tap интерфейс про разрыве persist-key #Не считывать ключи при разрыве
Создаем файл /etc/openvpn/login.conf в следующем формате:
yourlogin yourpassword
Соответственно yourlogin и yourpassword нужно заменить на ваши авторизационные данные, если кто не понял.
Создаем скрипт /etc/openvpn/unban.sh, который будет выгружать список заблокированных IP и прописывать маршруты:
#!/bin/sh TUN=`ifconfig | grep tun | awk '{print $1}'` MIN_ROUTES="15" if [ "$TUN" == "" ]; then exit; fi CHECK_ROUTES=`route | wc -l` if [ "$CHECK_ROUTES" -gt "$MIN_ROUTES" ]; then exit; fi route add 8.8.8.8/32 dev $TUN; route add 8.8.4.4/32 dev $TUN; route add 77.88.8.8/32 dev $TUN; wget "http://reestr.rublacklist.net/api/ips" -O /tmp/ip_list; LIST=`cat /tmp/ip_list | sed 's/;/\n/g' | grep -v '"' | awk -F. '{print $1"."$2"."$3".0/24"}' | sort | uniq` for IP in $LIST do echo "Adding $IP..." route add -net $IP dev $TUN; done REMOTE_IP=`cat /etc/openvpn/my.conf | grep remote | tail -n1 | awk '{print $2}'`; DEFAULT_GW=`route | grep default | awk '{print $2}'` route add ${REMOTE_IP}/32 gw $DEFAULT_GW; rm -rf /tmp/ip_list;
Опишу некоторые нюансы:
1. Мой провайдер, как оказалось, перехватывает DNS запросы и выдает мне ложный IP заблокированных сайтов, соответственно, чтобы этого избежать необходимо направить DNS запросы через VPN. Если Вы используете другие DNS серверы, стоит поправить строки:
route add 8.8.8.8/32 dev $TUN;
route add 8.8.4.4/32 dev $TUN;
route add 77.88.8.8/32 dev $TUN;
заменив IP Google и Yandex DNS на IP своих DNS серверов.
2. В переменной MIN_ROUTES задано минимальное количество существующих маршрутов при котором возможно дальнейшее выполнение скрипта. Обычно, до запуска данного скрипта, у меня не больше 15 маршрутов в таблице, если у вас больше маршрутов, следует изменить значение переменной MIN_ROUTES до минимального, но количество должно быть не менее существующих. Проверить это можно выполнив команду route | wc -l.
3. Т.к. роутер у меня очень слабенький, он не может осилить все 30000 с лишним маршрутов, бывает сбрасывает их, а также, чтобы прописать все 30к маршрутов уходило порядка 5 минут, а то и больше. Поэтому мне пришлось придумать как сократить список маршрутов. Решением стало добавление маршрутов подсетями по /24, это позволило сократить список до 8000 с лишним. Если ваш роутер позволяет прописывать большое количество маршрутов, то замените переменную LIST на:
LIST=`cat /tmp/ip_list | sed 's/;/\n/g' | grep -v '"' | sort | uniq`
4. Подсеть в которой находился мой VPN сервер была в списке блокировок, из-за этого у меня сбрасывался маршрут на сам VPN сервер, пришлось добавить в скрипт строки:
REMOTE_IP=`cat /etc/openvpn/my.conf | grep remote | tail -n1 | awk '{print $2}'`; DEFAULT_GW=`route | grep default | awk '{print $2}'` route add ${REMOTE_IP}/32 gw $DEFAULT_GW;
Если у вас такой проблемы нет, то это можно убрать из скрипта.
Далее включаем планировщик задач cron и активируем автозапуск:
/etc/init.d/cron start /etc/init.d/cron enable
Выполняем команду crontab -e и добавляем в планировщик задание:
*/5 * * * * /bin/sh /etc/openvpn/unban.sh
Скрипт будет запускаться раз в 5 минут и проверять нужно ли прописывать маршруты. Частоту запуска можете изменить по своему усмотрению.
Возможно многие захотят спросить, зачем использовать cron, если можно просто добавить в конфиг подключения OpenVPN что-то вроде «up unban.sh» и скрипт будет выполняться сразу после подключения. Отвечу: при перезапуске VPN соединения маршруты сбрасываются, а скрипт повторно не выполняется.
ссылка на оригинал статьи https://habrahabr.ru/post/317354/
Добавить комментарий