PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Firewallskript - traceroute



Andre Mehlest
14.09.06, 11:39
Hallo,

ich habe mir mit Harry IP-Tables-Generator ein Firewall-Skript erstellt. Ich bin auch zufrieden, bloß funktioniert von Clients im Lan "traceroute" nicht. Ich bekomme immer ein Timeout. Was ist am Skript "falsch"?
Weitere Frage wäre, wie ich das lästige loggen von Portscans abstelle? Ich würde gerne nur die Portscans loggen, wenn auf einem Port auch ein Dienst läuft.

Vielen Dank!



case "$1" in
start)
echo "Starte IP-Paketfilter"

# iptables-Modul
modprobe ip_tables
# Connection-Tracking-Module
modprobe ip_conntrack
# Das Modul ip_conntrack_irc ist erst bei Kerneln >= 2.4.19 verfuegbar
modprobe ip_conntrack_irc
modprobe ip_conntrack_ftp

# Tabelle flushen
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X

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

# MY_REJECT-Chain
iptables -N MY_REJECT

# MY_REJECT fuellen
iptables -A MY_REJECT -p tcp -m limit --limit 7200/h -j LOG --log-prefix "REJECT TCP "
iptables -A MY_REJECT -p tcp -j REJECT --reject-with tcp-reset
iptables -A MY_REJECT -p udp -m limit --limit 7200/h -j LOG --log-prefix "REJECT UDP "
iptables -A MY_REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
iptables -A MY_REJECT -p icmp -m limit --limit 7200/h -j LOG --log-prefix "DROP ICMP "
iptables -A MY_REJECT -p icmp -j DROP
iptables -A MY_REJECT -m limit --limit 7200/h -j LOG --log-prefix "REJECT OTHER "
iptables -A MY_REJECT -j REJECT --reject-with icmp-proto-unreachable

# MY_DROP-Chain
iptables -N MY_DROP
iptables -A MY_DROP -m limit --limit 7200/h -j LOG --log-prefix "PORTSCAN DROP "
iptables -A MY_DROP -j DROP

# Alle verworfenen Pakete protokollieren
iptables -A INPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "INPUT INVALID "
iptables -A OUTPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "OUTPUT INVALID "
iptables -A FORWARD -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "FORWARD INVALID "

# Korrupte Pakete zurueckweisen
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP

# Stealth Scans etc. DROPpen
# Keine Flags gesetzt
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ALL NONE -j MY_DROP

# SYN und FIN gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP

# SYN und RST gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP

# FIN und RST gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP

# FIN ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP

# PSH ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP

# URG ohne ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j MY_DROP
iptables -A FORWARD -p tcp --tcp-flags ACK,URG URG -j MY_DROP

# Loopback-Netzwerk-Kommunikation zulassen
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Maximum Segment Size (MSS) fr das Forwarding an PMTU anpassen
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Connection-Tracking aktivieren
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ! ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# HTTP
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 80 -j ACCEPT

# HTTPS
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 443 -j ACCEPT

# SSH
iptables -A INPUT -i ppp0 -m state --state NEW -p tcp --dport 22 -j ACCEPT

# ICMP Echo-Request (ping) zulassen und beantworten
iptables -A INPUT -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT

# LAN-Zugriff auf eth0
iptables -A INPUT -m state --state NEW -i eth0 -j ACCEPT

# Default-Policies mit REJECT
iptables -A INPUT -j MY_REJECT
iptables -A OUTPUT -j MY_REJECT
iptables -A FORWARD -j MY_REJECT

# Forwarding/Routing
echo "Aktiviere IP-Routing"
echo 1 > /proc/sys/net/ipv4/ip_forward 2> /dev/null

# Masquerading
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# SYN-Cookies
echo 1 > /proc/sys/net/ipv4/tcp_syncookies 2> /dev/null

# Stop Source-Routing
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/accept_source_route 2> /dev/null; done

# Stop Redirecting
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/accept_redirects 2> /dev/null; done

