Condividi tramite


Elaborazione asincrona della classificazione dei callout

Un driver callout WFP può autorizzare o negare un'operazione di rete oppure ammettere o eliminare un pacchetto di rete restituendo i tipi di azione FWP_ACTION_PERMIT, FWP_ACTION_CONTINUEo FWP_ACTION_BLOCK dalla funzione di callout di classificareFn. Spesso un driver callout non può rilasciare una decisione di ispezione dalla sua funzione classificareFn fino a quando le informazioni indicate, come i campi di classificazione, i metadati o i pacchetti, possono essere inoltrate per l'elaborazione a un altro componente, come un'applicazione in modalità utente. In questi casi potrebbe essere necessario prendere una decisione in modo asincrono in un secondo momento.

Regole generali per l'elaborazione asincrona

WFP supporta l'elaborazione asincrona della funzione di callout classificareFn. Tuttavia, il meccanismo per eseguire questa operazione differisce in base ai diversi livelli.

classificazione asincrona di ALE
Un driver callout deve chiamare la funzione FwpsPendOperation0 dalla funzione classifyFn. L'operazione asincrona deve essere completata con una chiamata alla funzione FwpsCompleteOperation0.

classificazione di pacchetti asincroni
Un driver callout deve restituire il valore FWP_ACTION_BLOCK dalla funzione classifyFn, impostando il flag FWPS_CLASSIFY_OUT_FLAG_ABSORB. È necessario riferirsi ai pacchetti di rete o clonarli. L'operazione asincrona viene completata reiniettando il pacchetto clonato o modificato o rimuovendo automaticamente il pacchetto.

Classifica ALE asincrona che include pacchetti
Viene utilizzata una combinazione delle due procedure precedenti: l'operazione di classificazione viene messa in attesa e il pacchetto viene referenziato o clonato, e in un secondo momento la chiamata a classifyFn viene completata e il pacchetto clonato viene reinserito o rimosso.

Casi speciali e considerazioni

ALE Connect e i livelli di ricezione/accettazione
Quando FwpsCompleteOperation0 viene chiamato per completare un'operazione di classificazione che è in sospeso a un livello di connessione ALE (FWPS_LAYER_ALE_AUTH_CONNECT_V4 o FWPS_LAYER_ALE_AUTH_CONNECT_V6), si attiva un'operazione di classificazione di riautorizzazione ALE al rispettivo livello di connessione ALE. Il driver callout deve restituire una decisione di ispezione in base a questa operazione di classificazione per la riautorizzazione. È possibile riconoscere un'operazione di classificazione per la riautorizzazione ALE verificando se è impostato il flag FWP_CONDITION_FLAG_IS_REAUTHORIZE.

Il driver di callout deve mantenere uno stato univoco per ogni operazione di classificazione ALE_AUTH_CONNECT in modo che la decisione di ispezione per ogni operazione di classificazione possa essere cercata durante un FwpsCompleteOperation0-trigger di riautorizzazione. Se si fa riferimento o si clonano pacchetti durante un'operazione di classificazione ALE_AUTH_CONNECT in sospeso (ad esempio, per le connessioni non TCP), possono essere reiniettati dopo la riautorizzazione.

Quando FwpsCompleteOperation0 viene chiamato durante un'operazione di classificazione a un livello di ricezione/accettazione ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 o FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6), FwpsCompleteOperation0 non attiva una riautorizzazione ALE. Al contrario, viene eseguita di nuovo una nuova chiamata a classifyFn quando il pacchetto clonato viene reiniettato in ingresso se la modifica non è abbastanza significativa da ignorare il filtro. L'autorizzazione del clone auto-iniettato dal livello ALE_RECV_ACCEPT effettivamente autorizza la connessione in ingresso. Se la connessione in ingresso non deve essere consentita, scartare il pacchetto in ingresso dopo aver chiamato FwpsCompleteOperation0.

RIAUTORIZZAZIONE ALE
Un driver callout può essere riclassificato in un livello di connessione o ricezione/accettazione di ALE per eventi come una modifica dei criteri (ad esempio, l'aggiunta o la rimozione di un filtro a livello), il rilevamento di una nuova interfaccia di arrivo e la reimpostazione della chiave di una connessione tramite IPsec. Tale riautorizzazione non può essere posticipata chiamando FwpsCompleteOperation0e non è necessario farlo. Un driver callout deve usare le regole elencate in precedenza per elaborare i pacchetti indicati durante la riautorizzazione.

Tenere presente che sia il pacchetto in ingresso che quello in uscita possono essere nuovamente autorizzati a livelli ALE_AUTH_CONNECT o ALE_RECV_ACCEPT. Ad esempio, un pacchetto in ingresso può essere nuovamente autorizzato a livello di ALE_AUTH_CONNECT. Un driver callout non deve assumere che la direzione del pacchetto sia la stessa della direzione della connessione.

ALE_FLOW_ESTABLISHED livelli
L'elaborazione asincrona non è supportata a questi livelli (FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4 o FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6).

INBOUND_TRANSPORT livelli
Un driver di callout non deve eseguire l'elaborazione asincrona dei pacchetti che richiedono la classificazione ALE al livello di trasporto in ingresso (inbound) (FWPS_LAYER_INBOUND_TRANSPORT_V4 o FWPS_LAYER_INBOUND_TRANSPORT_V6). Questa operazione può interferire con la creazione del flusso. Quando WFP chiama la funzione di richiamo classifyFn al livello di trasporto in ingresso, imposta il flag FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED per i pacchetti che richiedono l'elaborazione della classificazione ALE. Un driver callout dovrebbe consentire tali pacchetti da un livello INBOUND_TRANSPORT e rinviarli fino a raggiungere un livello ALE_RECV_ACCEPT.

STREAM livelli
A livello di flusso (FWPS_LAYER_STREAM_V4 o FWPS_LAYER_STREAM_V6), i segmenti di dati TCP sono indicati anziché un'intestazione IP o TCP. Il livello di flusso è anche il punto in cui una catena di elenchi di buffer di rete può essere indicata in una chiamata alla funzione callout classifyFn. WFP rende disponibili funzioni di clonazione e inserimento specializzate, FwpsCloneStreamData0 e FwpsStreamInjectAsync0, per i callout del livello di flusso da usare.

A causa della natura ordinata della consegna dei dati del livello di flusso, un driver callout deve continuare a clonare e assorbire i dati finché c'è ancora del flusso di dati in sospeso. La combinazione di operazioni asincrone e sincrone per un determinato flusso può comportare un comportamento non definito.