Адрес РуТрекера для пользователей РФ - MainTracker.org

Расскажи друзьям:  

Элегантный обход блокировки с помощью Mikrotik и VPN

Страницы:  1

Ответить
Автор
Сообщение

jura777-inf

Стаж: 10 лет 6 месяцев

Сообщений: 25

jura777-inf · 25-Авг-16 20:19 (10 месяцев назад, ред. 11-Сен-16 08:09)

[Цитировать] 

Вот решил поделиться методикой обхода блокировки сайтов с помощью Mikrotika и VPN.
Для работы необходимо
1 – Роутер Mikrotik c RouterOS с 2мб свободного пространства на диске (у кого нет могут дальше не читать)
2 – Хостинг PHP (необходим для формирования списка IP адресов. Реальный или локальный, кто сможет найти другое решение респект.)
3 – Заграничный VPN сервер (желательно платный, на бесплатном не работает рутрекер. У кого есть поделитесь.).
Настройка очень простая
Шаг 1
Отредактировать под свои параметры и в терминале их просто загрузить.
Первые две строчки можно не заливать, они нужны только для замены DNS с ваших на гуголовские.
Код:
/interface pppoe-client set |ваше PPPoE соединение| use-peer-dns=no
/ip dns set allow-remote-requests=yes servers=8.8.8.8,8.8.4.4
/interface l2tp-client add connect-to=|IP VPN сервера| disabled=no mrru=1600 name=|имя VPN соединнение| password=|VPN пароль| user=|VPN логин|
/ip firewall nat add action=masquerade chain=srcnat out-interface=|имя VPN соединнение|
/ip route add distance=1 gateway="|имя VPN соединнение|" routing-mark=mangle_list_roscomnadzor
/ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=list_roscomnadzor in-interface=|ваш LAN| new-routing-mark=mangle_list_roscomnadzor
/ip firewall address-list add address=195.82.146.214 list=list_roscomnadzor
/ip firewall address-list add address=104.24.106.53 list=list_roscomnadzor
/ip firewall address-list add address=104.24.107.53 list=list_roscomnadzor
Шаг 2
Разместить на PHP хостинге PHP код без имений.
Код:
// Антизапрет Роскомнадзора
// Формирования списка IP адрессов для Mikrotik
// v 2.0 25.08.2016
// Данные
$ban_list_1 = 'http://api.antizapret.info/group.php';
$ban_list_2 = 'http://reestr.rublacklist.net/api/ips';
// Загрузка списка зрещённых сайтов
$open_ban_list_1 = file_get_contents($ban_list_1);
$open_ban_list_2 = file_get_contents($ban_list_2);
// Обработка списка antizapret.info
$data_ban_list_1 = str_replace("\n", ',', $open_ban_list_1);
$data_ban_list_1 = str_replace(',', '|', $data_ban_list_1);
$data_ban_list_array_1 = explode('|', $data_ban_list_1);
// Обработка списка rublacklist.net
$data_ban_list_2 = str_replace('"', '', $open_ban_list_2);
$data_ban_list_array_2 = explode(';', $data_ban_list_2);
// Потготовка полного списка IP адресов
$array_list = array_merge($data_ban_list_array_1, $data_ban_list_array_2);
$array_list_unique = array_unique($array_list);
$array_list_diff = array_diff ($array_list, $array_list_unique);
$array_list = array_merge($array_list_unique, $array_list_diff);
sort($array_list);
// Формирование скрипта для загрузки в Mikrotik
header('Content-Type: text/plain');
echo '/ip firewall address-list' . "\n";
for($i = 5; $i < count($array_list); $i++):
if ($data_ban_list_array[$i] != "") echo "add address=" . $array_list[$i] . " list=list_roscomnadzor" . "\n";
endfor;
Шаг3
Зайти в system -> script и создать новый скрипт, не забыв перед этим указать адрес сервера с которого будут браться ip адреса.
Особенности – при запуске может в логах вылетать шибка “[AZ] download the script FAILED, script stopped” или “[AZ] AD block script download FAILED” это не страшно надо просто ещё раз запустить скрипт, если не получится тогда придётся заливать в ручную через команду “/import file-name=имя файла” (кто сможет доработать данный скрипт отдельный респект и уважуха)
Код:
## AntiZapret - Script for anti ROSCOMNADZORa
## @version 0.2 beta 25.08.2016
##
## Setup this Policy for script: [X] Read [X] Write [X] Policy [X] Test
:local hostScriptUrl "http://vash.domen/antizapret.php";
:local scriptName "anti_zapret.script";
:local logPrefix "[AZ]";
do {
:log info "Running script $logPrefix";
/tool fetch mode=http url=$hostScriptUrl dst-path=("./".$scriptName);
:if ([:len [/file find name=$scriptName]] > 0) do={
   :delay 1s;
     /ip firewall address-list remove [/ip firewall address-list find];
     /import file-name=$scriptName;
     /file remove $scriptName;
     :log info "Script $logPrefix execution is completed";
} else={
   :log warning "$logPrefix download the script FAILED, script stopped";
}
} on-error={
:log warning "$logPrefix AD block script download FAILED";
};
P.S. У кого нет необходимости пользоваться трудом сотрудников роскомнадзора в полном объеме, могут смело не заморачиваться с хостингом ну и соответственно с 2 и 3 шагом. А вносить как IP так и доменные адреса вручную ip -> firewall -> address-list не забыв указать в качестве имени “list_roscomnadzor”. На момент написания в базе было 24759 заблокированных IP адресов.
P.S. Есть виртуальный сервер в Латвии с поднятым Mikrotik 5.25 x86, l2tp + на днях будет IPsec, стоимость 3000 в год, предлагаю скооперироваться. Кому интересно из Москвичей прошу в ЛС. Канал около 10Mb так что думаю не более 10 человек с условием гонять только сайты.
[Профиль]  [ЛС] 

