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.