пытаясь собрать collaout драйвер (на FWPM_LAYER_ALE_CONNECT_REDIRECT_V4 слое), который бы перенаправлял исходящий трафик на локальный прокси, заметил такую вот вещь — если фильтр (см. ниже) добавить дважды для одного и того же IP адреса (или, например, для IP адреса и для подсети, содержащей этот адрес), то получается зацикливание в classifyFn (бесконечное перенаправление с localhost на localhost). Есть ли на уровне wfp каие-либо механизмы отследить/предотвратить такое (конкретно на ALE слоях)? Или это можно сделать только на уровне приложения?
то тестовый клиент вылетает на connect с SocketException: An attempt was made to access a socket in a way forbidden by its access permissions.
И клиент и сервер запускаются как администратор.
Возможно, проблема в том, что на твоем саблеере не находится разрешающего фильтра когда начинается "reauthorize"
Попробуй вернуть все в исходный вариант и в ф. classifyFn добавить код:
1) Проверить флаг FWP_CONDITION_FLAG_IS_REAUTHORIZE
2) Если он установлен, ничего не делать, выставить статус allow и вернуть управление
Или добавить соответствующий фильтр ( т.е сделать два фильтра: если флаг не стоит -> вызов callout, если стоит -> разрешить ).
А вообще, два фильтра-редиректа в системе, это помоему не решаемая задача в случае если они оба на локалхост пытаются сделать редирект. Разве что ставить исключения на процессы — локальные прокси.
Вот итить! Все разрешилось. До разрешающего фильтра-то я додумался, но он ничего не изменил — по-прежнему не работало. Стал пробовать вариант 1)-2) — с проверкой флага внутри ClassifyFn — и тоже глухо.
Пришлось медитировать над msdn и искать в чем у меня "проруха". Оказалось в localRedirectTargetPID. Изначально я, следуя msdn, передавал в ClassifyFn этот PID, но потом оказалось, что и без передачи как-то "все работало". До поры. Из-за неверного localRedirectTargetPID'а я и получил SocketException: An attempt was made to access a socket in a way forbidden by its access permissions.
Так что теперь оба варианта работают, вопрос — какой лучше? Я думаю, с отдельным разрешающим фильтром, т.к. он явно показывает структуру collaout'а, хотя другой вариант реализуется в 2 строчки...
На счет "два фильтра-редиректа в системе..." — так у меня трудность была не в том, как это сделать, а, скорее, как этого избежать
В общем, спасибо большое за помощь и с Новым Годом!
И, все-таки, непонятно — почему моя ClassifyFn вызывается дважды — ведь когда она вызывается второй раз, и я проверяю внутри нее значение remoteAddressAndPort, оно уже модифицированное, т.е. вроде как условие, на которое заряжен фильтр, не выполняется...