Доброго времени суток. Не давно возникла необходимость создать шлюз в интернет для пару тройку компов плюс мобилы по WI FI. Почитав пару статеек про Ubuntu решил на ней строить роут. Шлюз должен отвечать за раздачу инета, подсчёт траффика и собственно его ограничение по скорости избранным клиентам (програмам). Каждый юзер может смотреть расход траффика на www шлюза, при его привышении БАН автоматом. И всё енто реализовать ручками (не прибегая к сторонним производителям). Посидев пару вечеров задача была реализованна. Сам две недели как на LUBUNTU пересел после винды, делал всё это хозяйство немного коряво но всё работает.
Собственно процесс. Машинка такая Атлон хп 1200 512 озу 80 винт. Сеть такая: точка тп-линк с режимом коннекта к другой точке. К ней подключены клиенты по шнуркам 4 и по воздуху 10. Она (тп линк) по воздуху соединена с роутером в Инет (4г МТС). Все пакеты от клиентов летят на маршрутизатор с лубунтой с него через туже точку на роут с Инетом. Ип адреса во выдает точка. И так роут LUbuntu имеет два сетевых интерфейса один вифи. Точка дхцп дает клиента адреса сети 192.168.0.ХХХ, шлюз по умолчанию 192.168.0.100 (лUbuntu), днс даем гугловские 8.8.8.8 4.4.4.4.
Для начала iptables:
Пишу скрипт firewall.sh
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
#Интерфейс наружу по вифи делаею так что бы считать траффик самого шлюза
iptables -A INPUT -i wlan0 -j ACCEPT
iptables -A OUTPUT -o wlan0 -j ACCEPT
#Пускаем клиента и подсчет вх и исх трафа
iptables -A FORWARD -s 192.168.0.102 -j ACCEPT
iptables -A FORWARD -d 192.168.0.102 -j ACCEPT
делаем его исполнимым и пихаем вызов его при старте в /etc/rc.local
wlan0 имеет ип 192.168.1.200 (статично)
шлюз 192.168.1.1
днс 8.8.8.8 4.4.4.4
ставлю php MySQL Appache phpMyAdmin
в MySQL делаю базу BIL в ней простую табличку TRAF поля id, dat, ip_in, ip_out, byt
пишу скрипт пёрл (файл traf.pl)
#!/usr/bin/perl
use DBI;
use Time::localtime;
# Выкидываем данные iptables в файл
system ("sudo iptables -L -vnx > /etc/tab/iptables");
# Отредактируем его
system ("sudo sed -i 's/ / /g' /etc/tab/iptables");
system ("sudo sed -i 's/ / /g' /etc/tab/iptables");
system ("sudo sed -i 's/ / /g' /etc/tab/iptables");
my $host = "localhost"; # MySQL-сервер
my $port = "3306"; # порт, на который открываем соединение
my $user = "root"; # имя пользователя
my $pass = "пароль"; # пароль
my $db = 'bil'; # имя базы данных
#Коннект к базе
$dbh = DBI->connect("DBI:mysql:$db:$host:$port",$user,$pass);
#откроем файл дампа ип таблес
my $filename = '/etc/tab/iptables';
open(my $fh, $filename)
or die "Could not open file '$filename' $!";
while (my $row = <$fh>) {
#Читаем файл по строкам выковыривая данные разделённые пробелами
@fields = split (/ /,$row);
$sth = $dbh->prepare("INSERT INTO `traf`(`dat`, `ip_in`, `ip_out`, `byt`) VALUES (now(),'@fields[9]','@fields[8]','@fields[2]')");
if (@fields[2] ne '(policy' && @fields[2] ne 'bytes' && @fields[2] ne '0' && @fields[7] ne ''){$sth->execute;}
}
system ("sudo iptables -Z");
$rc = $sth->finish; # закрываем
$rc = $dbh->disconnect; # соединение
close($fh);
сохраняем файл, делаем его исполнимым и пихаем его в cron (crontab -e)(/5 * * * * /etc/tab/traf.pl) у меня каждые пять минут данные перебрасывает со счетчика ип таблес в базу.
Не судите строго...