Hello, All!
У меня такая проблемма необходимо написать свой traffic shaper/counter (именно свой) для шлюза в инет. Для выхода в интернет может быть использован как LAN Adapter1, так и модем, на выходном интерфейсе настроен NAT. К локальной сети шлюз подсоединен через LAN Adapter2. Трафик надо считать для каждого MACа локальной, а так же для каждого процесса самого шлюза. В ходе своих рассуждений как все это сделать я зашел в тупик - много не ясного и слишком уж сложная схема получилась.
Вот ети рассуждения, помоги мне развеять "неясности":
Для начала мне кажется надо составить схему прохождения пакетов, я попытался это сделать:
1) Прохождение пакетов от хоста локалки до хоста в инете через шлюз.
Хост источник отправляет пакет в локальную сеть: srcMAC = свой, dstMAC = шлюз, srcIP = свой, dstIP = хост в инете.
NIC (LAN Adapter2) принимает пакет -> Miniport NIC -> Protoc Driver IP. Драйвер ищет запись в таблице маршрутизации и перенаправляет пакет интерфейсу выхода в инет.
Вот далее мне не совсем ясно на каком уровне работает NAT. Т.е. где в иерархии
NDIS Protocol Driver | NDIS IM Driver | NDIS Miniport Driver эта NAT рассполагается для LAN Adapterа и модема.
Помимо NAT еще должно выполняться фрагментирование пакета, если MTU внешнего интерфейса меньше. Это по идеи делает NDIS Protocol Driver. Важно помоему то что на уровне протокола пакет может быть отброшен.
Так же не ясно выполняется ли NAT до фрагментации или после.
Но тем не мение пакеты проходят через NAT, и если это ICMP, UDP или TCP пакеты, то они дальше пропускаются
с маскарадингом, все остальные пакеты отбрасываются.
И если все правильно получается, то вся маршрутизация реализуется в NDIS драйверах и WinSock тут не участвует вовсе???
2) Прохождение пакета от процесса на шлюзе до хоста в инете.
Процесс регистрируется в Winsock.
Далее создает сокет с указанием типа и параметров протокола и отправляет через этот сокет пакет.
Winsock как-то через TDI передает пакет драйверу протокола.
Драйвер протокола лезет в таблицу маршрутизации и далее все как и первом случае.
Так же NAT получается выполняет и для пакетов отправленых непосредственно со шлюза???
Т.е. грубо получается вот такая картинка:
Application
|
WinSock
|
TDI
|
(NDIS TCP/IP Protocol driver) <-- маршрутизация, фрагментация, NAT
| |
(Miniport driver) (Miniport driver)
| |
(NIC 1) (NIC 2 / Modem)
| |
{Local Network} (MUX)
|
(NIC провайдера)
Что бы считать трафик я так понимаю должен встрянуть между всеми (Protocol drivers) и (Miniport driver) для (NIC 2 / Modem), так как пакет может быть отброшен драйвером протокола. Возникает две проблемы:
- как "встрять" между всеми протоколами и (Miniport driver). Говорят IM драйвер в случае модема не подойдет.
- допустим встряли (написали IM driver для LAN адаптера). Как теперь определить пренадлежит ли этот пакет
тракту маршрутизации и если да то для какого хоста или он принадлежит тракту посылки пакета из процесса и
если да то какому PID (У меня стоит ZoneAlarm и он как-то определяет от какого процесса идет пакет, но КАК?).
А насчет тракта NAT вообще не ясно как сделать, может NDIS позволяет как-нибудь помечать пакеты или может
есть какой нить доступ к таблицам NATа?
Shaper: что бы эффективно управлять трафиком (shaper) помоему надо встрять до (NDIS TCP/IP Protocol driver) и до NAT и судя по схеме надо встять в двух местах: между (Miniport driver) и драйверами протоколов И где нить между процессом
и драйверами протоколов. Первое вроде реализуемо через IM драйвер, а что второе реализуемо доказвывает опять же
существование ZoneAlarm, но как он это делает?
Может кто-нить писал такие программы или видел исходные тексты, или знает как пишутся такие проги - поделитесь pls. Если мне удастся таки написать такую группу драйверов обязательно выложу исходники.
Короче помогите pls.