theton
Bitmuncher
Ich habe hier die Administration eines Serverschranks übernommen, dessen einzelne Komponenten über einen der Server ins Internet geroutet werden. Leider ist darauf (bisher) eine Firewall mit ca. 27 Seiten Regelsätzen für die IPTables (SuSE-Firewall) die ich jetzt ein wenig abspecken will. Ausserdem sieht bei der Firewall nicht mal mehr der alte Admin durch. Dazu habe ich ein neues Script geschrieben, das soweit auch einigermaßen funktioniert, allerdings haben einige Service der Server, wenn ich dieses Script starte, plötzlich sehr lange Antwortzeiten, die ich mir nicht erklären kann. Vor allem deswegen, weil es sich nur um POP3, SMTP und MySQL-Server handelt, wo die Antwortzeiten plötzlich sehr lang werden, während die Webserver weiterhin zügig ihre Daten ausliefern.
Hier mal das Script:
Der Firewall-Rechner, auf dem die mit diesem Script aufgebaute Firewall laufen soll, sieht wie folgt aus:
Das Interface eth1 zeigt ins interne Netzwerk (IP: 192.168.1.1). Für eth0 gibt es mehrere virtuelle Interfaces, die die externen IPs der einzelnen Racks enthalten (z.B. eth0:1 -> 123.123.123.123, eth0:2 -> 123.123.123.124 usw.). Wie dem Script ja zu entnehmen ist, werden die externen IPs einfach auf die internen umgelegt. Jeder der Rechner hat dann noch eine eigene Firewall, die die Port-Freigabe regelt. Mit diesen Firewalls gibt es keine Probleme, was ich daran merke, dass die Timeouts weg sind, sobald ich die alte Firewall auf dem Router wieder neu starte.
Kann sich vielleicht jemand erklären, woher die hohen Antwortzeiten kommen könnten? Ich mit mit meinem Latein langsam am Ende.
Hier mal das Script:
Code:
#!/bin/bash
echo "Starting firewall"
LOGLIMIT=20
IPTABLES=/usr/sbin/iptables
# albatros
IP_INT_ALBATROS=192.168.1.2
IP_EXT_ALBATROS=123.123.123.123
# columba
IP_INT_COLUMBA=192.168.1.3
IP_EXT_COLUMBA=123.123.123.124
# falco
IP_INT_FALCO=192.168.1.4
IP_EXT_FALCO=123.123.123.125
# corax
IP_INT_CORAX=192.168.1.5
IP_EXT_CORAX=123.123.123.126
# intergerma
IP_INT_INTERGERMA=192.168.1.101
IP_EXT_INTERGERMA=123.123.123.127
# Switch
IP_INT_SWITCH=192.168.1.253
IP_EXT_SWITCH=123.123.123.128
# UPS
IP_INT_UPS=192.168.1.254
IP_EXT_UPS=123.123.123.129
case "$1" in
start)
# alle alten Regeln entfernen
echo "Loesche alte Regeln und Ketten"
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
###### Erstellen neuer Ketten ############
echo "Neue Ketten werden erstellt"
# Kette Kette fuers Logging und REJECT
# $IPTABLES -N LOGREJECT
# $IPTABLES -A LOGREJECT -m limit --limit $LOGLIMIT/minute -j LOG --log-prefix "FIREWALL REJECT " --log-level notice --log-ip-options --log-tcp-options
# $IPTABLES -A LOGREJECT -j REJECT --reject-with-icmp-port-unreachable
######## /proc-Manipulation #########
# auf Broadcast-Pings nicht antworten
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# halt die Klappe bei komischen ICMP-Nachrichten
echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Aktiviere SYN Flood Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Source-Validierung - Kicke den ganzen IP Spoofing Shit
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# Setze Default-TTL auf 61 (Default: 64)
echo 61 > /proc/sys/net/ipv4/ip_default_ttl
# Sende RST-Pakete wenn der Buffer voll ist
echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
# warte max. 30s auf ein FIN/ACK
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# unterbreche Verbindungsaufbau nach 3 SYN-Paketen (Default: 6)
echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
# unterbreche Verbindungsaufbau nach 3 SYN/ACK-Paketen (Default: 6)
echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
###### MAIN PART ##########
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
# ausgehende Verbindungen erlauben
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# bereits bestehende Verbindungen weiterhin akzeptieren
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# im Loopback koennen wir jedem trauen
$IPTABLES -A INPUT -i lo -j ACCEPT
# erlaube Pings
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Forwarding fuer alle Rechner im Schrank
# 192.168.1.2 <-> 213.160.80.36 --> albatros
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_ALBATROS -o eth0 -j SNAT --to-source $IP_EXT_ALBATROS
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_ALBATROS -o eth1 -j SNAT --to-source $IP_EXT_ALBATROS
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_ALBATROS -j DNAT --to-destination $IP_INT_ALBATROS
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_ALBATROS -j DNAT --to-destination $IP_INT_ALBATROS
# 192.168.1.3 <-> 213.160.80.37 --> columba
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_COLUMBA -o eth0 -j SNAT --to-source $IP_EXT_COLUMBA
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_COLUMBA -o eth1 -j SNAT --to-source $IP_EXT_COLUMBA
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_COLUMBA -j DNAT --to-destination $IP_INT_COLUMBA
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_COLUMBA -j DNAT --to-destination $IP_INT_COLUMBA
# 192.168.1.4 <-> 213.160.80.38 --> falco
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_FALCO -o eth0 -j SNAT --to-source $IP_EXT_FALCO
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_FALCO -o eth1 -j SNAT --to-source $IP_EXT_FALCO
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_FALCO -j DNAT --to-destination $IP_INT_FALCO
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_FALCO -j DNAT --to-destination $IP_INT_FALCO
# 192.168.1.5 <-> 213.160.80.39 --> corax
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_CORAX -o eth0 -j SNAT --to-source $IP_EXT_CORAX
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_CORAX -o eth1 -j SNAT --to-source $IP_EXT_CORAX
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_CORAX -j DNAT --to-destination $IP_INT_CORAX
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_CORAX -j DNAT --to-destination $IP_INT_CORAX
# 192.168.1.101 <-> 213.160.80.45 --> intergerma
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_INTERGERMA -o eth0 -j SNAT --to-source $IP_EXT_INTERGERMA
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_INTERGERMA -o eth1 -j SNAT --to-source $IP_EXT_INTERGERMA
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_INTERGERMA -j DNAT --to-destination $IP_INT_INTERGERMA
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_INTERGERMA -j DNAT --to-destination $IP_INT_INTERGERMA
# 192.168.1.253 <-> 213.160.80.61 --> switch
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_SWITCH -o eth0 -j SNAT --to-source $IP_EXT_SWITCH
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_SWITCH -o eth1 -j SNAT --to-source $IP_EXT_SWITCH
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_SWITCH -j DNAT --to-destination $IP_INT_SWITCH
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_SWITCH -j DNAT --to-destination $IP_INT_SWITCH
# 192.168.1.254 <-> 213.160.80.62 --> UPS
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_UPS -o eth0 -j SNAT --to-source $IP_EXT_UPS
$IPTABLES -t nat -A POSTROUTING -s $IP_INT_UPS -o eth1 -j SNAT --to-source $IP_EXT_UPS
$IPTABLES -t nat -A PREROUTING -i eth0 -d $IP_EXT_UPS -j DNAT --to-destination $IP_INT_UPS
$IPTABLES -t nat -A PREROUTING -i eth1 -d $IP_EXT_UPS -j DNAT --to-destination $IP_INT_UPS
############ Stuff fuer Phoenix ############
# erlaube Pings
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Port-Freigaben fuer phoenix
# SSH
$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
# DNS
$IPTABLES -A INPUT -p tcp --dport 53 -j ACCEPT
# alles andere loggen und REJECT
# $IPTABLES -A INPUT -p tcp -j LOGREJECT
# $IPTABLES -A FORWARD -p tcp -j LOGREJECT
;;
*)
echo "Usage: `basename $0` {start}" >&2
exit 64
;;
esac
exit 0
Der Firewall-Rechner, auf dem die mit diesem Script aufgebaute Firewall laufen soll, sieht wie folgt aus:
Das Interface eth1 zeigt ins interne Netzwerk (IP: 192.168.1.1). Für eth0 gibt es mehrere virtuelle Interfaces, die die externen IPs der einzelnen Racks enthalten (z.B. eth0:1 -> 123.123.123.123, eth0:2 -> 123.123.123.124 usw.). Wie dem Script ja zu entnehmen ist, werden die externen IPs einfach auf die internen umgelegt. Jeder der Rechner hat dann noch eine eigene Firewall, die die Port-Freigabe regelt. Mit diesen Firewalls gibt es keine Probleme, was ich daran merke, dass die Timeouts weg sind, sobald ich die alte Firewall auf dem Router wieder neu starte.
Kann sich vielleicht jemand erklären, woher die hohen Antwortzeiten kommen könnten? Ich mit mit meinem Latein langsam am Ende.