wfp
От: Alexandr_D  
Дата: 16.12.10 17:30
Оценка:
Здравствуйте,

пытаясь собрать collaout драйвер (на FWPM_LAYER_ALE_CONNECT_REDIRECT_V4 слое), который бы перенаправлял исходящий трафик на локальный прокси, заметил такую вот вещь — если фильтр (см. ниже) добавить дважды для одного и того же IP адреса (или, например, для IP адреса и для подсети, содержащей этот адрес), то получается зацикливание в classifyFn (бесконечное перенаправление с localhost на localhost). Есть ли на уровне wfp каие-либо механизмы отследить/предотвратить такое (конкретно на ALE слоях)? Или это можно сделать только на уровне приложения?

Собственно фильтр:

RtlZeroMemory(&remoteAddrAndMask, sizeof(FWP_V4_ADDR_AND_MASK));
remoteAddrAndMask.addr = remoteAddr;
remoteAddrAndMask.mask = 0xFFFFFF00;

filter.weight.type = FWP_UINT8;
filter.weight.uint8 = 0xe;
filter.subLayerKey = TCP_REDIRECTOR_SUBLAYER; // мой sublayer
filterConditions[0].fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS;
filterConditions[0].matchType = FWP_MATCH_EQUAL;

filterConditions[0].conditionValue.type = FWP_V4_ADDR_MASK;
filterConditions[0].conditionValue.v4AddrMask = &remoteAddrAndMask;
wfp
Re: wfp
От: Аноним  
Дата: 20.12.10 09:12
Оценка:
Попробуй проверить флаги:

flags = inFixedValues->incomingValue[ FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_FLAGS ].value.uint32;

на значение FWP_CONDITION_FLAG_IS_REAUTHORIZE
Re[2]: wfp
От: Alexandr_D  
Дата: 30.12.10 12:07
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Попробуй проверить флаги:


А>flags = inFixedValues->incomingValue[ FWPS_FIELD_ALE_CONNECT_REDIRECT_V4_FLAGS ].value.uint32;


А>на значение FWP_CONDITION_FLAG_IS_REAUTHORIZE



Да, после двух вызовов моей ClassifyFn значение флагов меняется с 0x0 на 0x4 (т.е. REAUTHORIZE). Однако, если я ставлю дополнительное условие



    filterConditions[1].fieldKey =  FWPM_CONDITION_FLAGS;
    filterConditions[1].matchType = FWP_MATCH_FLAGS_NONE_SET;
    filterConditions[1].conditionValue.type = FWP_UINT32;
    filterConditions[1].conditionValue.v4AddrMask = FWP_CONDITION_FLAG_IS_REAUTHORIZE;


то тестовый клиент вылетает на connect с SocketException: An attempt was made to access a socket in a way forbidden by its access permissions.
И клиент и сервер запускаются как администратор.
wfp
Re[3]: wfp
От: Аноним  
Дата: 30.12.10 12:34
Оценка:
Возможно, проблема в том, что на твоем саблеере не находится разрешающего фильтра когда начинается "reauthorize"

Попробуй вернуть все в исходный вариант и в ф. classifyFn добавить код:
1) Проверить флаг FWP_CONDITION_FLAG_IS_REAUTHORIZE
2) Если он установлен, ничего не делать, выставить статус allow и вернуть управление

Или добавить соответствующий фильтр ( т.е сделать два фильтра: если флаг не стоит -> вызов callout, если стоит -> разрешить ).

А вообще, два фильтра-редиректа в системе, это помоему не решаемая задача в случае если они оба на локалхост пытаются сделать редирект. Разве что ставить исключения на процессы — локальные прокси.
Re[3]: wfp
От: Alexandr_D  
Дата: 30.12.10 23:24
Оценка:
Поправка — в строке


filterConditions[1].conditionValue.v4AddrMask = FWP_CONDITION_FLAG_IS_REAUTHORIZE;



должно быть, конечно же


filterConditions[1].conditionValue.uint32 = FWP_CONDITION_FLAG_IS_REAUTHORIZE;



что, впрочем, не повлияло на результат.
Re[4]: wfp
От: Alexandr_D  
Дата: 30.12.10 23:53
Оценка:
Вот итить! Все разрешилось. До разрешающего фильтра-то я додумался, но он ничего не изменил — по-прежнему не работало. Стал пробовать вариант 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 строчки...

На счет "два фильтра-редиректа в системе..." — так у меня трудность была не в том, как это сделать, а, скорее, как этого избежать

В общем, спасибо большое за помощь и с Новым Годом!
Re[5]: wfp
От: Alexandr_D  
Дата: 31.12.10 00:03
Оценка:
Если кому интересно, разрешающий фильтр таков:


    filter.action.type  = FWP_ACTION_PERMIT;
    filter.weight.type  = FWP_UINT8;
    filter.weight.uint8 = 0xf; // вес выше, чем у других фильтров в моем саблэере
    filterConditions[0].fieldKey =  FWPM_CONDITION_FLAGS;
    filterConditions[0].matchType = FWP_MATCH_FLAGS_ANY_SET;
    filterConditions[0].conditionValue.type = FWP_UINT32;
    filterConditions[0].conditionValue.uint32 = FWP_CONDITION_FLAG_IS_REAUTHORIZE;
Re[5]: wfp
От: Alexandr_D  
Дата: 31.12.10 00:18
Оценка:
И, все-таки, непонятно — почему моя ClassifyFn вызывается дважды — ведь когда она вызывается второй раз, и я проверяю внутри нее значение remoteAddressAndPort, оно уже модифицированное, т.е. вроде как условие, на которое заряжен фильтр, не выполняется...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.