XtenD-Vas

Стаж: 5 лет 2 месяца

Сообщений: 40

XtenD-Vas · 26-Авг-16 20:49 (спустя 1 день, ред. 26-Авг-16 20:49)

[Цитировать] 

Можно прокачать PHP-скрипт, но мне кажется, что можно замутить его функционал на самом микротике. В РоутерОСи вроде есть утилиты для закачки файлов из интернета и замены символов в строках, это необходимо маны курить.
На данный момент насчитал 24935 адресов.
Код:
<?php
/* Глобальные переменные: Списки сайтов с Роскомнадзоровскими банами.  Знаки, которые нужно отфильтровать. Шаблоны для вставки в вывод */
$banLists = array(
    "http://api.antizapret.info/group.php",
    "http://reestr.rublacklist.net/api/ips"
);
$replaceChars = array(
    "\"" => "",
    "," => "\n",
    " " => "\n",
    ";" => "\n"
);
$addTemplate = "add list=list_roscomnadzor address=";
/* Формируем список заблокированных IP-адресов */
function getBannedAdresses(){
    global $banLists, $replaceChars;
    foreach($banLists as $ban){
        $raw.=file_get_contents($ban);
    }
    $raw = strtr($raw,$replaceChars);
    $raw = array_unique(array_filter(explode("\n",$raw)));
    return $raw;
}
/* Формируем скрипт для микротика, подаём ему список забаненных адресов */
function formMikrotikScript($list){
    global $addTemplate;
    return "/ip firewall address-list"."\n".$addTemplate.implode("\n".$addTemplate,$list);
}
/* Выводим полученные результаты */
header('Content-Type: text/plain');
echo formMikrotikScript(getBannedAdresses());
?>
[Профиль]  [ЛС] 

jura777-inf

Стаж: 10 лет 6 месяцев

Сообщений: 25

jura777-inf · 27-Авг-16 02:56 (спустя 6 часов, ред. 27-Авг-16 02:56)

[Цитировать] 

