Prinzipiell sollte man alle Ports zu machen, die nicht benoetigt werden. Ausserdem sollte man den rp_filter aktivieren
Code:
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
um den IP-Spoofing-Muell von vorherein zu unterbinden. Der Server sollte bei komischen ICMP-Nachrichten die Klappe halten.
Code:
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
Um die Systemerkennung zu erschweren, sollte man die Default-TTL auf einen anderen Wert setzen
Code:
echo 61 > /proc/sys/net/ipv4/ip_default_ttl
Und man sollte das Limit fuer SYN- und SYN/ACK-Pakete beim Verbindungsaufbau etwas verringern.
Code:
echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
. Damit sollte der Server auch gegen die schlimmsten Flooder einigermassen geschuetzt sein. Eine fertige Firewall, fuer einen Rootserver, der nur SSH und HTTP nach aussen laesst, koennte wie folgt aussehen:
Code:
#!/bin/bash
echo "Starting firewall"
LOGLIMIT=20
IPTABLES=/usr/sbin/iptables
case "$1" in
start)
# alle alten Regeln entfernen
echo "Loesche alte Regeln"
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
### ERSTELLE NEUE KETTEN ###
echo "Erstelle neue Ketten"
# Kette zum Loggen verworfener Pakete
$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 "Unterbinde Broadcast-Pings"
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# halt die Klappe bei komischen ICMP Nachrichten
echo "Aktiviere Bogus ICMP Message Protection"
echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# aktiviere SYN Flood Protection
echo "Aktiviere SYN FLOOD Protection"
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Kicke den ganzen IP Spoofing Shit
# (Source-Validierung anschalten)
echo "Unterbinde IP Spoofing Attacken"
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
# Setze Default-TTL auf 61 (Default fuer Linux ist 64)
echo "Setze Default-TTL auf 61"
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. 30 secs auf ein FIN/ACK
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# unterbreche Verbindungsaufbau nach 3 SYN-Paketen
# Default ist 6
echo 3 > /proc/sys/net/ipv4/tcp_syn_retries
# unterbreche Verbindungsaufbau nach 3 SYN/ACK-Paketen
# Default ist 6
echo 3 > /proc/sys/net/ipv4/tcp_synack_retries
### MAIN PART ###
echo "Setze Default-Policy auf DROP"
# erstmal jeglichen Input verwerfen, was wir zulassen, kommt gleich :)
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
# Output muessen wir natuerlich zulassen und stellt ja auch keine Gefahr dar
# Angreifer kommen ja meist von aussen bei Webservern
$IPTABLES -P OUTPUT ACCEPT
# bereits bestehende Verbindungen sollen nicht durchs starten der Firewall
# geschlossen werden
$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
# erlaube SSH
echo "Aktiviere SSH"
$IPTABLES -A INPUT -p tcp --dport 22 --tcp-flags ALL SYN -j ACCEPT
# Webserver
echo "Aktiviere Webserver"
$IPTABLES -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
# Alle TCP Packete, die bis hier hin kommen, werden
# geloggt und rejected
# Der Rest wird eh per Default Policy gedroppt...
$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
In deinem Fall musst du natuerlich noch den SSH-Port aendern. Das ganze als init.d-Skript in die richtigen Runlevel verlinkt, und du hast eine grundlegende Firewall, die auf einem Rootserver recht gute Dienste leisten sollte. Zumindest tut sie es bei mir seit geraumer Zeit auf mehreren Rootservern.
Nachtrag: Mit aide --check, solltest du regelmaessig ueberpruefen, welche Dateien sich geaendert haben, dabei solltest du aber die Verzeichnisse /var und /tmp von vornherein garnicht erst beim --init mit reinnehmen, siehe dazu die aide.conf.