Общие сведения
Это вторая часть статьи, иллюстрирующие возможности использования 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>Очень жду комментариев, буду рад ответить на вопросы.