вторник, 18 мая 2010 г.

Раздать интернет в локальную сеть + статистика интернета

Имеем:
Роутер -> Ubuntu server -> свич -> локльная сеть

Интернет настроен в роутере(ip адресс роутера - 192.168.2.1), сетевые настрйоки следующие:
auto lo eth1 eth0 eth0:1
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
addres 192.168.0.1
netmask 255.255.255.0

allow-hotplug eth0:1
iface eth0:1 inet static
addres 192.168.1.2
netmask 255.255.255.0

iface eth1 inet static
addres 192.168.2.3
netmask 255.255.255.0
Перезагружаю сеть
/etc/init.d/networking restart
Интернет есть, можно раздавать
Настройка NAT
Раздавать инетрент буду только определенным ip адресам (аналогично и по mac адресам)
создаю скрипт internet


#!/bin/sh
iptables -I FORWARD 1 -s 192.168.0.2 -j ACCEPT
iptables -I FORWARD 1 -d 192.168.0.2 -j ACCEPT
iptables -I FORWARD 1 -s 192.168.0.3 -j ACCEPT
iptables -I FORWARD 1 -d 192.168.0.3 -j ACCEPT
iptables -I FORWARD 1 -s 192.168.0.4 -j ACCEPT
iptables -I FORWARD 1 -d 192.168.0.4 -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i eth -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -o eth0 -p tcp -j DROP
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Для закрытия определенных портов для определенных ip добовляю в скрипт internet:
iptables -I FORWARD -p tcp -i eth0 -s 192.168.0.2 -m multiport --dport 80,433 -j DROP
В конце скрипта нужно добавить следующую строчку, разрешающую форвардинг
echo 1 > /proc/sys/net/ipv4/ip_forward

Копирую этот скрипт в /etc/init.d/, даю права на исполнение, все интернет расшарен.

Для сбора статистики используемого трафика пишу скрипт stat, который будет сохранять статистику за день в директорию веб сервера:
#!/bin/sh
/sbin/iptables -L -vnx | /usr/bin/awk '$9 ~ /192.168/ {print $2/1024 "\t" $9}' > /var/www/statlog/`date +%d.%m.%Y`.log
этот скрипт запускаю из крона каждые 15 минут

sudo crontab -e
*/15 * * * * /home/username/scripts/stat

Теперь каждые 15 минут статистика будет обновлятся, а для того чтобы каждый день была новая статистика, а не накопленная за все время работы, опять же по крону обнуляю статистику в 23:59

sudo crontab -e
59 23 * * * /sbin/iptables -Z

Для удобного просмотра статистики пишу php скрипт stat.php

<?php
header("Content-Type: text/html; charset=utf-8");
?>
<form name="dates" method=get>
<select name=mesac value="Месяц">
<option value="01"> Январь,
<option value="02"> Февраль,
<option value="03"> Март‚
<option value="04"> Апрель
<option value="05"> Май
<option value="06"> Июнь
<option value="07"> Июль
<option value="08"> Август
<option value="09"> Сентябрь
<option value="10"> Октябрь
<option value="11"> Ноябрь
<option value="12"> Декабрь
</select>

<select name=den value="День">
<option value="01"> 1
<option value="02"> 2
<option value="03"> 3
<option value="04"> 4
<option value="05"> 5
<option value="06"> 6
<option value="07"> 7
<option value="08"> 8
<option value="09"> 9
<option value="10"> 10
<option value="11"> 11
<option value="12"> 12
<option value="13"> 13
<option value="14"> 14
<option value="15"> 15
<option value="16"> 16
<option value="17"> 17
<option value="18"> 18
<option value="19"> 19
<option value="20"> 20
<option value="21"> 21
<option value="22"> 22
<option value="23"> 23
<option value="24"> 24
<option value="25"> 25
<option value="26"> 26
<option value="27"> 27
<option value="28"> 28
<option value="29"> 29
<option value="30"> 30
<option value="31"> 31
</select>

<select name=god value="Год">
<option value="2010"> 2010
</select>
<input type="submit" value="Смотреть">
</form>

<?php
$ddat = date("d.m.Y");
if(!isset($_GET["den"])) { $filename = "stat".$ddat.".log"; $nowdate = $ddat;}
else {$filename = "stat".$_GET["den"].".".$_GET["mesac"].".".$_GET["god"].".log"; $nowdate = $_GET["den"].".".$_GET["mesac"].".".$_GET["god"];}


$file = fopen("/var/www/statlog/$filename","r");
print "<table width=300 border=1 bgcolor=#e0e0e0><caution><i>Статистика Траффика Р·Р° $nowdate</i></caution><tr><th>РљР±</th><th>Ip</th><th>Р˜РјСЏ</th></tr>";
while(!feof($file)) {
$ff[] = explode("\t", fgets($file));
}

$ipname = Array(
"192.168.0.2" => "User1",
"192.168.0.3" => "User2",
"192.168.0.4" => "User3",
);

$sum =0;
for($i=0; $i<count($ff)-1; $i++)
{
$str=strval($ff[$i][1]);
$sum += $ff[$i][0];
if($ff[$i][0] >= 100000 && $ff[$i][0] < 200000) {$color = "red";}
elseif($ff[$i][0] >=50000 && $ff[$i][0] < 100000) {$color = "orange";}
elseif($ff[$i][0] >=10000 && $ff[$i][0] < 50000) {$color = "yellow";}
elseif($ff[$i][0] >= 200000) {$color = "#cb0000";}
else {$color="green";}
print "<tr><td><font color=$color>".$ff[$i][0]."</font></td><td>".$ff[$i][1]."</td><td>".$ipname[trim($ff[$i][1])]."</td></tr>\n";
}
print "</table>";
print "Всего: ".$sum." Кб";
?>

Теперь по адресу http://localhost/stat.php доступна статистика использования трафика каждым юзером

6 комментариев:

evilzipik комментирует...

а как сделать чтобы больше 3 ip адресов было и общую статистику?

Alexey Kostryukov комментирует...

по аналогии, дописать ip адреса =)

Alexey Kostryukov комментирует...
Этот комментарий был удален автором.
Alexey Kostryukov комментирует...

а общую статистику описал в следующих статьях
http://dog-simpson.blogspot.com/2010/05/iptables.html
и
http://dog-simpson.blogspot.com/2010/05/iptables_26.html

Анонимный комментирует...

А есть идеи по следующим вопросам?
1) Можно каким нибудь путём, блокировать трафик по url? (или просто блокировать ip)
2) Как можно дополнить статистику , кто на какой url ходил?

Alexey Kostryukov комментирует...

неа, врятли, сквид если только