Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Подсчёт трафика в Linux  (Прочитано 55249 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« : 12-01-2010 16:17 » 

  Я хочу написать собственную биллинговую систему для Linux шлюза. Поскольку на C++ я не пишу, а пишу на FreeBasic... Есть ли у кого нить из вас модуль который бы перехватывал заголовки IP пакетов и транслировал бы клиенту на TCP порт или локльный сокет.
  Примерно в таком формате: "Куда, откуда, размер пакета"
  То что будет накодено выложу в сеть под лицензией GNU.

Жду советов и консультаций.
Записан

Всё настолько сложно что непостижимо просто.
Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #1 : 12-01-2010 17:45 » 

Вот и выложи, что уже "накодил".
Записан

Слово не воробей. Всё не воробей, кроме воробья.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-01-2010 18:59 » 

Библиотека libpcap. Для винды ее порт - winpcap.

Стоит ли создавать велосипед? Подобные системы давно существуют. Лет 10-11 назад я наблюдал, как один из подобных проектов только вышел в релиз. За такой период не могли не доделать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-01-2010 19:33 » 

Rezedent12, это приглашение к сотрудничеству в проекте открытого ПО или просто частный вопрос по сетям: как реализовать перехват трафика с целью его контроля?

Во втором случае я перемещу тему в раздел "Сети", где её быстрее заметят разбирающиеся в этом люди.

RXL, может он для себя хочет, чтобы разобраться, отработать свои навыки программирования.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 13-01-2010 09:51 » 

Это приглашение к сотрудничеству с целью создания свободного ПО. Проект некомерческий, но нужно мне это для полукоммерчиских целей. А ещё и попрактиковатся в программировании. В общем, преследую кучу целей.

Чтоб было понятно, что я хочу именно реализовать. Приведу рисунок: http://imageshost.ru/links/3af1ceac810c9d351a69897af2e83acb

ПО, которое я хочу разработать, нужно для шлюзов.

Планируется, что со временем в такой сети будет около 50 хостов. ПрименятЬся будут не только беспроводные каналы.
« Последнее редактирование: 13-01-2010 12:48 от Sel » Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-01-2010 13:55 » 

Прежде, чем запрашивать модуль, хорошо бы чётко определить требования к нему.

Вот у тебя написано, что каждый пользователь авторизуется, чтобы получить трафик. На уровне протокола IP нет никаких пользователей, есть только адреса точек подключений. Если мне правильно показалось, модуль перехвата трафика в конечном счёте должен быть полезен именно для контроля трафика в разрезе пользователей. Поэтому прежде, чем браться за перехват трафика и определять требования к этому модулю, нужно дать чёткий ответ, каким боком этот модуль увязывается с требованиями верхнего уровня, в которых говорится про пользователей.

Иначе может так получиться, что ты, провозившись с какой-то библиотекой, даже получишь перехват пакетов, а потом обнаружишь, что она не позволяет добиться того, что тебе на самом деле нужно. Архитектура решения первична, модули и библиотеки вторичны.
« Последнее редактирование: 13-01-2010 13:56 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 13-01-2010 15:05 » 

Модуль простой. Запускается с правами root,  открывает сокет и отправляет на него данные о пакетах (кому, куда, размер), к нему подключается прога учёта трафика. Авторизация проходит через Https протокол, после авторизации программа привязывает IP к счёту пользователя и за каждый прошедший пакет вычитает значение лимита. Как только лимит исчерпан, то программа при помощи IpTables комманды перекрывает траффик в инет.
Программа учёта трафика - это моя забота, накодить её максимум месяц работы. Но чтоб приступить к разработке, надо найти такой модуль.
« Последнее редактирование: 15-01-2010 11:37 от Sel » Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 13-01-2010 17:55 » 

Что значит "отправляет"? О каждом пакете отправляется пакет? Или статистика как-то аккумулируется и имеет периодичность? Если каждый пакет, то производительность не смущает? А линия часом не гигабитная?

Что значит отправляет в сокет, к которому подключается прога? А если прога не подключается, куда он что отправляет?

P.S. Требования, вообще говоря, хорошо бы делать полными, освещая все аспекты работы: функции, производительность, ресурсоёмкость, безопасность, расширяемость/перспективы развития, особенности сред исполнения и разработки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-01-2010 19:29 » 

Тогда всё по порядку.

   Про требуемый модуль: Я пока не определился, как именно должен работать модуль, поэтому ещё и не написал ничего. Это зависит от того, как модуль будет реализован. В сокет программе отправляется информация о заголовках. Программа запускается на том же шлюзе (Обмен в пределах LocalHost) Если программа к нему не подключается, то и отправлять не надо.
   После подключения к модулю, он должен начать отправку информации о пакетах. Думаю, что 12 байт о каждом пакете - это не много |Откуда IP||Куда IP||Размер| переменные типа Long удобны для 32 разрядных процессоров.
   
Собственно о программе:
   По умолчанию в IpTables трафик закрыт для всех IP с внутренней сети. Клиент через http или https или Telnet или можно специальные программы для авторизации зашифрованным ключём сделать. В общем, соединяется с программой. Программа узнаёт клиента и его IP. В зависимости от состояния его счёта, разрешает или запрещает трафик с его IP во внешнею сеть. И определяет переменную лимита.
   О переменной лимита. В ней содержится максимальное количество байт, которые могут быть получены и переданы для данного IP , как только лимит исчерпывается, то канал закрывается при помощи всё той же многострадальной IpTables.
   При отсоединении пользователя: Не пингуется его IP, истёк лимит, сам закрыл соединение. Израсходованное округляется до мегабайта или 100 килобайт. Также во избежание финансовых убытков через каждый мегабайт списывается бабло. Также во избежание глюков с IP и авторизацией (DHCP работает сам по себе) можно использовать не IP адреса для привязки пользователя, а MAC адреса.

Для тех, кто, возможно, не совсем правильно понял: После авторизации программа знае,т какому пользователю принадлежит какой IP. А модулю это знать не надо, поскольку он только предоставляет данные о проходящих через шлюз пакетах.
« Последнее редактирование: 15-01-2010 11:40 от Sel » Записан

Всё настолько сложно что непостижимо просто.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #9 : 13-01-2010 21:25 » 

Цитата
Я пока не определился, как именно должен работать модуль, поэтому ещё и не написал ничего. Это зависит от того, как модуль будет реализован.

Прочти внимательно что написал, сам себе противоречишь.   

Цитата
По умолчанию в IpTables трафик закрыт для всех IP с внутренней сети.

Это утверждение или так будет настроено для работы твоего ПО?

Цитата
Клиент через http или https или Telnet или можно специальные проги для авторизации зашифрованным ключём сделать. В общем, соединяется с прогой. Прога узнаёт клиента и его IP. В зависимости от состояния его счёта, разрешает или запрещает трафик с его IP во внешнею сеть. И определяет переменную лимита.

О RADIUS слышал?

Цитата
канал закрывается при помощи всё той же многострадальной IpTables.

Причем тут вообще iptables если ты кругом используешь сокеты?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 14-01-2010 04:18 » 

Цитата: Rezedent12
Я пока не определился, как именно должен работать модуль, поэтому ещё и не написал ничего.
Ну вот я, собственно, и сподвигаю определиться Улыбаюсь

Цитата: Rezedent12
Прога запускается на том же шлюзе (Обмен в пределах LocalHost) Если прога к нему не подключается, то и отправлять не надо.
Кстати, о птичках. В общем случае на машине несколько сетевых интерфейсов. По каким правилам модуль определяет, какие из них слушать, а какие нет. Как должна обрабатываться ситуация опускания и поднятия соединения на интерфейсе (особенно актуально для всяких PPP, PPTP и т.п.) - многие демоны требуют перезагрузки после такого события.

Цитата: Rezedent12
|Откуда IP||Куда IP||Размер|
Из этого следует, что собственно маршрутизацией (т.е. определением, по каким тарифам учитывать трафик, движущийся в тех или иниых направлениях) будет заниматься подключенная программа.

Кстати, программа будет подключаться к модулю в единственном экземпляре, или, быть может, будет несколько экземпляров?

Цитата: Rezedent12
Так же во избежании глюков с IP и авторизацией (DHCP работает сам по себе) можно использовать не IP адреса для привязки пользователя, а MAC адреса.
Вот это серьёзнейшее дело, затрагивающее структуру передаваемых данных от демона к программе, т.е. межпрограммный интерфейс. Тут нужна определённость.

Цитата: McZim
Это утверждение или так будет настроено для работы твоего ПО?
Для разработки софтины это не важно - всегда можно прописать в требованиях к эксплуатации. Но при этом возникает побочный вопрос: как эта софтина, буде написана, в реальной жизни собирается уживаться вместе с другими претендентами порулить iptables - разными файрволами и т.п. вещами.

Цитата: McZim
О RADIUS слышал?
А это так принципиально?

Цитата: McZim
Причем тут вообще iptables если ты кругом используешь сокеты?
Сокеты только для мониторинга и внутренних коммуникаций программного комплекса, а управление трафиком через iptables. Перечитай внимательнее.
« Последнее редактирование: 14-01-2010 04:20 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 14-01-2010 06:25 » 

есть такая вещь DCCA - http://en.wikipedia.org/wiki/Diameter_Credit-Control_Application
это один из стандартных проколов взаимодействия.

небольшой сценарий взаимодействия систем с предоплатой трафика:
1. есть некая хрень которая умеет открывать и закрывать доступ или предоставлять доступ
2. другая хрень знает сколько денег/трафика или еще чего есть у абонента
3. это две совершенно разные вещи хотя и работают в тандеме (не путаем с аппаратной платформой HP NonStop)
4. клиент (абонент) обращается к софтине №1(не явно или явно): "Я такой-то такой-то, дай я подключусь к сети"
5. софтина №1: "погоди я проверю". далее выбрав одну из возможно нескольких софтин №2 обращается к ней: "Вот такой абонент, не твой случаем? Хочет проключиться на такой-то сервис, сколько ему можно предоставить ресурсов?"
6. софтина №2: "Абонент мой, проключай, трафик 100 мег (это не значит что у него денег на 100 мег, может их на 10000 мег, просто мы доверяем абону не более чем нужно, во избежание фрода), НО переспроси у меня остаток через 30 минут, вдруг он успеет свустить деньги на другие сервисы или тариф сменит"
7. софтина №1: "понятно, проключаю" далее она следит за расходом трафика и за 10% до исчерпания или через 29 минут (опять же во избежание фрода) переспросит у софтины №2 о доступных средствах.
8. не забываем про таймауты: в идеале запрос разрешения и получение доступа должен проходить за 0.1 секунды (на самом деле 1 секунда всех устроит)
9. также помним, что нужно вести базу абонентов, тарифов, логи списания средств, платежей и т.д. и т.п

Rezedent12, надеюсь желание реализовать эту хрень за месяц у тебя пропало.
Записан

Странно всё это....
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #12 : 14-01-2010 07:33 » 

Цитата
Для разработки софтины это не важно - всегда можно прописать в требованиях к эксплуатации. Но при этом возникает побочный вопрос: как эта софтина, буде написана, в реальной жизни собирается уживаться вместе с другими претендентами порулить iptables - разными файрволами и т.п. вещами.

Меня интересует ответ автора. Это утверждение или так нужно для него?

Цитата
А это так принципиально?

Ага, зачем очередной велосипед?

Цитата
Сокеты только для мониторинга и внутренних коммуникаций программного комплекса, а управление трафиком через iptables. Перечитай внимательнее.

Ну ради бога конечно, ИМХО, ничего нового, ничего интересного. Вот если интегрироваться в iptables и указав там правила подобные, по структуре, на iptables, управлять поведением этой прогой это более интересно.

Советую автору почитать о реализации Биллинг систем, хотя бы поверхностно.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 14-01-2010 07:39 » 

По хорошему, лучше использовать VPN (pppoe и т.п., базирующиеся на ppp, протоколы), чем такую экзотическую авторизацию. Пользователям удобнее будет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 14-01-2010 07:39 » 

McZim, он же написал
Цитата
А ещё и попрактиковатся в программировании. В общем, преследую кучу целей.

зы. у меня друзья на дипломный проект сделали веломобиль, со всеми чертежами, со всеми расчетами. или проще было содрать с какого-нибудь моделист-конструктора?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #15 : 14-01-2010 07:48 » 

Sla, если хочет попрактиковаться, то про деньги стоит забыть, а он хочет что-то откуда-то списывать, какие-то счета, средства, пусть и виртуальные пока. Нужно научиться управлять трафиком, авторизацией и много еще чем.

В общем автор много всего сразу захотел, это ни в коем случае не плохо, но начинать нужно с того, чтобы разбить проект на много секуций и прорабатывать каждую, о чем Dimka и говорит.
« Последнее редактирование: 15-01-2010 11:42 от Sel » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 14-01-2010 08:14 » 

Я чувствую, что капитально загружен....

Но чтоб было яснее... Модуль предоставляет программе информацию о проходящем трафике, программа рулит управляет трафиком при помощи IpTables (Да будь она проклята Улыбаюсь )

Всё... просто, как валенок. Алгоритмы программы и её концепт есть в уме, если хотите, то выложу общий алгоритм....
« Последнее редактирование: 15-01-2010 11:45 от Sel » Записан

Всё настолько сложно что непостижимо просто.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #17 : 14-01-2010 08:49 » 

Rezedent12, валенок не так просто как ты думаешь, что бы сделать хороший валенок, нужно постраться, да и потом даже у самого хорошего валенка есть минусы.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 14-01-2010 10:22 » 

Алгоритм:

Const X = лимит пользователей

Dim Users (1 to X) as string*10 'Логины пользователей
Dim Limit (1 to X) as long 'Лимит трафика
Dim IP (1 to X) as string*15 ' IP пользователя 123/567/9(10)(11)/(13)(14)(15)
Dim MAC (1 to X) as string ' MAC адреса сетевух (в Бета версии не используется)

Главная процедура()

 -Соеденится с модулем, если ошибка то запустить его и повторить
 -После соединения закрыть трафик ' На всякий случай мало ли, вдруг админ забыл по умолчанию закрыть
 -Call Подсчёт

Конец()

Это конечно лишь эскиз общего алгоритма с базовыми возможностями


Процедура Подсчёт()

-Бесконечный цикл.

 -Ждать пакета от модуля или сигнала завершения программы, если такой есть то выйти из цикла.
 -Выбрать из пакета IPfrom, IPto, SizeBytes
 'IPfrom - откуда
 'IPto - куда
 'SizeBytes - Размер пакета
 -Если пакет идёт во внешнею сеть то вычесть его размер из лимита.
 -Через каждый мегабайт обновлять сведенья о его счёте в текстовом файле или базе данных.
 -Если лимит исчерпан то закрыть трафик
 
-Конец бесконечного цикла Улыбаюсь

Конец()


Событие Авторизация клиента()
 'Клиент уже авторизовался с помощью Web интерфейса или специальной проги
 -Найти в массиве Users() Пустое значение A
 -По данным из тестового файла или бызы данных установить лимит(не хочу на этапе бета версии заморачиватся с SQL) пользователю(A)
 -Установить его IP адрес и Mac адрес
 -Если лимит положительный то разрешить трафик
 
Конец события()


Событие Отключение клиента()
' Событие наступет если клиент сам даёт команду на интерфейсе авторизации
' или истекает лимит или на указаном IP меняется MAC адрес (В бета версии по
' MAC проверку не реализовывать, другие проблеммы есть)

 -Закрыть доступ
 -Округлить трафик
 -Записать в базу или текстовый файл
 -Очистить в массивах поля клиента
 -Записать событие в *.LOG Улыбаюсь

Конец события()
Записан

Всё настолько сложно что непостижимо просто.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #19 : 14-01-2010 11:08 » 

Всё... просто как валенок.

раскажи это сотрудникам
Alcatel
или Huawei

для поделки просто
для нормального решения нет
Записан

Странно всё это....
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 14-01-2010 13:55 » 

И чем же это не нормальное решение? (Кроме авторизации по WEB)
Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 14-01-2010 22:05 » 

Слушайте, чего вы пристали к человеку и тыкаете его в разные уже имеющиеся решения? Не для вас пишет, для себя зачем-то. Преимущество того, чего он описал - простота и реализуемость малой кровью. В конце концов, ему надо - он в данном случае "заказчик" и имеет полное право сделать так, как хочет.

Наша помощь тут - лишь показать ограничения такого подхода к решению задачи. Вот плавно соберём полные требования - картина прояснится и у него самого. Тогда будет видно, сможет ли такое решение работать в конкретной сетевой конфигурации для конкретных 50-и компов (как заявлено автором), либо затея заранее обречена. А все эти декларации про GNU - будет одно из многочисленных решение "as is" - не нравится, не пользуйтесь, никто не заставляет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #22 : 15-01-2010 04:17 » 

Dimka, согласен.

по делу.
Пункт номер один: подсчёт трафика.
http://www.opennet.ru/base/net/ulog_traf.txt.html
http://www.linuxcenter.ru/lib/articles/networking/squid_sarg_traf.phtml
http://asplinux.net/node/3049
http://netams.com/
http://alldebian.ru/nat-podschet-trafika
и еще дофига всего по запросу: подсчёт трафика в поисковике.
+ аппаратные решения, но я так понимаю, не наш случай

Пункт 2: передача результатов в софтину.
тут нужно определиться с тем, какая латентность доставки информации о трафике тебя устроит
1 секунда, 5 секунд, минута
в одном случае тебе пойдёт модуль ядра передающий данные в user-space
в другом сойдёт и парсинг логов

Пункт 3: Управление iptables.
я бы поискал возможность управления в обход вызова iptables, например, через /proc или что-нибуть эдакое

Пункт 4: Идентификация.
в идеале сделать её не явной, т.е. при обнаружении пакета от нового пользователя производить идентификацию и выделение квоты,
но сойдёт и любой другой способ, я полагаю

Пункт 5: абонентские данные.
MySQL, но лучше иметь систему плагинов для работы с разными хранилищами (MySQL, Postgres, Oracle, DB2, plain text).
« Последнее редактирование: 15-01-2010 11:47 от Sel » Записан

Странно всё это....
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 15-01-2010 10:07 » 

Рад, что наконецо начали понимать, что я хочу достичь целей малой кровью. Dimka, вы наверное неправильно поняли, хостов в сети будет около 50 (посмотрите на рисунок http://imageshost.ru/links/3af1ceac810c9d351a69897af2e83acb ). А клиентов, подключаемых к одному хосту, никак не будет больше 20, хотя бы потому, что на практике 20 Мбит/с практическая скорость Wi-Fi. Сеть не только для Интернет, а ещё и для локального обмена.

Примечание: Парсинг логов на i486 не лучшее занятие. Я читал про эту технологию, некоторые провайдеры просто отправляют весь трафик в Log потоком и читают его оттуда. Такое решение в корне неприемлЕмо. Нужно всего лишь |Откуда||Куда||Размер| такой поток данных. Простите, что излишний раз повторяюсь.
« Последнее редактирование: 15-01-2010 11:35 от Sel » Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 15-01-2010 10:57 » 

Rezedent12, на свои вопросы, заданные в 10-м сообщении, я пока ответов не получил.

Появился новый вопрос, связанный с MAC: все хосты находятся в одном сегменте (т.е. нет никаких хостов, которые осуществляют выход через разные шлюзы (маршрутизаторы, NAT и т.п.)? Если это не так, то MAC-адреса нельзя будет использовать. Кроме того, MAC адреса используются во фреймах Ethernet, а IP-адреса - в пакетах одноимённого протокола. В общем случае соответствия между фреймами и пакетами нет. Ethernet трафик превышает по объёму IP трафик, так как передаёт IP пакеты в качестве данных внутри своих фреймов. По какому правилу будет устанавливаться соответствие Ethernet и IP трафика, чтобы адресацию брать у первого, а объём считать у второго?
« Последнее редактирование: 15-01-2010 11:03 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #25 : 15-01-2010 11:33 » 

Такое решение в корне не приемлимо. Нужно всего лишь |Откуда||Куда||Размер| такой поток данных.

а ты прочел, как работает ulog?  Я зол!
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 15-01-2010 15:04 » 

LogRus, спокойствие, только спокойствие Улыбаюсь Мы ещё даже требования не собрали Улыбаюсь Как соберём полные, тогда и будем всякими ulog'ами кидаться, если они удовлетворят Улыбаюсь

В данном случае автор попытался как-то примерно обозначить проблему производительности Улыбаюсь Плюс здесь в том, что проблему он видит, минус в том, как именно он её видит Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #27 : 15-01-2010 16:05 » 

Dimka, я спокоен. Я непоколебимая глыба.

premature optimization - корень всех зол
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 15-01-2010 16:42 » 

Я зол!

LogRus, спокойствие, только спокойствие

Offtopic:


Поставлю в угол.

Улыбаюсь
Записан

Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 15-01-2010 16:55 » 

Касаемо вопросов в 10м сообщении: На часть вопросов я ответы да, а касаемо остального ответ: Слышал, читал, непонравилось. По причинам сложности в настройке (я не Linux-гуру, а партнёры при помощи которых я буду расширять сеть возможно ничего кроме винды не знают).

Ulog - это патч к ядру.. Касаемо пересборки ядра я не мастер и никогда этим не занимался. Я конечно вас понимаю, вы ламерство не поощряете и я не считаю что я знаю всё что надо. Но изначальная цель сделать простое с точки зрения пользователя средство. Чтоб запустил файл и всё заработало.

Касаемо вопроса про MAC и IP. Прочитайте внимательнее алгоритм и рассмотрите схему. Пожалуйста. Авторизация происходит на хосте и только после этого пакеты попадают в кольцо интрасети или интернет. Систему роуминга между хостами можно будет написать позже. Никакой связи с хостом через хост... Таким образом проблема о которой вы говорите не существует. (Спасибо модератору за склейку сообщения)
Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 15-01-2010 19:38 » 

Цитата: Rezedent12
Прочитайте внимательнее алгоритм и рассмотрите схему. Пожалуйста.
Rezedent12, алгоритм у тебя, скажем аккуратно, вызывает вопросы - в нём есть логические ошибки. Но я пока алгоритмы не хочу рассматривать, поскольку их построение имеет смысл лишь после учёта всех существенных требований, которые пока не собраны. Здесь LogRus совершенно прав - предварительная оптимизация до добра не доводит.

По схеме, как я понимаю, есть несколько шлюзовых компьютеров под Linux, на которых и будет работать биллинговая система... Это одна общая система, или на каждом шлюзе отдельная система?

Из схемы следует, что ответ на мой вопрос про несколько сетевых интерфейсов положителен - их несколько (точнее 3 основных, остальные, включая localhost, можно игнорировать). Вопрос, каким образом модуль мониторинга трафика узнает, какие интерфейсы являются основными, за какими ему следить? Должно быть продумано решение этого вопроса (и от знания Linux этот вопрос никак не зависит - он платформонезависимый).

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

Вопрос о совместном использовании iptables между биллинговой системой и разными файрволами остался без ответа. (Опять же, тут не требуется знать iptables, тут требуется принять решение: либо эксплуатация требует отсутствия файрволов, либо нужно как-то обеспечить совместную работу. Лишь в последнем случае нужно вникать в тонкости работы с iptables и конкретных файрволов, например, shorewall.)

На вопрос о маршрутизаторах схема отвечает, что у каждого шлюза есть маршрутизатор. (Надпись "hub (концентратор) или маршрутизатор (router)" - это примерно как "трактор или прицеп": одно другому не мешает, но ни в коем случае не является альтернативой.) Причём именно маршрутизатор, так как перенаправляет трафик по разным направлениям (локальный - по кольцу, внешний - на шлюз). Это значит, что MAC адреса рабочих станций не могут быть использованы (маршрутизатор разбивает сеть на независимые сегменты на сетевом уровне), и шлюзы находятся в отделённых от рабочих станций сегментах.

Цитата: Rezedent12
Авторизация происходит на хосте и только после этого пакеты попадают в кольцо интрасети или интернет. Систему роуминга между хостами можно будет написать позже. Никакой связи с хостом через хост... Таким образом проблема о которой вы говорите не существует.
Маршрутизатор - это тоже хост (с точки зрения IP), так что транзит в схеме есть, и проблема существует, и в представленной схеме вместе с выявленным уровнем квалификации не решаема (аппаратный маршрутизатор (как специализированный компьютер) часто не рассчитан на то, что в него неквалифицированные пользователи будут встраивать какие-то самописные демоны).

Цитата: Rezedent12
Слышал, читал, непонравилось. По причинам сложности в настройке (я не Linux-гуру, а партнёры при помощи которых я буду расширять сеть возможно ничего кроме винды не знают).

Ulog - это патч к ядру.. Касаемо пересборки ядра я не мастер и никогда этим не занимался.

изначальная цель сделать простое с точки зрения пользователя средство. Чтоб запустил файл и всё заработало.
У профессионального программиста мозги работают немного иначе. Он очень много думает о том, чтобы всё работало во всех мыслимых и немыслимых ситуациях, потому что в жизни постоянно происходят какие-то изменения, и хорошо спроектированная программа в себе имеет решения для всех этих ситуаций. Это значит, что свыше 90% программы работает редко и очень редко, но это обеспечивает устойчивость: когда что-то случается, программа продолжает работать. Ценой этого является то, что программа имеет сложные и разнообразные настройки. Сложность настроек не всегда оправдана (многие программисты не очень-то заботятся об удобстве использования их творений, один sendmail чего стоит), но я сейчас объясняю, откуда эта сложность берётся. Плохо спроектированная программа не имеет никаких настроек и потому её нельзя приспособить для работы в изменившихся условиях - она просто не работает, её нужно выбросить и писать новую (в лучшем случае переписать имеющуюся).

Если ты вдумчиво прочитаешь мои вопросы, сконцентрируешься на мелочах, то тем самым заранее сможешь понять либо сложность твоей задачи, либо риски излишне упрощённого решения. Ты писал:
Цитата: Rezedent12
Я чувствую, что капитально загружен....
Действительно, удержать в голове все мелочи или пытаться сконцентрироваться на них одновременно невозможно. Тут нужны определённые навыки работы с информацией, её логического упорядочивания. Но об этом ты не беспокойся - рассматривай каждый частный вопрос отдельно от других, не надо метаться из стороны в сторону, а с обобщением тебе помогут.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 16-01-2010 12:40 » 

Алгоритм набросок.. знаю что его как и всё придётся отлаживать.
Предварительная оптимизация необходима на мой взгляд очень часто, хотя это и повышает сложность программирования, но зато и повышает надёжность и скорость.

На каждом шлюзе своя система. Порядок роуминга между ними на начальном этапе решать не обязательно.

Сетевые интерфейсы:
eth0 - интернет.
eth1 - точка доступа клиентов.
eth2 - интрасеть.

Подключается строго один экземпляр программы. Можно что нить продиумать для предотращения повторного запуска...

Различные фаерволы выключить к чертям. А поскольку камп шлюзовой то оставить на нём лишь несколько открытых портов. Внутри интрасети MAC адреса нафиг не нужны.. Под маршрутизатором я имел ввиду свитч (простите за неточность формулировки). Поэтому я в данном случае не вижу видимой проблеммы (если она есть то объясните доходчиво..)

В общем так:
eth0 - Интернет. схема транзита eth1-eth0. Всё просто, если пакет не попадает в маску внутренней подсети 10.x.x.x то он уходит в инет.
eth1 - Клиентская сеть. DHCP сервер выдаёт IP в узком диапазоне, для клиентов каждого хоста, его определённый объём зарезервирован 10.10.host.user (в общем так). Если пакет принадлежит компьютеру в пределах хоста то он уходит обратно на интерфейс eth1. Если пакет нужно отправить на другой хост, то он уходит на интерфейс eth2.
eth2 - Интрасеть. В настройках этого интерфейса в качестве шлюзов указаны все хосты сети. Непосредствено в кольцо этой сети будут подключены игровые, файловые и другие локальные серверы. Пакеты с этого интерфейса могут идти только клиентам, иначе будет путаница с трафиком.
(Если с таким разделением пакетов есть трудности то сообщите мне)

Другое: Приведёная мной конфигурация изменятся если и будет то изменения не будут затрагивать те методы взаимодействия которые я привёл.

Касаемо всевозможных ситуаций. Их просто не будет. Сеть будет просто раз в месяц удлинятся на некоторое колличество хостов.
Записан

Всё настолько сложно что непостижимо просто.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 16-01-2010 14:41 » 

И касаемо Web авторизации из за которой мой проект сочли неперспективным. Это сеть "Для своих" плюс в том что те кто не должны быть в сети ничего кроме шлюза не увидят. А  те кто войдут на WEB авторизацию те смогут прочитать новость вроде "30 апреля подключение дополнительных хостов на улице Делегатской, в этот день работа сети не гарантируется."
Записан

Всё настолько сложно что непостижимо просто.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 16-01-2010 16:38 » 

Предварительная оптимизация необходима на мой взгляд очень часто, хотя это и повышает сложность программирования, но зато и повышает надёжность и скорость.
Надёжность и скорость повышаются от грамотного проектирования. Если система спроектирована грамотно, то предварительно ничего оптимизировать смысла нет (да его и так нет). Потому что до завершения реализации всё равно доподлинно неизвестно, какая именно часть будет отнимать больше времени, и насколько велика польза от оптимизации этой части. А при грамотной архитектуре любая оптимизация будет локализована и затронет немногое.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 16-01-2010 21:20 » 

Rezedent12, про оптимизацию Вад уже сказал. Далее:

Цитата: Rezedent12
Под маршрутизатором я имел ввиду свитч (простите за неточность формулировки). Поэтому я в данном случае не вижу видимой проблеммы (если она есть то объясните доходчиво..)
Если switch (коммутатор), то ладно. Но был заявлен протокол обмена модуля с программой в виде "IP-Source, IP-Destination, IP-Size". Нужно расширить этот протокол для MAC-адресов, или же программа сама будет запрашивать ARP? Доверять таблице DHCP при заявленном уровне авторизации недостаточно, так как хитрый пользователь может задать статический адрес и к DHCP не обращаться.

Цитата: Rezedent12
В общем так:
eth0 - Интернет. схема транзита eth1-eth0. Всё просто, если пакет не попадает в маску внутренней подсети 10.x.x.x то он уходит в инет.
eth1 - Клиентская сеть. DHCP сервер выдаёт IP в узком диапазоне, для клиентов каждого хоста, его определённый объём зарезервирован 10.10.host.user (в общем так). Если пакет принадлежит компьютеру в пределах хоста то он уходит обратно на интерфейс eth1. Если пакет нужно отправить на другой хост, то он уходит на интерфейс eth2.
eth2 - Интрасеть. В настройках этого интерфейса в качестве шлюзов указаны все хосты сети. Непосредствено в кольцо этой сети будут подключены игровые, файловые и другие локальные серверы. Пакеты с этого интерфейса могут идти только клиентам, иначе будет путаница с трафиком.
(Если с таким разделением пакетов есть трудности то сообщите мне)
Трафик, пришедший с определённой IP-подсети и адресованный в ту же IP-подсеть, завернуть обратно в эту же подсеть не получится, поскольку он даже не будет принят маршрутизатором (за исключением случая, когда трафик адресован непосредственно маршрутизатору на его IP-адрес). Хосты сами между собой обмениваются пакетами внутри подсети - нужна соответствующая топология на канальном уровне (в случае Ethernet - единый сегмент). Маршрутизатор умеет лишь перенаправлять из одной подсети в другую, либо нужно будет прописывать индивидуальный маршрут на каждый хост с маской 32, не используя подсети.

По поводу eth2 не совсем понятно в части "все хосты" и "только клиентам". Кольцо образуется лишь на канальном уровне, или это отражено и в IP-маршрутизации?

Далее, допустимо ли с твоей точки зрения "захардкодить" имена интерфейсов и их назначение в модуле, или не стоит - нужна конфигурация?

Цитата: Rezedent12
Касаемо всевозможных ситуаций. Их просто не будет.
Гладко было на бумаге, да забыли про овраги... точнее, про законы Мерфи Улыбаюсь

Архитектура робастной (устойчивой к ошибкам) системы должна исходить из того, что сбой рано или поздно произойдёт. Любая часть системы сбой может: игнорировать, если это её не касается; реагировать и изменить режим работы, если сбой создаёт риск неадекватного поведения в зоне ответственности этой части; реагировать и осуществить аварийное прекращение работы, если сбой приводит к невозможности дальнейшей работы.

Как модуль будет сообщать программе об ошибках и невозможности своей работы? (Если такая ситуация возникает, трафик выходит из-под контроля, так как программа перестанет получать оперативную информацию о нём и контролировать лимиты.) Как программа будет обрабатывать такую ситуацию, и каким способом она должна быть оповещена о такой ситуации? Что делать, если модуль аварийно завершил свою работу? Может ли (и каким образом) программа опознать эту ситуацию, каков план действий программы в этом случае?

Или это всё, по-твоему, является излишеством?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 17-01-2010 09:22 » 

Я подумал.
Wi-Fi точку можно перевести в другой режим, у меня дома валяется D-link DWL-2100AP*, тогда внутри подсети хоста можно будет обмен между пользователями реализовать.

Файлы *.conf, конфигурирование введу через них.
Протокол обмена с модулем подсчёта можно дополнить. Если невозможна нормальная работа, то в полях обмена возвращаются в качестве адресов все нули, а в поле порта код ошибки. Например: |0.0.0.0||0.0.0.0||code error| и модуль приостанавливается. Дальше ему можно подать команды: Exit, Reboot... список можно будет расширить.

Касаемо хитрого пользователя. Даже если он и сам установит статический адрес, то ему надо неизбежно авторизироватся на сервере для доступа к инету и интрасети. Но учитывая что хакер будет очень хитрым, а добропорядочный пользователь перед тем как выключить камп не зайдёт на страницу авторизации чтоб закрыть соединение. То тогда хакер изменит MAC адрес и в ручную установит IP. (Если вы говорите о такой ситуации) То конечно же виноват пользователь (сам дверь не закрыл). Как раз для того чтоб так не было, можно раз в 3 секунды сравнивать IP и MAC и если что не так то отключать. Сомнительно что за 3 секунды можно будет перешить MAC и сменить IP. (Если же возможно то сообщите)

Кольцо - это я громко сказал. Это будет цепочка, хотя в данном случае, учитывая что сеть будет в одном сегменте, топология не важна. (Если данный проект выйдет в центр Пятигорска то там наиболее удобно будет использовать топологию "Звезда" с центром из свича и нескольких беспроводных точек типа DWL-2100AP*.)

В случае невозможности работы модуля, программа перекроет трафик, сообщит об этом админу и остановится. Если модуль аварийно завершится то программа узнает об этом по разрыву TCP соединения. Хотя можно сделать так чтоб модуль посылал UDP пакеты "Я жив!"

*- Валяется она у меня дома, я и экспериментирую с настройками.
Записан

Всё настолько сложно что непостижимо просто.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #36 : 18-01-2010 08:00 » 

Вопросы ещё есть?
Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 18-01-2010 12:57 » 

Rezedent12, есть - мне сейчас не до вопросов и ответов, времени нет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #38 : 18-01-2010 17:30 » 

Видимо тупик.. придётся ждать...
Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #39 : 18-01-2010 18:10 » 

Rezedent12, нет, я просто хочу выписать все требования к запрошенному модулю как задание на поиск/разработку. Это требует некоторого времени и сил, которые у меня появятся не раньше завтрашнего вечера. Сессия - приучаю молодёжь любить ООП Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #40 : 19-01-2010 04:52 » 

Dimka, почему бы этим не заняться автору темы?
Записан

Странно всё это....
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #41 : 19-01-2010 08:55 » 

Улыбаюсь Dimka, я рад хотя бы обещанию помощи... LogRus если бы я мог бы сам его написать, то тема бы называлась "Зырьте чё я накодил.." Отлично
Записан

Всё настолько сложно что непостижимо просто.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 19-01-2010 14:51 » 

LogRus, если он это сделает раньше - хорошо. А так мне самому интересно Улыбаюсь Стал бы я иначе тут активность проявлять?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #43 : 20-01-2010 04:58 » 

... А так мне самому интересно Улыбаюсь Стал бы я иначе тут активность проявлять?
ладно, разрешаю. проявляй активность Улыбаюсь
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 24-01-2010 14:37 » 

Вопрос по поводу подключения к Интернет. Как пить дать, на внешнем интерфейсе стоит NAT, поскольку про раздачу пользователям Интернет-адресов речи не шло.

Это означает, что подсчёт Интернет-трафика должен происходить на самом деле на внутренних интерфейсах, а не на внешнем, поскольку на внешнем после NAT уже потеряны локальные адреса пользователей.

Это правильное понимание?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 24-01-2010 17:23 » 

Да.. посчёт проходит на интерфейсе местной сети. (локальной) из которой люди выходят на хост. К интрасети никакие подсчёты не имеют отношения, поэтому её в принципе можно конфигурировать как угодно.
Записан

Всё настолько сложно что непостижимо просто.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 26-01-2010 18:47 » 

Блин, проблема.. Нет эмулятора IpTables под винду.. А линь я себе ещё не поставил...
Записан

Всё настолько сложно что непостижимо просто.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #47 : 26-01-2010 19:03 » 

Rezedent12, а зачем тебе эмулятор?
Что ты хочешь поиметь от IpTables?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #48 : 27-01-2010 07:26 » 

.......... накодить её максимум месяц работы ......

прошло ровно 2 недели

Блин, проблема.. Нет эмулятора IpTables под винду.. А линь я себе ещё не поставил...

 Класс! так держать
Записан

Странно всё это....
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #49 : 27-01-2010 16:44 » 

Смейтесь, смейтесь... у меня задержки финансового характера, не могу болванки купить.. ничего, через недели 2 бабло будет и запишу линь. Хотя прогу подсчёта начну писать завтра, чтоб потом не мучится.  P.S. Поставил Denwer, буду на PHP писать интерфейс авторизации.
Записан

Всё настолько сложно что непостижимо просто.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #50 : 28-01-2010 04:52 » 

Rezedent12, я не смеюсь, а иронизирую, кроме-то того месяц это всё таки очень мало, ИМХО.
что касается болванок, то:
можно обойтись и без болванок VirtualBox + ISO образ интересующей тебя лини (можешь скачать какую-нибудь супер мелкую версию без GUI, зачем тебе гуй?)
Записан

Странно всё это....
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #51 : 28-01-2010 16:45 » 

Ну мне комфортнее с гуем Улыбаюсь я эти 2 недели потрачу на написание каркаса и инерфейсов... А потом линь поставлю..  (просто я не считаю приличным прийти к девушке с хардом, чтоб ей пришлось крышку демонтировать...)
Записан

Всё настолько сложно что непостижимо просто.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #52 : 29-01-2010 21:29 » 

Открыл сайт посвящёный проекту FreeBilling http://billing.ho.ua/ Пока только статический HTML.
Записан

Всё настолько сложно что непостижимо просто.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #53 : 07-02-2010 21:44 » 

Код:
Attribute VB_Name = "Модуль1"
Rem Программа FreeBilling, автор Гареев Станислав Викторович 1990 г. рождения
Rem Email: rezedent12@inbox.ru   ICQ: 380736935.  Тема сообщения: Свободный биллинг
Rem Распространяется по лицензии GNU. Пишется под компилятор FreeBasic (freebasic.net)
Rem Предполагаемая ОС для использования Linux. В дальнейшем планируется портировать
Rem под FreeBSD, NetBSD, OpenBSD.. Возможно и под Windows. хотя вряд ли там появится что то типа IpTables :)
Rem Распростряняется как есть, автор не несёт никакой ответственности.
Rem При использовании в своих разработках проинформировать меня и записать в соавторы.
Rem P.S. Ознакомьтесь с лицензией GNU..


Type User 'основной тип для учёта
 Login As String * 10
 Password As String * 10
 IP As String * 23 'резерв под IPv6
 MAC As String * 16 ' стандартный MAC адрес
 
 AnLimit As Boolean ' тариф безлимитный.
 Limit As Long ' Колличество байт лимита
 Bytes As Long ' накопленые байты, вычитаются из лимита
 speed As Long ' Скорость в байт/сек, будет реализована при
  ' помощи подключаемого шейпера
 Time As Long 'Временой лимит соединения (мама выдала
  'ребёнку не более 2 часов инета в день)
 DateOver As DateDay ' дата истечкения акаунта

 LocalTraffic As Boolean ' разрешён ли локальный трафик
 InternetTraffic As Boolean 'разрешён ли глобальный трафик
 'данные переменные влияют на IpTables, этим влиянием управляет специальная процедура.
 
 
End Type


Type DateDay
 Year As Long  'год
 Month As Long ' месяц
 Day As Long   ' День

End Type

'Глобальные массивы и переменные:

Dim Users(2 To 254) As User  ' максимум к одному хосту
' будут подключены 253 пользователя, маска внутреней подсети 255.255.255.0
' первый IP не включёный в массив зарезервирован для самого хоста
Dim LocalMask As String ' Это не маска в общепринятом стандарте
' Она выглядет примерно так 010.010.010. пропущеное последнее
' число подразумевает любое значение.
' Следует быть осторожным, если в сети используются одновремено IPv4 и IPv6
' Это может приводить к непонятным эффектам, просьба разбирающимся в этом вопросе
' проинформировать меня, какие эффекты могут возникнуть....
' ПРИМЕЧАНИЕ: в данном проекте предполагается что DHPC сервер будет для внутренней
' локальной сети раздавать адреса по схеме: 010.a.b.x где:
' a - номер микрорайона или посёлка, b - номер хоста, x - номер клиента
' Значения a и b статичны и устанавливаются вручную. Значение x присваивается динамически.





''Нереализованые функции, прошу помощи в их написании:
Function GetMAC(IP As String) As String
  ' Для получения MAC адреса по IP
End Function

Function GetIP(MAC As String) As String
 ' Для получения IP адреса из MAC
 ' Данные функции работают с ARP таблицей... желательно чтоб они были кросплатфомены (Windows/Linux)
End Function








'Основные процедуры подсчёта и проверки:
Sub Traffic(IpFfrom As String, IpTo As String, L As Long)
 ' Данная процедура по сути является внешне инциализируемым событием
 ' В неё от процедуры приёма данных от модуля подсчёт через сокет, приходят:
 ' IP отправителя, IP принимающего, длинна пакета

 Dim a As Long, b As Long ' Счётчики
 Dim IpMask1 As String, IpMask2 As String ' Маски пакетов, используются при выяснении подсетей клиентов
 Dim IpKlient As String ' Пригодится :)
 Dim Debet As Boolean ' Флаговая переменная, применяется для индикации взломов.

 'проверка на предмет локальности пакета (локальный трафик не тарифицируется)
 IpMask1 = GetMASK(IpFrom): IpMask2 = GetMASK(IpTo)  ' Значения выясняются заранее и кэшируются в пременных,
 '  мало ли как эта процедура усложнится в будущем
 '  может надо будет подсчитывать и локальный трафик
 '  К тому же использовании вызова функции в предстоящем цикле очень нерационально
 If IpMask1 = "010.010." And IpMask2 = "010.010." Then
  ' трафик локальный, подсчитывать не надо, в крайнем случае можно записать в журнал
  ' Или может в будущем поставлю сюда тарификацию, мало ли до чего жаба доведёт :)
  Exit Sub ' завершение
 End If

 ' Если трафик не локальный
 If IpMask1 = "010.010." Then IpKlient = IpFrom ' трафик исходящий
 If IpMask2 = "010.010." Then IpKlient = IpTo ' трафик входящий
 ' Вот и пригодилась переменная, она обозначает IP локального клиента сети
 ' По этому IP и будем считать лимиты.
 ' Посмотрите в условия, вероятно при помощи них можно будет делать разной
 ' цену входящего и исходящего трафика.
 

 For a = 2 To 254 ' цикл выяснения принадлежности пакета
  If Users(a).IP = IpKlient Then
   ' Нашли кто нам бабло должен :)
   If AnLimit = True Then
    'Эх,Безлимитчик... Ничего, пусть Debian свободно качает
   Exit Sub
   End If
   If Anlimiit = False Then
   ' Лимитчик, наш клиент :), щас похудеет его кошелёк. Счётчик вперёд!!
    Users(a).Bytes = Users(a).Bytes + L ' тут всё немного сложнее, пока мы прибавим значение..
    'Сам вычет средств происходит в другой процедуре вызываемой по таймеру
    'Данный финт нужен лишь в целях дальнейшего расширения возможностей...
    Exit Sub ' А что там дальше то считать? :)
   End If
 
  Debet = True ' Ужас, наша сеть взломана. Надо срочно проверить политики
  ' и выслать уведомление админу.. По сути данная переменная обозначает то что
  ' кто то смог послать пакет транзитом через нашу сеть, или кто то обошёл IpTables
  ' Думаю данное событие очень серьёзно. Принимаю реализации процедур на тему "Что делать?!"
  ' Хотя кто-нибудь напишите скрипт как для указаного IP перекрыть весь трафик наглухо..

  End If
 Next
End Sub





Function GetMASK(IP As String) As String
 ' данная функция возращает первые 2 числа IP адреса для использования их как маски сетей.
 Dim b As String
 b = Mid(IP, 1, 8) ' первые 2 числа IP "010.010."
 GetMASK = b
End Function



Sub TimeBalans()
'Процедура для подсчёта бабла, в неё в дальнейшем вместо комментов -что сделать-
'ставлю конструктор инструкций для IpTables. Принимаю шаблоны для различных операций
'по управлению трафиком.
'Данная процедура вызывается событием таймера, таймер можно будет реализовать в процедуре слежения за сокетом.

Dim a As Long

For a = 2 To 254
 Users(a).Limit = Users(a).Limit - Users(a).Bytes 'из лимита вычитается израсходованый трафик

 If Users(a).Limit <= 0 And Users(a).AnLimit = False Then
  '-Перекрыть интернет трафик для данного юзера-
  ' Он не безлимитчик и лимит у него кончился.
 End If
 
 'Сейчас не обязательно, но думаю надо будет реализовать проверку временного
 'лимита.
 'Помните коммент про злую мамашу? :)

 'Так же надо будет реализовать проверку даты для безлимитчиков.
 ' If users(a).AnLimit = true then проверить дату и если
 ' уже полночь, карета анлима, превращается в дыню дисконекта.. :) (тариф "Золушка") :-D
  

Next

End Sub

'Примечание: свои дополнения и замечания, присылайте с цитирование части кода
'с подробным объяснением "почему" и справедливыми притензиями.
'Буду очень рад тем кто не только укажет на недоработки, но и исправит их.
'Даже несколько строк кода могут быть пелезны
'Данный исходник от 29 января 2010 года был написан в течении для
'на одном порыве мысли... Поэтому прошу строго не судить.
'
'К Debian никаких притензий, просто реально большой дистрибутив
'
'К психологам: мама мне инет не ограничевала, но по другим людям знаю :)
'
'Вопрос: А здесь только процедуры! Где главный код?
'Ответ: Ещё не сделал, Но думаю это будет бесконечный цикл с флагами для выхода
'и ожиданиями данных от сокетов... Если можешь то помоги накодить.
'
'
'К вопросу о процедуре авторизации. Щас кодю и испытываю на Denwer'е
'Думаю сам управлюсь, хотя предложения принимаются...
'
' Исправил некоторые ошибки


« Последнее редактирование: 08-02-2010 06:14 от Вад » Записан

Всё настолько сложно что непостижимо просто.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #54 : 08-02-2010 12:29 » 

Rezedent12, я бы на твоём месте разметил исходники в svn или git на одном из бесплатных хранилищ
например, http://code.google.com/intl/ru/projecthosting/
Записан

Странно всё это....
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #55 : 08-02-2010 12:46 » 

Rezedent12, а где основная программа? как вызываются процедуры?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #56 : 11-02-2010 10:59 » 

Основную программу ещё не сделал... Но сделаю... прошу идеи относительно того что там реализовать...
Записан

Всё настолько сложно что непостижимо просто.
Rezedent12
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #57 : 05-03-2010 11:36 » 

Медленно но верно нарастает объём кода..... пока не публиковал
Записан

Всё настолько сложно что непостижимо просто.
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines