Nel mio script iptables ho sperimentato la scrittura di regole il più finemente dettagliate possibile. Limito a quali utenti è consentito utilizzare quali servizi, in parte per motivi di sicurezza e in parte come esercizio di apprendimento.
Usare iptables v1.4.16.2 su Debian 6.0.6 con il kernel 3.6.2.
Tuttavia ho riscontrato un problema che ancora non capisco ...
porte in uscita per tutti gli utenti
Funziona perfettamente. Non ho regole di tracciamento dello stato generico.
## Porta in uscita 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate NUOVO, STABILITO -j ACCETTA $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate STTABLISHED -j ACCEPT
porte in uscita con corrispondenza dell'utente
## porta 80 in uscita per account utente $ IPTABLES -A OUTPUT --match owner --uid-owner useraccount -p tcp --dport 80 -m conntrack --ctstate NUOVO, STABILITO --sport 1024: 65535 -j ACCEPT $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate STTABLISHED -j ACCEPT
Ciò consente alla porta 80 di uscire solo per l'account "accountutente", ma le regole come questa per il traffico TCP presentano problemi.
## Registro in uscita predefinito + regole di blocco $ IPTABLES -A USCITA -j LOG --log-prefisso "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A OUTPUT -j DROP
Il problema
Quanto sopra funziona, l'utente "useraccount" può ottenere i file perfettamente bene. Nessun altro utente sul sistema può effettuare connessioni in uscita alla porta 80.
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
Ma la wget sopra lascia x7 voci rilasciate nel mio syslog:
18 ott 02:00:35 xxxx kernel: 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 FINESTRA = 979 RES = 0x00 ACK URGP = 0
Non ricevo queste gocce per regole simili con il traffico UDP. Sono già in atto regole che limitano gli utenti che possono effettuare richieste DNS.
I pacchetti ACK in uscita rilasciati sembrano provenire dall'account root (URGP = 0) che non capisco. Anche quando cambio account utente per root.
Credo che i pacchetti ACK siano classificati come nuovi perché conntrack inizia a tracciare le connessioni dopo il 3 ° passaggio dell'handshake a 3 vie, ma perché vengono eliminati?
Queste gocce possono essere tranquillamente ignorate?
modificare
Quindi vedo spesso regole come queste, che funzionano bene per me:
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NEW, STABILITO -j ACCEPT $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state STTABLISHED -j ACCEPT
Ho scambiato "-m state --state" con "-m conntrack --ctstate" poiché la corrispondenza dello stato è apparentemente obsoleta.
È buona norma disporre di regole generiche di tracciamento dello stato? Le regole di cui sopra non sono considerate corrette?
Per uno stretto controllo delle connessioni degli utenti in uscita sarebbe meglio qualcosa di simile?
$ IPTABLES -A INPUT -m conntrack --ctstate STTABLISHED -j ACCEPT $ IPTABLES -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m proprietario --uid-owner useraccount -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m proprietario --uid-owner altro account -j ACCEPT