Тебуется сделать прозрачный редирект на прокси сервер. Редирект делается драйвером NDIS IM. Если запрос идет из компьютера локальной сети, т.е. приходит на внутреннию сетевую карту, все хорошо работает. Но если запрос идет с локального компа, ::recv(...) в прокси сервере возвращает ошибку 10054. как можно починить или куда копать?... TDI не предлагать... не хочу
судя по всему, обратное соединение не идет вниз до уровня NDIS и соответственно не подменяются обратно параметры IP соединения (источник остается локальным), а в случае компа из локальной сети подмена происходит и браузер клиентского компа не замечает подмены... что же делать.....
Ничо непонятно из того что ты написал. Одно можно точно сказать - делать прозрачное туннелирование через прокси на уровне NDIS IM это большущий геморрой. Yа уровне прикладного протокола вообще как нечего делать, а тут... Тут во всяком случае тебе никто ничего не посоветует с такой подробностью изложения.
У вас уже есть вектор куда копать! recv возвращает ошибку - вот и начинай копать: ws2_32.dll, wd2help.dll, afd.sys, ws2ifsl.sys, tdi.sys, tcpip.sys etc....
Да как бы сложно подробнее.. Есть NDIS IM драйвер. Есть прокся в юзер моде, т.е. обычная. 0. Клиент отправляет запрос на удаленный сервер. 1. Пакеты приходят на NDIS драйвер (на шлюзе) и он подменяет адрес назначения на локальный (типа 192.168.0.1) и порт назначения (80 на адрес прокси сервера). 2. таким образом пакеты летят на прокси сервер. 3. Прокси сервер обрабатывает запрос. 4. Отправляет ответ. 5. Ответ летит на NDIS драйвер. Драйвер в этом соединении меняет, теперь уже адрес источника, на тот, который был в исходном соединении. 6. Клиент получает ответ и думает, что он от удаленного сервера. Все это уже реализовано и работает. Но в случае если клиент локальный (т.е. соединение инициировано собственно шлюзом), не происходит пункта 5 и как я подозреваю, ошибка возникает по этой причине....
Давно этим не занимался да и голова щас не работает уже, так что не могу что-то внятное сказать, но вариант такой можно предложить: если пункты 1-4 у вас работают и раз вы запоминаете какие где кому адреса менять в своем IM драйвере, то реализуйте для запроса с локального компьютера (пункт 1) кроме замены адреса источника еще и замену адреса отправителя на некий фиктивный адрес в локальной сети, тогда пакеты будут рядовым образом возвращаться от прокси к вашему IM и вы и тут тоже будете производить замену обоих адресов. Кстати вопрос такой, для локального клиента когда вы делаете запрос, правильно ли я понимаю что сначала он идет от клиентской программы вниз к ndis-минипорту, а потом он оттуда возвращается уже вверх, и тут вы его ловите? Так по-моему и происходит но чот не соображу сейчас - а почему? Почему он вверх идет обратно
Т.е. вопрос вот какой возвращает ли сетевая карта эхом все входящие на нее со стороны компьютера кадры назад компьютеру? Или делает ли это ОС после того как скармливает минипорту кадр? Это не по теме может немного вопрос просто самому щас интересно
А. Может сетевая карта возвращает эхом те кадры, в которых мак адрес назначения и есть сама сетевая карта? а у вас надо полгать на всех компьютерах включая сам комп. с прокси - прописан gateway, так что все пакеты с внешними IP всовываются во фреймы с мак адресом шлюза. Так что у вас когда сам шлюз отсылает пакет, там идет ethernet кадр с мак адресом получателя/отправителя=мак адресу сетевой карты шлюза блин я спать )))))
Хмм.. навели на мысл посмореть МАК адреса.. он же поди кривой.. может в этом и проблема.... МАС адреса я не подменяю, а по идее нужно. Если пакетик приходит извне, то у него MAC назначения собственно шлюз, поэтому поменяв IP адрес, все хорошо.. Если же пакетик летит с самого шюза, то МАС назначения будет уже след. шлюз. Проверю отпишусь. я его отправляю через NdisSend и он приходит мне на проксю. Честно говоря тоже не очень понимаю почему так происходит
MAC поменял. Ничего не изменилось. В сниффере даже видно, что маки одинаковые. Но видно только пакеты летящие в проксю. Обратно нет, т.к. синффер тоже NDIS.
Ничего не вышло, поэтому сделал вариант с фиктивным IP адресом. Все работает. Спасибо за комменты, они помогли. Вместо NdisSend в этом случае нужно отправлять в другую сторону, т.е не на адаптер а обратно протоколу (NdisMIndicateReceivePacket). Только не очень мне нравится это решение...