XtenD-Vas писал(а):
71297721В РоутерОСи вроде есть утилиты для закачки файлов из интернета и замены символов в строках, это необходимо маны курить.
Так вот для закачки а далее я как то не очень.
Код:
:local hostScriptUrl "http://vash.domen/antizapret.php";
:local scriptName "anti_zapret.script";
/tool fetch mode=http url=$hostScriptUrl dst-path=("./".$scriptName);
Можно через openwrt попробовать, но как незнаю.
[Профиль]  [ЛС] 

vangrieg

Стаж: 1 год 10 месяцев

Сообщений: 2


vangrieg · 08-Дек-16 01:27 (спустя 3 месяца 11 дней)

[Цитировать] 

Поскольку адресов заблокированных много, и 99% их лично мне не нужны, и заморачиваться с хостингом мне не хочется, я сделал скрипт, автоматически качающий заблокированные айпи адреса для указанных мной сайтов средствами самого микротика.
Кроме самого скрипта, у меня используются два файла - testEntries.txt и whitelist.txt. В первом перечисляются сайты,которые не заблокированы, но могут быть нужны, чтобы проверить, как все работает через VPN, какая скорость и т.п. Можно этим не пользоваться. Второй - собственно, список сайтов, на которые надо ходить через VPN. Перечисляются через запятую ключевые слова, вот так:
Код:
linkedin,rutracker.org,facebook,wikipedia
Если сайт в списке есть, но не заблокирован, ничего добавляться не будет, так что сайты можно добавлять на будущее.
Сам скрипт на Микротике:
Код:
:log warning ("-----------BEGIN WHITELIST UPDATE----------");
:local txtEntry;
#Здесь пишем название address-list для сайтов из списка РКН. Можете заменить на то, которое прописано у вас.
:local wlName "rcn_whitelist";
#Здесь пишем название address-list для тестовых сайтов (необязательно). Если этот список будет использоваться, для него нужно прописать такое же правило в Mangle, как и для основного списка.
:local tlName "test_sites";
#Название файла со списком сайтов, которые хотим разблокировать через запятую
:local wlFilename whitelist.txt;
#Название файла со списком тестовых сайтов (или других, которые хотим пустить через VPN по каким-либо причинам)
:local tlFilename testEntries.txt;
:local tmpFilename temp.txt;
:log warning ("-------------TEST SITES ADD---------------");
:local list;
do {
    :set list [:toarray [/file get $tlFilename contents]];
    /ip firewall address-list remove [find where list=$tlName];
    :if ($list = "" || $list = "\n") do={
        :log warning ("Test site list is empty. Skipping.");
    } else={
        :foreach i in=$list do={
            do {
                :local tlIp [:resolve $i]
                if ([/ip firewall address-list find where address=$tlIp] = "") do={
                    /ip firewall address-list add list=$tlName comment=$i address=$tlIp;
                    :log warning ("Entry for $i created");
                } else={
                    :log warning ("Entry for $i already exists. Skipping. ");
                }
            } on-error {
                :log warning ("Error - entry for $i couln't be created");
            }
        }
    }
} on-error {
    :log warning ("Couldn't update test site list. Skipping. ");
}
:log warning ("------------BLACKLIST SITES ADD---------------");
:local whitelist;
do {
    :set whitelist [:toarray [:file get $wlFilename contents]];
    /ip firewall address-list remove [find where list=$wlName];
    :if ($whitelist = "" || $whitelist = "\n") do={
        :log warning ("Whitelist is empty. Skipping. ");
    } else={
        :foreach i in=$whitelist do={
            :log warning ("Checking blacklist for $i");
            do {
                /tool fetch url="https://api.antizapret.info/get.php?item=$i&type=csv" mode=https dst-path=$tmpFilename;
                :delay 2;
                :set txtEntry [/file get $tmpFilename contents];
                :if ($txtEntry = "" || $txtEntry = "\n") do={
                    :log warning ("No entry for $i. Skipping. ");
                } else={
                    :log warning ("Blacklist entry for $i found. Adding. ");
                    :local counter 1;
                    :local beg -1;
                    :local nxt;
                    do {
                        :if ($counter = 4) do={
                            :set nxt [:find $txtEntry "\n" $beg];
                        } else={
                            :set nxt [:find $txtEntry ";" $beg];
                        }
                        :set beg ($beg + 1);
                        :local data [:pick $txtEntry $beg $nxt];
                        :set beg $nxt;
                        :if ($counter = 4) do={
                            :local arr [:toarray $data];
                            :foreach j in=$arr do={
                                :if ([/ip firewall address-list find where address=$j] = "") do={
                                    /ip firewall address-list add list=$wlName address=$j comment=$i;
                                    :log warning ("Adding entry for $i with address $j");
                                } else={
                                    :log warning ("Address already exists. Skipping. ");
                                }
                            }
                            :set counter 1;
                        } else={
                            :set counter ($counter + 1);
                        }
                    } while=([:typeof $beg] = "num");
                }
            } on-error {
                :log warning ("No entry for $i");
            }
        }
    }
} on-error {
    :log warning ("Couldn't update whitelist");
}
/file remove $tmpFilename;
:log warning ("---------------END BLACKLIST UPDATE-------------");
У меня этот скрипт запускается каждую ночь автоматически, проверяет список, вносит коррективы, если надо.
[Профиль]  [ЛС] 

