In meinem iptables-Skript habe ich versucht, so feinkörnige Regeln wie möglich zu schreiben. Ich beschränke mich darauf, welche Benutzer welche Dienste nutzen dürfen, teils aus Sicherheitsgründen, teils als Lernübung.
Verwenden von iptables v1.4.16.2 unter Debian 6.0.6 unter Ausführen des 3.6.2-Kernels.
Ich bin jedoch auf ein Problem gestoßen, das ich noch nicht ganz verstehe.
ausgehende Ports für alle Benutzer
Das funktioniert einwandfrei. Ich habe keine allgemeinen Statusverfolgungsregeln.
## Ausgehender Port 81 $ IPTABLES -A OUTPUT -p tcp --dport 81 -m conntrack --ctstate NEU, GEGRÜNDET -j AKZEPTIEREN $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
ausgehende Ports mit Benutzeranpassung
## ausgehender Port 80 für Benutzerkonto $ IPTABLES -A OUTPUT - Match-Besitzer - UID-Besitzer Benutzerkonto -p TCP --dport 80 -m Conntrack --ctstate NEU, GEGRÜNDET --sport 1024: 65535 -j AKZEPTIEREN $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
Dadurch kann Port 80 nur für das Konto "Benutzerkonto" ausgegeben werden, aber Regeln wie diese für den TCP-Verkehr haben Probleme.
## Standardregeln für ausgehende Protokolle + Blockierungen $ IPTABLES -A OUTPUT -j LOG --log-Präfix "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A OUTPUT -j DROP
Die Angelegenheit
Das obige funktioniert, der Benutzer "Benutzerkonto" kann Dateien einwandfrei erhalten. Kein anderer Benutzer im System kann ausgehende Verbindungen zu Port 80 herstellen.
Benutzerkonto @ Host: $ wget http://cachefly.cachefly.net/10mb.test
Aber das obige Wget hinterlässt x7 abgelegte Einträge in meinem Syslog:
18. Oktober 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 WINDOW = 979 RES = 0x00 ACK URGP = 0
Ich bekomme diese Drops nicht für ähnliche Regeln mit UDP-Verkehr. Ich habe bereits Regeln festgelegt, die einschränken, welche Benutzer DNS-Anfragen stellen können.
Die verworfenen ausgehenden ACK-Pakete scheinen vom Root-Konto (URGP = 0) zu stammen, was ich nicht verstehe. Auch wenn ich das Benutzerkonto gegen root tausche.
Ich glaube, dass ACK-Pakete als neu eingestuft werden, da conntrack nach dem dritten Schritt des 3-Wege-Handshakes beginnt, Verbindungen zu verfolgen, aber warum werden die Pakete verworfen?
Können diese Tropfen ignoriert werden?
Bearbeiten
Daher sehe ich oft Regeln wie diese, die für mich gut funktionieren:
$ IPTABLES -A OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NEW, ESTABLISHED -j ACCEPT $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state ESTABLISHED -j ACCEPT
Ich habe "-m state --state" gegen "-m conntrack --ctstate" getauscht, da die Statusübereinstimmung anscheinend veraltet ist.
Ist es eine bewährte Methode, allgemeine Regeln für die Statusverfolgung zu haben? Werden die oben genannten Regeln nicht als korrekt angesehen?
Wäre so etwas für eine strenge Kontrolle über ausgehende Benutzerverbindungen besser?
$ 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 Eigentümer --uid-Eigentümer Benutzerkonto -j AKZEPTIEREN $ IPTABLES -A OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m Eigentümer --uid-Eigentümer otheraccount -j ACCEPT