PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptables - verworfene Pakete loggen



Cerox
29.12.05, 20:41
Hallo zusammen,

ich muss euch mal wieder mit meinem iptables Script nerven; ich habe dazu zwei Fragen.

Erstmal das Script:


#iptables-Script

#Routing aktivieren
echo "1" > /proc/sys/net/ipv4/ip_forward

#TCP Syncookies aktivieren
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#RST bei vollem Buffer senden
echo "1" > /proc/sys/net/ipv4/tcp_abort_on_overflow

#TCP FIN,ACK Timeout
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

#Verbindungsaufbau nach 3 SYN-Anfragen unterbrechen
echo "3" > /proc/sys/net/ipv4/tcp_syn_retries

#Keine Redirection
echo "0" > /proc/sys/net/ipv4/conf/eth0/accept_redirects

#ICMP Broadcasts ignorieren
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#Alle Regeln löschen
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

#Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Loopback-Kommunikation immer erlauben
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#ICMP eingehend
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-request -j ACCEPT

#ICMP ausgehend
iptables -A OUTPUT -p icmp -j ACCEPT

#Hergestellte Verbindungen eingehend zulassen
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#SSH von außen zulassen
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#Ausgehende Services zulassen
iptables -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

#DNS Anfragen zulassen
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

#Registered Ports nach außen zulassen
iptables -A OUTPUT -p tcp --dport 1024:49151 -j ACCEPT
iptables -A OUTPUT -p udp --dport 1024:49151 -j ACCEPT

#Logge unzulässige Pakete
iptables -A INPUT -j LOG -m limit --limit 5/s --log-prefix "INPUT-DROP: "
iptables -A FORWARD -j LOG -m limit --limit 5/s --log-prefix "FORWARD-DROP: "
iptables -A OUTPUT -j LOG -m limit --limit 5/s --log-prefix "OUTPUT-DROP: "


1. Ist das Script so als sicher zu betrachten? Ich muss leider die Registered Ports nach außen hin zulassen. Der Grund dafür ist Passive FTP. Passive FTP benötigt nach außen zum Server eine Verbindung mit einem Port > 1024; das zeigen auch die Packetsniffer wie Ethereal - kann ich das noch begrenzen auf eine bestimmte Portrange?

2. Die Policies stehen alle auf DROP; d.h nach dem Durchlaufen der Regeln, wird alles gedroppt, was nicht erlaubt wurde. Das wollte ich dann am Ende des Scriptes noch vorher loggen mit


iptables -A INPUT -j LOG -m limit --limit 5/s --log-prefix "INPUT-DROP: "
iptables -A FORWARD -j LOG -m limit --limit 5/s --log-prefix "FORWARD-DROP: "
iptables -A OUTPUT -j LOG -m limit --limit 5/s --log-prefix "OUTPUT-DROP: "

Naja das funktioniert leider nicht so ganz, die Meldungen tauchen weder in /var/log/messages noch in /var/log/firewall auf. Wo werden sie standardmäßig gespeichert und wie kann ich das in eine extra Datei loggen?

derRichard
29.12.05, 20:50
hallo!

du hast iptables nicht verstanden.
das log-target loggt nur pakete, die auch in die angegebene chain treffen.

wenn du alle verworfenen pakete auf input loggen willst, dann musst das so machen:

iptables -N MEIN_DROP
iptables -A MEIN_DROP -j LOG -m limit --limit 5/s --log-prefix "INPUT-DROP: "
iptables -A -j DROP
...
iptables -A INPUT -j MEIN_DROP

dein iptables-skript würde ich als nicht besonders gut bezeichnen.
du solltest schon stateful filtern.

www.netfilter.org ist dein freund. :D

hth,
//richard

Cerox
29.12.05, 21:36
Also jetzt habe ich das so:



#iptables-Script

#Routing aktivieren
echo "1" > /proc/sys/net/ipv4/ip_forward

#TCP Syncookies aktivieren
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#RST bei vollem Buffer senden
echo "1" > /proc/sys/net/ipv4/tcp_abort_on_overflow

#TCP FIN,ACK Timeout
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

#Verbindungsaufbau nach 3 SYN-Anfragen unterbrechen
echo "3" > /proc/sys/net/ipv4/tcp_syn_retries

#Keine Redirection
echo "0" > /proc/sys/net/ipv4/conf/eth0/accept_redirects

#ICMP Broadcasts ignorieren
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#Alle Regeln löschen
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F DROPKETTE
iptables -X DROPKETTE

#Policies setzen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Loopback-Kommunikation immer erlauben
iptables -A INPUT -i lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -o lo -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

#Logging-Kette
iptables -N DROPKETTE
iptables -A DROPKETTE -j LOG -m limit --limit 5/s --log-prefix "INPUT-DROP:"
iptables -A DROPKETTE -j DROP

#ICMP eingehend
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type timestamp-request -j ACCEPT

#ICMP ausgehend
iptables -A OUTPUT -p icmp -j ACCEPT

#Hergestellte Verbindungen eingehend zulassen
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#SSH von außen zulassen
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#Ausgehende Services zulassen
iptables -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

#DNS Anfragen zulassen
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

#Registered Ports nach außen zulassen
iptables -A OUTPUT -p tcp --dport 1024:49151 -j ACCEPT
iptables -A OUTPUT -p udp --dport 1024:49151 -j ACCEPT

#Unzulässige Pakete loggen
iptables -A INPUT -j DROPKETTE
iptables -A FORWARD -j DROPKETTE
iptables -A OUTPUT -j DROPKETTE

Es funktioniert jetzt, in /var/log/firewall werden die Pakete geloggt.

Wie kann das direkt in eine andere Datei umleiten (ohne einen Cronjob der die Nachrichten aus der Datei ständig daraus holt).

Eine Verständnisfrage: Was macht es für einen Unterschied so, dass nun die Pakete in die benutzerdefinierte Kette wandern und dort geloggt sowie gedropt werden.

Vorher wurden sie doch auch am Ende, wenn keine Regel zutrifft, geloggt bzw. so sollte es sein (es ging ja so nicht) - die Policy verwirft es dann doch auch.


du solltest schon stateful filtern.

Und wie mache ich das bitte?

Was ist sonst unsicher?

derRichard
29.12.05, 21:46
hallo!

lies doch bitte die docu zu netfilter.
da hast ein gutes beispiel für stateful filtern:
http://www.martin-bock.de/pc/pc-0210.html

das log-target loggt nur in den kernel-ausgabebuffer.
mit syslog kann man den abfragen und die netfilter-sachen rausfiltern und in eine logfile abspeichern.

besser gehts mit ulog, damit kann man direkt in den userspace loggen.
http://www.gnumonks.org/projects/
man kann diekt in dateien oder auch in datenbanken wie mysql loggen...

//richard

Cerox
29.12.05, 22:09
lies doch bitte die docu zu netfilter.
da hast ein gutes beispiel für stateful filtern:

Ja, in dem Beispiel werden aber genauso wie bei mir eingehende Verbindungen mit dem Status ESTABLISHED oder RELATED zugelassen.

Was ist daran so gefährlich oder wie sollte ich es filtern?

Ich dachte mir das so: Es werden nur Pakete angenommen, wo bereits eine hergestellte Verbindung besteht, d.h. diese Verbindung muss vorher durch mich aufgebaut werden, was wiederrum durch ausgehende Pakete passiert. NEW lasse ich ja von außen nicht zu außer bei bestimmten Diensten, wie bisher nur SSH.