No meu script iptables, tenho experimentado escrever regras o mais refinadas possível. Limito quais usuários têm permissão para usar quais serviços, em parte por segurança e em parte como um exercício de aprendizado.
Usando o iptables v1.4.16.2 no Debian 6.0.6 executando o kernel 3.6.2.
No entanto, encontrei um problema que ainda não entendi ...
portas de saída para todos os usuários
Isso funciona perfeitamente bem. Eu não tenho nenhuma regra genérica de rastreamento de estado.
## Porta de saída 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate NOVO, ESTABELECIDO -j ACEITA $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate ESTABELECIDO -j ACEITA
portas de saída com correspondência de usuário
## porta de saída 80 para a conta do usuário $ IPTABLES -A OUTPUT --match owner --uid-owner useraccount -p tcp --dport 80 -m conntrack --ctstate NOVO, ESTABELECIDO --sport 1024: 65535 -j ACEITAR $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate ESTABELECIDO -j ACEITA
Isso permite a saída da porta 80 apenas para a conta "useraccount", mas regras como esta para o tráfego TCP têm problemas.
## Log de saída padrão + regras de bloqueio $ IPTABLES -A OUTPUT -j LOG - prefixo de log "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A OUTPUT -j DROP
O problema
O trabalho acima, o usuário "useraccount" pode obter arquivos perfeitamente bem. Nenhum outro usuário no sistema pode fazer conexões de saída com a porta 80.
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
Mas o wget acima deixa o x7 eliminado entradas no meu syslog:
18 de outubro 02:00:35 kernel xxxx: BAD OUTGOING IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 JANELA = 979 RES = 0x00 ACK URGP = 0
Não recebo essas quedas por regras semelhantes com o tráfego UDP. Eu já tenho regras em vigor que limitam quais usuários podem fazer solicitações de DNS.
Os pacotes ACK de saída descartados parecem vir da conta raiz (URGP = 0) que eu não entendo. Mesmo quando troco a conta de usuário pela raiz.
Acredito que os pacotes ACK são classificados como novos porque o conntrack começa a rastrear as conexões após a terceira etapa do handshake de três vias, mas por que estão sendo descartados?
Essas gotas podem ser ignoradas com segurança?
Editar
Então, muitas vezes vejo regras como estas, que funcionam bem para mim:
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NOVO, ESTABELECIDO -j ACEITA $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state ESTABELECIDO -j ACEITA
Troquei "-m state --state" por "-m conntrack --ctstate", pois a correspondência de estado é aparentemente obsoleta.
É uma prática recomendada ter regras genéricas de rastreamento de estado? As regras acima não são consideradas corretas?
Para um controle rígido sobre as conexões de saída dos usuários, algo assim seria melhor?
$ IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED -j ACEITAR $ IPTABLES -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACEITAR $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner useraccount -j ACEITAR $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner otheraccount -j ACEITAR