HotSpot в Mikrotik, или как заработать $: Часть 2

в 11:37, , рубрики: $, hotspot, javascript, mikrotik, perl, контент, реклама, Сетевое оборудование, фильтр, метки: , , , , , ,

Общие сведения

Это вторая часть статьи, иллюстрирующие возможности использования OS Mikrotik, в качестве HotSpot точки. В первой части я рассказывал как настроить HotSpot, а так же познакомил с возможностью выдачи и покупки карт доступа. Ознакомиться с первой частью вы можете здесь.

Задачи и цели

Наша основная цель состоит в том что бы, на своем HotSpot'е научиться внедрять рекламу, на все сайты которые посещает пользователь.

Строить, строить, мастерить: Mikrotik

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

/ip firewall nat
add action=dst-nat chain=hs-auth comment="hotspot redirect to proxy" 
disabled=no dst-port=80 in-interface=!e2_v454 protocol=tcp to-addresses=
XX.XX.XX.XX to-ports=3120 place-before=0

где XX.XX.XX.XX — ip адрес вспомогательного сервера,
3120 — порт прокси.

Это правило перенаправляет весь трафик на вспомогательный прокси сервер, который его будет анализировать и модернизировать под наши нужды.

Строить, строить, мастерить: Вспомогательный сервер

Я использую в качестве вспомогательно сервера Centos 5.4. Добавляем следующие правило в iptables:

#proxy
-A VZ_INPUT -p tcp -m tcp --dport 3120 -j ACCEPT

Я использую не стандартные название таблиц фильтра, если хотите изменить их как у меня, сделаете следующие изменения в файле /etc/sysconfig/iptables:

:OUTPUT DROP [0:0]
:VZ_FORWARD - [0:0]
:VZ_INPUT - [0:0]
:VZ_OUTPUT - [0:0]
-A INPUT -j VZ_INPUT.
-A FORWARD -j VZ_FORWARD.
-A OUTPUT -j VZ_OUTPUT.

Для проксирования трафика, я использую Privoxy, он довольно быстро обрабатывает большое количество соединений.
В начале моих опытов я использовал perl и библиотеку HTTP::Proxy, однако работает она крайне медленно и вообще не очень стабильно, зачем она написано, для меня так и осталось загадкой.

#создаем папки
mkdir /usr/local/proxy
mkdir /usr/local/proxy/privoxy
cd /usr/local/proxy/privoxy
#загружаем
wget http://downloads.sourceforge.net/project/ijbswa/Sources/3.0.21%20%28stable%29/privoxy-3.0.21-stable-src.tar.gz
#распаковываем и собираем
tar xvf privoxy-3.0.21-stable-src.tar.gz
cd privoxy-3.0.21-stable
make
#создаем папку bin для переноса только нужных файлов
mkdir /usr/local/proxy/privoxy/bin/

И так копируем только следующие файлы:

templates
config
logfile
match-all.action
privoxy
run.sh
user.action
user.filter

В папке templates, рекомендую расположить следующие файлы:

blocked
cgi-error-404
cgi-error-bad-param
cgi-error-disabled
cgi-error-file
cgi-error-file-read-only
cgi-error-modified
cgi-error-parse
connect-failed
connection-timeout
forwarding-failed
no-server-data
no-such-domain

А так же изменить содержимое каждого из них на очень простое(по умолчанию Privoxy выдает кучу лишней информации клиенту), например файл blocked, будет выглядеть следующим образом:

<html><head>
<title>This Page is Blocked</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL @protocol@@hostport@@path@ was blocked on this server.</p>
</body></html>

Теперь файл запуска — run.sh:

#!/bin/sh

killall -9 privoxy
./privoxy

Добавляем временно его в автозагрузку(так как для постоянного запуска лучше использовать команду service), а именно строчку
/usr/local/proxy/privoxy/bin/run.sh
в файл /etc/rc.d/rc.local

Настройка: Privoxy

В этом разделе я приведу пример конфигурационных файлов с комментариями.

