Ho appena letto un libro su PF (The Book Of PF, No Starch), ma c'è una domanda a cui non ha risposto.
Se ho una macchina gateway che utilizza due interfacce, $ int_if e $ ext_if e I NAT i pacchetti provenienti da $ int_if: net (che è, diciamo, 10.0.0.0/24) a $ ext_if usando match
, quando viene applicato il NAT ? Prima o dopo le regole di filtraggio?
Esempio:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
pass out on $ext_if from 10.0.0.0/24
block drop out on $ext_if from 10.0.0.23
Funziona? O ottiene l'IP di origine di un pacchetto proveniente da 10.0.0.23 NATed all'indirizzo $ ext_if prima del controllo se viene valutato da 10.0.0.23?
Questo diagramma non è utile per rispondere a questa domanda, penso, ma è comunque interessante: [ http://www.benzedrine.cx/pf_flow.png ]
Se leggi le FAQ su PF NAT [ http://www.openbsd.org/faq/pf/nat.html ], in particolare la sezione "Configurazione di NAT", troverai queste frasi:
Quando un pacchetto viene selezionato da una regola di corrispondenza, i parametri (ad es. Nat-to) in quella regola vengono ricordati e vengono applicati al pacchetto quando viene raggiunta una regola di passaggio corrispondente al pacchetto. Ciò consente a un'intera classe di pacchetti di essere gestita da un'unica regola di abbinamento e quindi è possibile prendere decisioni specifiche sull'autorizzazione del traffico con regole di blocco e passaggio.
Penso che suona come se non fosse come ho detto nel paragrafo sopra, quindi l'IP sorgente viene "ricordato" fino a quando non viene presa una decisione sull'azione da fare con il pacchetto. Se viene presa la decisione, viene applicato il NATting.
Cosa ne pensi?
PS: Questa è una domanda abbastanza teorica. Se sei un po 'pragmatico, lo farai in questo modo:
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
block drop from 10.0.0.23
# or, explicitly,
# block drop in on $int_if from 10.0.0.23
Quindi la block
regola viene già applicata quando il pacchetto arriva su $ int_if.
EDIT: Un'altra possibilità è, ovviamente, decidere prima del NAT:
pass from 10.0.0.0/24
block drop from 10.0.0.23
match out on $ext_if from 10.0.0.0/24 nat-to ($ext_if)
Se arriva un pacchetto da .23, prima corrisponde alla prima regola, quindi alla seconda e alla terza "regola". Ma poiché la seconda regola è l'ultima decisione sul passaggio / blocco, il pacchetto viene bloccato. Giusto?
quick
parola chiave ma non mi piace molto - cerco sempre di utilizzare l'ordine di valutazione di pf;) A proposito, ho trovato la risposta in una pagina di domande frequenti su OpenBSD: "NAT è specificato come parametro nat-to opzionale per una regola pass in uscita. Spesso, anziché essere impostata direttamente sulla regola pass, viene utilizzata una regola di corrispondenza. Quando un pacchetto viene selezionato da una regola di corrispondenza, i parametri (ad es. nat-to) in quella regola vengono ricordati e applicati al pacchetto quando viene raggiunta una regola di passaggio corrispondente al pacchetto. ". Quindi il mio