Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Шлюз в Инет  (Прочитано 604 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cods

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Шлюз в Инет
« : 01 Январь 2014, 16:54:18 »
Доброго времени суток. Не давно возникла необходимость создать шлюз в интернет для пару тройку компов плюс мобилы по 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) у меня каждые пять минут данные перебрасывает со счетчика ип таблес в базу.
Не судите строго...
« Последнее редактирование: 01 Январь 2014, 17:52:37 от cods »

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13750
    • Просмотр профиля
Re: Шлюз в Инет
« Ответ #1 : 01 Январь 2014, 18:09:52 »
Я вопроса не увидел. Или эта тема ради похвалы?
Тогда только ругательство за орфографию (но этот так, второстепенно).
Но самый большой минус за то, что не описано как всё это сделано.
Принимаю благодарности в WMR и WMZ на кошельки:
R158160676909 и Z313280060764

Оффлайн cods

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Шлюз в Инет
« Ответ #2 : 01 Январь 2014, 18:24:35 »
Я вопроса не увидел. Или эта тема ради похвалы?
Тогда только ругательство за орфографию (но этот так, второстепенно).
Но самый большой минус за то, что не описано как всё это сделано.
Это форум вопросов. Я поделился одним из способов реализации задачи, которая частенько появляется в виде вопросов. Всё это сделано руками, в чем писал... NANO.

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 27615
    • Просмотр профиля
Re: Шлюз в Инет
« Ответ #3 : 01 Январь 2014, 18:27:06 »
Уже есть тема ICS в Ubuntu, прилепленная.
Чем ваш ужас принципиально отличается?
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн fisher74

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 13750
    • Просмотр профиля
Re: Шлюз в Инет
« Ответ #4 : 01 Январь 2014, 20:04:22 »
Я поделился одним из способов реализации задачи,
Я писал до того, как Вы обновили первый пост. По крайней мере, когда я писал листингов ещё не было.
Теперь вижу, что это попытка сделать хавтушку.
По реализации и её описанию, конечно, замечаний очень много.
AnrDaemon, здесь главное отличие от указанной Вами темы - биллинг.

ТС: приводите мысли и первый пост в порядок и будет претендовать на попадание в библиотеку (не я решаю). Конечно же, одним из важных моментов - это придерживаться Ubuntu way
Принимаю благодарности в WMR и WMZ на кошельки:
R158160676909 и Z313280060764

Оффлайн koshev

  • Старожил
  • *
  • Сообщений: 1708
  • חתול המדען
    • Просмотр профиля
Re: Шлюз в Инет
« Ответ #5 : 01 Январь 2014, 21:21:51 »
Отлично-отлично.
А можно ведь без временного файла? Perl позволяет читать из stdin. Всё равно в cron'е болтается.
Ну на вроде такого:
Код: (bash) [Выделить]
iptables -nvxL FORWARD | awk '{print $1" "$2" "$8" "$9}' |grep ^[0-9] | ./traf.pl
Код: (perl) [Выделить]
#!/usr/bin/perl
while (my $row = <STDIN>) {
@data = split (/ /,$row);
print @data[0];
print @data[1];
print @data[2];
print @data[3];
}
OpenWrt 19.07

Оффлайн cods

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Шлюз в Инет
« Ответ #6 : 01 Январь 2014, 23:58:31 »
Отлично-отлично.
А можно ведь без временного файла? Perl позволяет читать из stdin. Всё равно в cron'е болтается.
Ну на вроде такого:
Код: (bash) [Выделить]
iptables -nvxL FORWARD | awk '{print $1" "$2" "$8" "$9}' |grep ^[0-9] | ./traf.pl
Код: (perl) [Выделить]
#!/usr/bin/perl
while (my $row = <STDIN>) {
@data = split (/ /,$row);
print @data[0];
print @data[1];
print @data[2];
print @data[3];
}

Теперь знаю, спасибо. В принципе можно не напрягаясь написать управление шлюзом по www. Чего я и сделал.

 

Страница сгенерирована за 0.073 секунд. Запросов: 24.