# Reverse-Path-Filter
for i in /proc/sys/net/ipv4/conf/*; do echo 2 > $i/rp_filter 2> /dev/null; done

# Log Martians
for i in /proc/sys/net/ipv4/conf/*; do echo 1 > $i/log_martians 2> /dev/null; done

# BOOTP-Relaying ausschalten
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/bootp_relay 2> /dev/null; done

# Proxy-ARP ausschalten
for i in /proc/sys/net/ipv4/conf/*; do echo 0 > $i/proxy_arp 2> /dev/null; done

# Ungltige ICMP-Antworten ignorieren
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 2> /dev/null

# ICMP Echo-Broadcasts ignorieren
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 2> /dev/null

# Max. 500/Sekunde (5/Jiffie) senden
echo 5 > /proc/sys/net/ipv4/icmp_ratelimit

# Speicherallozierung und -timing fr IP-De/-Fragmentierung
echo 262144 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 196608 > /proc/sys/net/ipv4/ipfrag_low_thresh
echo 30 > /proc/sys/net/ipv4/ipfrag_time

# TCP-FIN-Timeout zum Schutz vor DoS-Attacken setzen
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

# Maximal 3 Antworten auf ein TCP-SYN
echo 3 > /proc/sys/net/ipv4/tcp_retries1

# TCP-Pakete maximal 15x wiederholen
echo 15 > /proc/sys/net/ipv4/tcp_retries2

;;

stop)
echo "Stoppe IP-Paketfilter"
# Tabelle flushen
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
echo "Deaktiviere IP-Routing"
echo 0 > /proc/sys/net/ipv4/ip_forward

# Default-Policies setzen
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
;;

status)
echo "Tabelle filter"
iptables -L -vn
echo "Tabelle nat"
iptables -t nat -L -vn
echo "Tabelle mangle"
iptables -t mangle -L -vn
;;

*)
echo "Fehlerhafter Aufruf"
echo "Syntax: $0 {start|stop|status}"
exit 1
;;

esac

Apoll
14.09.06, 14:56
Ohne das jetzt testen zu können:
Kommentiere alle Zeilen aus, die mit ICMP zu tun haben und lade die Konfigurationsdatei des Paketfilters neu.

Beim traceroute schickt der Client ICMP-Pakete mit inkrementierendem TTL aus. Da ICMP beim Paketfilter gedropt wird, kommt das Paket nicht durch.

Zur zweiten Frage:
'portsentry' müsste das können.

Andre Mehlest
14.09.06, 22:08
Habe alle zeilen mit icmp auskommentiert und das skript neu gestartet. leider ohne erfolg...

Apoll
14.09.06, 22:37
Sind die Clients, von denen Du den traceroute startest Windows, oder UNIX Maschinen?

Andre Mehlest
17.09.06, 10:45
Unix, Windows funktioniert auch bei aktivierten ICMP-Einträgen.

d1keue
18.09.06, 16:35
Hallo,

Traceroute - Linux benutzt u.U kein ICMP !!

r00t043
18.09.06, 19:54
Hallo,

Traceroute - Linux benutzt u.U kein ICMP !!
Belege?


20:32:33.079668 IP xxx > redirector.heise.de.33435: UDP, length 12
20:32:33.080506 IP xxx > xxx: ICMP time exceeded in-transit, length 48
20:32:33.185024 IP xxx > redirector.heise.de.33436: UDP, length 12
20:32:33.186351 IP xxx > xxx: ICMP time exceeded in-transit, length 48
20:32:33.186412 IP xxx > redirector.heise.de.33437: UDP, length 12
20:32:33.186791 IP xxx > xxx: ICMP time exceeded in-transit, length 48
20:32:33.186848 IP xxx > redirector.heise.de.33438: UDP, length 12


Meins macht zwar UDP Anfragen, wertet aber die ICMP Packete aus, die es als Antwort gibt. Steht so uebrigens auch in der manpage.

Da ja alle Chains DROP als default Policy haben, musst du zwei Regelen schreiben die diesen Typ von ICMP Paketen und die UDP Pakete explezit erlauben.

Andre Mehlest
18.09.06, 21:37
Wie würde denn eine Regel aussehen, um diese ICMP-Pakete zu erlauben?

Harry
23.09.06, 12:09
Hi Andre,

Du benötigst keine weitere zusätzliche Regel im Skript, damit traceroute bzw. tracert (Windows) funktioniert. Der Paketfilter ist über das Connection-Tracking bereits so konfiguriert, dass die gesendeten Datagramme und die Antworten auf diese durchgelassen werden.
Wenn Du einen timeout erhältst, deutet das eher darauf hin, dass einer der Paket-vermittelnden Router im Internet entweder UDP und/oder ICMP zum Teil filtert.

Harry

Ohr4u|tux
26.09.06, 19:13
Funktioniert es denn vom Router aus problemlos?

Andre Mehlest
29.09.06, 00:10
Hi Andre,

Du benötigst keine weitere zusätzliche Regel im Skript, damit traceroute bzw. tracert (Windows) funktioniert. Der Paketfilter ist über das Connection-Tracking bereits so konfiguriert, dass die gesendeten Datagramme und die Antworten auf diese durchgelassen werden.
Wenn Du einen timeout erhältst, deutet das eher darauf hin, dass einer der Paket-vermittelnden Router im Internet entweder UDP und/oder ICMP zum Teil filtert.

Harry

Vom Router aus funktioniert es problemlos. Wenn ich von einem Client hinter dem Router diese Funktion nutzen möchte funktioniert es nicht. Ich bekomme das Timeout immer nur bei meinem Router, auf dem das Skript läuft.