anal_sadist

Стаж: 7 лет 5 месяцев

Сообщений: 4


anal_sadist · 28-Дек-16 23:31 (спустя 20 дней, ред. 28-Дек-16 23:31)

[Цитировать] 

Ошибка в твоем скрипте.
28 строка, ты проверяешь на пустоту переменную, которая не объявлена ренее. Исправил:
Код:
if ($array_list[$i] != "") echo "add address=" . $array_list[$i] . " list=list_roscomnadzor" . "\n";
[Профиль]  [ЛС] 

Basterd

Стаж: 9 лет 5 месяцев

Сообщений: 26


Basterd · 30-Дек-16 09:49 (спустя 1 день 10 часов)

[Цитировать] 

если есть ВПН, который заявлен одним из условий, то зачем весь остальной гемморой?
[Профиль]  [ЛС] 

kx77

Стаж: 4 года 6 месяцев

Сообщений: 147


kx77 · 30-Дек-16 11:20 (спустя 1 час 31 мин.)

[Цитировать] 

Basterd писал(а):
72131441если есть ВПН, который заявлен одним из условий, то зачем весь остальной гемморой?
Чтобы не гнать весь траф через него.
ВПН значительно снижает скорость.
Если это openvpn, то максимум роутер может выжать - 10 мбит
[Профиль]  [ЛС] 

kobraru

Стаж: 10 лет

Сообщений: 1


kobraru · 27-Фев-17 15:41 (спустя 1 месяц 28 дней)

[Цитировать] 

Не знаю насколько актуально еще...
Можно обойтись без внешнего ресурса
просто создать правило-фильтр который будет сам создавать список list_roscomnadzor
Надо простой скопировать часть адреса с сайта заглушки провайдера в поле content и в in-interface поменять имя на ваш интерфейс.
для примера указан url моего провайдера билайн "Location: http://blackhole.beeline.ru/\?"
Код:
/ip firewall filter add action=add-src-to-address-list address-list=list_roscomnadzor address-list-timeout=3d chain=forward comment="list_roscomnadzor" content="Location: http://blackhole.beeline.ru/\?" in-interface=|имя инет интерфейса|"" protocol=tcp src-port=80
после захода на заблокированный сайт его IP автоматом добавится в list_roscomnadzor на 3 дня (время хранения можно выставить любое)
после повторного захода на тоn же сайт трафик пойдет уже через VPN
[Профиль]  [ЛС] 

jura777-inf

Стаж: 10 лет 6 месяцев

Сообщений: 25

jura777-inf · 28-Фев-17 02:40 (спустя 10 часов)

[Цитировать] 