config:

confdir .
logdir .
actionsfile user.action      # пользовательский конфиг действий
filterfile user.filter      # пользовательский конфиг фильтра
logfile logfile #лог файл
listen-address  XX.XX.XX.XX:3120 #прослушиваемый адрес и порт
accept-intercepted-requests 1 #важная строчка без неё прокси не будет обрабатывать перенаправленные запросы
#остальные настройки я оставил как есть, они были в конфигурации по умолчанию
toggle  1
enable-remote-toggle  0
enable-remote-http-toggle  0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
forwarded-connect-retries  0
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 5
socket-timeout 300
debug 12289

А теперь файл user.action:

{+filter{inc_jsc} +filter{main_div_gl}}
# Применяет фильтры inc_jsc и main_div_gl ко всем адресам
/

{-filter{open-link-in-self-frame} -filter{main_div_gl}}
# Блокирует применение фильтров для след. адресов(зачем добавлять рекламу google в сам google)
.ad.doubleclick.net
.ads.r.us/banners/
.google
.googles.
.googles
.googleads.
.doubleclick.
.gstat.

Собственно самый главный файл user.filter:

FILTER: inc_jsc
#добавляет в тег head два js файла, один стандартный jquery, а второй наш специальный
s@<head>@$&<script type="text/javascript" src="http://lk.blablabla.ru/js/jquery.min.js"></script><script type="text/javascript" src="http://lk.blablabla.ru/jscript"></script>@sigx

FILTER: main_div_gl Add bottom baner
s@</body(s+w+(s*=s*(w+|'[^']*'|"[^"]*"))?)*s*>@<div align="center" id="div_m_gl" style="display: none;">n<script type="text/javascript">n <!-- n google_ad_client = "ca-pub-YYYYYYYYYYYYYYYYYYY";n google_ad_slot = "MMMMMMMMMM"; n google_ad_width = 728; n google_ad_height = 15; n //--> n </script> n <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></div>$&@sigx

А теперь вашему вниманию покажу файл lk.blablabla.ru/jscript, он проверяет на стороне клиента адреса, а так же контент и в зависимости от этого может включать или не включать рекламу, более этого этот файл динамический, а соответственно, можно глобально выключить показ рекламы(изменять список запрещенных к показу рекламы сайтов, сортировка клиентов, например тех кто пользуется платным доступом и т. д.) не останавливая прокси сервер:

$(document).ready(function() {
   

var view = 1;
var arr_links = ['blabla.ru', 'bla.ru',
'file']

//проверяем по списку, мало ли, может сайт запрещенный
var a = document.URL;
for (var i in arr_links) {
    var re = new RegExp(arr_links[i], 'i');
    if (a.match(re)) {
    	view = 0;
    }
    
}
//включаем рекламу, если всё в порядке
if (view) {            
	var state = 'block';
	var layer_ref = 'div_m_gl';
	if (document.all) { //IS IE 4 or 5 (or 6 beta)
		eval( "document.all." + layer_ref + ".style.display = state");
	}
	if (document.layers) { //IS NETSCAPE 4 or below
		document.layers[layer_ref].display = state;
	}
	if (document.getElementById &&!document.all) {
		hza = document.getElementById(layer_ref);
		hza.style.display = state;
	} 
}
            
});

Заключение

В этой статье я хотел показать как можно заработать $, на своем HotSpot предоставляя доступ в сеть интернет на бесплатно основе с ненавязчивой рекламой, самого различного характера. А так же прилагаю список материалов, откуда я черпал знания для реализации проекта.

HotSpot в Mikrotik, или как заработать $: Часть 1
HTTP::Proxy — модуль для создания proxy средствами Perl
Privoxy Official manual
Mikrotik Customizing Hotspot — создание своего HotSpot на Mikrotik
Mikrotik IP Firewall Nat

Privoxy RegExp — Хорошая статья на русском
Centos Iptables Official manual

P.S>Очень жду комментариев, буду рад ответить на вопросы.

Автор: somegreed

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js