Dans mon script iptables, j'ai expérimenté l'écriture de règles aussi fines que possible. Je limite les utilisateurs autorisés à utiliser quels services, en partie pour des raisons de sécurité et en partie comme exercice d'apprentissage.
Utiliser iptables v1.4.16.2 sur Debian 6.0.6 exécutant le noyau 3.6.2.
Cependant, j'ai rencontré un problème que je ne comprends pas encore ...
ports sortants pour tous les utilisateurs
Cela fonctionne parfaitement bien. Je n'ai pas de règles de suivi d'état génériques.
## Port sortant 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate NOUVEAU, ÉTABLI -j ACCEPTER $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
ports sortants avec correspondance utilisateur
## port sortant 80 pour compte d'utilisateur $ IPTABLES -A OUTPUT --match owner --uid-owner useraccount -p tcp --dport 80 -m conntrack --ctstate NOUVEAU, ÉTABLI --sport 1024: 65535 -j ACCEPT $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
Cela autorise le port 80 à sortir uniquement pour le compte "compte d'utilisateur", mais des règles comme celle-ci pour le trafic TCP ont des problèmes.
## Journal sortant par défaut + règles de blocage $ IPTABLES -A OUTPUT -j LOG --log-prefix "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A SORTIE -j DROP
Le problème
Ce qui précède fonctionne, l'utilisateur "useraccount" peut obtenir des fichiers parfaitement bien. Aucun autre utilisateur du système ne peut établir de connexions sortantes avec le port 80.
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
Mais le wget ci-dessus laisse x7 entrées perdues dans mon syslog:
18 octobre 02:00:35 noyau xxxx: MAUVAIS SORTIE EN = SORTIE = 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 WINDOW = 979 RES = 0x00 ACK URGP = 0
Je ne reçois pas ces baisses pour des règles similaires avec le trafic UDP. J'ai déjà des règles en place qui limitent les utilisateurs qui peuvent effectuer des requêtes DNS.
Les paquets ACK sortants abandonnés semblent provenir du compte root (URGP = 0) que je ne comprends pas. Même lorsque j'échange le compte utilisateur pour root.
Je crois que les paquets ACK sont classés comme nouveaux parce que conntrack commence à suivre les connexions après la 3e étape de la prise de contact à 3 voies, mais pourquoi sont-ils abandonnés?
Ces gouttes peuvent-elles être ignorées en toute sécurité?
Éditer
Je vois donc souvent des règles comme celles-ci, qui fonctionnent bien pour moi:
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NOUVEAU, ÉTABLI -j ACCEPTER $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state ESTABLISHED -j ACCEPT
J'ai remplacé "-m state --state" par "-m conntrack --ctstate" car la correspondance d'état est apparemment obsolète.
Est-il préférable d'avoir des règles de suivi d'état génériques? Les règles ci-dessus ne sont-elles pas considérées comme correctes?
Pour un contrôle strict des connexions des utilisateurs sortants, quelque chose comme ça serait-il mieux?
$ IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED -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 owner --uid-owner useraccount -j ACCEPT $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner otheraccount -j ACCEPT