kobraru писал(а):
72578704Не знаю насколько актуально еще...
Можно обойтись без внешнего ресурса
просто создать правило-фильтр который будет сам создавать список list_roscomnadzor
Надо простой скопировать часть адреса с сайта заглушки провайдера в поле content и в in-interface поменять имя на ваш интерфейс.
для примера указан url моего провайдера билайн "Location: http://blackhole.beeline.ru/\?"
Код:
/ip firewall filter add action=add-src-to-address-list address-list=list_roscomnadzor address-list-timeout=3d chain=forward comment="list_roscomnadzor" content="Location: http://blackhole.beeline.ru/\?" in-interface=|имя инет интерфейса|"" protocol=tcp src-port=80
после захода на заблокированный сайт его IP автоматом добавится в list_roscomnadzor на 3 дня (время хранения можно выставить любое)
после повторного захода на тоn же сайт трафик пойдет уже через VPN
Очень неудобно и не сработает, так как например у меня сейчас вообще никакая табличка не вылазит а просто сайт не открывается у кого то своя табличка. Так что способ крайне не работоспособный и не универсален.
[Профиль]  [ЛС] 

namelessoneru

Стаж: 6 лет 1 месяц

Сообщений: 2


namelessoneru · 05-Май-17 11:49 (спустя 2 месяца 5 дней)

[Цитировать] 

Как комментарий пользователя. Не сделана проверка на выбытие из списка. Например, разрешил Роскомнадзор rutracker (ну давайте помечтаем), а куча ссылок осталась в списке. И рутер упорно будет продолжать заходить через впн
[Профиль]  [ЛС] 

Санлайт

Top User 25

Стаж: 9 лет 1 месяц

Сообщений: 26

Санлайт · 05-Июн-17 00:46 (спустя 30 дней)

[Цитировать] 

vangrieg
У вас есть возможность переделать скрипт таким образом, чтобы в микротик добавлялись все забаненные IP из списка https://api.antizapret.info/group.php, а не только хостов указанных в файле? Просто этот скрипт не актуален уже, в микротике можно добавлять в адрес листы по DNS, он сам отрезолвит ипы. А вот иметь решение не требующее PHP на удаленном сервере - удобно.
[Профиль]  [ЛС] 

vangrieg

Стаж: 1 год 10 месяцев

Сообщений: 2


vangrieg · 18-Июн-17 06:32 (спустя 13 дней, ред. 18-Июн-17 06:32)

[Цитировать] 

Санлайт
В моем варианте не требуется PHP на удаленном сервере, все делает сам микротик.
Все IP из списка добавлять смысла нет, их слишком много, роутер умрет это все обрабатывать.
Что касается актуальности - да, сейчас можно вводить домены, но не со всеми сайтами это поможет. У некоторых (linkedin, facebook) надо знать все домены, включая CDN. Их, конечно, можно найти и вводить вручную, но скриптом это делается автоматически.
[Профиль]  [ЛС] 

Санлайт

Top User 25

Стаж: 9 лет 1 месяц

Сообщений: 26

Санлайт · 25-Июн-17 01:28 (спустя 6 дней)

[Цитировать] 

vangrieg писал(а):
73314646Санлайт
В моем варианте не требуется PHP на удаленном сервере, все делает сам микротик.
Все IP из списка добавлять смысла нет, их слишком много, роутер умрет это все обрабатывать.
Что касается актуальности - да, сейчас можно вводить домены, но не со всеми сайтами это поможет. У некоторых (linkedin, facebook) надо знать все домены, включая CDN. Их, конечно, можно найти и вводить вручную, но скриптом это делается автоматически.
То что в вашем случае все делает микротик - это и есть плюс, такое и нужно - без внешних скриптов, но для всех доменов из реестра. А не только избранных. Избранные можно обойти просто добавив запись в виде /ip firewall address-list add address=rutracker.org list=antizapret
Смотря какой роутер умрет, у меня например CCR, я думаю он справится, да и на более мелких роутерах должно быть адекватно все.
[Профиль]  [ЛС] 
 
Ответить
Loading...
Error