Regra IPTables para nenhuma das duas interfaces

2

Estou usando o IPtables e tenho uma dúvida que não consigo encontrar. Eu quero aplicar uma regra no PREROUTING da tabela nat. A regra deve executar uma cadeia, mas eu quero que ela seja executada para todas as interfaces, exceto para duas delas. Eu não posso usar curingas porque eu preciso de todas as outras interfaces, independentemente do seu nome (digamos que eu não posso tê-lo).

Eu apliquei esta regra:

iptables -t nat -A PREROUTING -j my_chain ! -i eth0

Isso resulta nisso:

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in     out     source       destination
10   1538  my_chain   all  -- !eth0   *       0.0.0.0/0    0.0.0.0/0

Mas eu preciso de algo assim:

Chain PREROUTING (policy ACCEPT 19 packets, 3008 bytes)
pkts bytes target     prot opt in               out     source      destination
10   1538  my_chain   all  -- !(eth0 or tun0)   *       0.0.0.0/0   0.0.0.0/0

A coisa é que não pode ser em duas regras diferentes, porque uma dessas duas interfaces entrará na regra de interface do outro. Eu também tentei algo como:

iptables -t nat -A PREROUTING -j my_chain ! -i eth0 ! -i tun0

Mas retorna: multiple -i flags not allowed

Bassicamente, preciso implementar um or na condição da interface ou !eth0 and !tun0 (equivalente lógico).

Estou usando o debian com o iptables v1.4.21.

Obrigado pela sua ajuda!

    
por dubafek 10.11.2016 / 16:49

1 resposta

1

Para resolver o seu problema, você deve lembrar que as regras iptables são aplicadas seqüencialmente (assim que uma se aplica, o pacote é removido da cadeia e as seguintes regras na mesma cadeia são apenas ignorado), e que você pode inventar novas cadeias; então vamos definir duas novas cadeias,

 iptables -N chain1
 iptables -N chain2

e agora enviamos pacotes em tun0 e eth0 para chain1 , e tudo mais para chain2 :

 iptables -t nat -A PREROUTING -i tun0 -j chain1
 iptables -t nat -A PREROUTING -i eth0 -j chain1
 iptables -t nat -A PREROUTING -j chain2 

e agora você pode atribuir suas regras separadamente às duas cadeias: por exemplo, para excluir tudo em cadeia2 , mas não em cadeia1 ,

iptables -A chain1 -j ACCEPT
iptables -A chain2 -j DROP

Esse truque permite que você crie uma regra equivalente a um OR booleano: se o pacote estiver entrando em eth0 OU através de tun0 , então faça ... Já que o booleano AND é fácil de implementar (por exemplo, se algo entrar em eth0 e é destinado a 8.8.8.8, então .. é equivalente a

 iptables -t nat -A PREROUTING -i eth0 -d 8.8.8.8 ....

), você tem os dois conectivos OR e AND , que permitem construir qualquer tabela de verdade na lógica booleana.

    
por 10.11.2016 / 17:35