Tools:IP-Filter
Archiv: Dieser Artikel beschreibt nicht die Funktionalität des derzeit aktuellen delixs-Servers. Er beschreibt ältere Schulserver-Funktionen und dient dem Zweck der Archivierung. |
Erläuterung der Datei /etc/init.d/ipfilter
echo -n "Starte IP-Filter Firewall:" # Tabellen löschen, Defaultwerte einsetzen $IPTABLES_BIN -t mangle -F $IPTABLES_BIN -t mangle -X $IPTABLES_BIN -F $IPTABLES_BIN -X
Die Haupt- und Mangle-Tabelle (Für eigene Tabellen) werden geleert.
$IPTABLES_BIN -P INPUT DROP $IPTABLES_BIN -P FORWARD DROP $IPTABLES_BIN -P OUTPUT ACCEPT
Hier sind die Defaults: Input auf Drop (alles verbieten, was nicht frei-
gegeben ist), Forward auf Drop aber Output auf offen (alles rausschicken,
was nicht verboten ist). Dahinter steckt eine Politik: Muss Arktur eine
Verbindung öffnen, ist der Status der zu empfangenden Pakete auf
"Related", also zu einer Verbindung gehörig. Daher erkennt der Server,
welche Pakete er durchlassen sollte.
# Hilfsfunktion: REJECT in Abhängigkeit vom Protokoll $IPTABLES_BIN -N reject_fkt $IPTABLES_BIN -A reject_fkt -p tcp -j REJECT --reject-with tcp-reset $IPTABLES_BIN -A reject_fkt -p udp -j REJECT --reject-with icmp-port-unreachable $IPTABLES_BIN -A reject_fkt -j REJECT --reject-with icmp-proto-unreachable
Wie im Kommentar angegeben: Wird ein Paket zurückgewiesen, wird es nicht
einfach gedropt. Die korrekte Arbeitsweise ist, eine icmp-Nachricht zu senden:
Port ist geschlossen. Das spart bei korrekter Arbeitsweise Zeit. Ich kenne
viele Leute, die ICMP als "böse" deklarieren und abwürgen. Dann muss jede
Verbindung den Timeout abwarten, bis der Dienst als "nicht verfügbar"
abgewiesen wird.
# 1. Lokales Netz zulassen $IPTABLES_BIN -t filter -A INPUT -i lo -j ACCEPT $IPTABLES_BIN -t filter -A OUTPUT -o lo -j ACCEPT
Localhost ist Interface lo (=127.0.0.1) und darf alles - denn es bleibt im
Server. Sonst würde die lokale Kommunikation geblockt.
$IPTABLES_BIN -t filter -A INPUT -s 192.168.0.0/16 -j ACCEPT $IPTABLES_BIN -t filter -A INPUT -s 10.0.0.0/8 -j ACCEPT $IPTABLES_BIN -t filter -A INPUT -s 172.16.0.0/12 -j ACCEPT
Die Adressbereiche für lokale Netze werden freigegeben: Arktur nimmt
Anfragen entgegen (INPUT. OUTPUT ist ja offen)
# 2. Einzelne Dienste nach außen freigeben # Den SSH-Zugang freigeben [ "$ACCESS_SSH" = yes ] && $IPTABLES_BIN -t filter -A INPUT -p tcp --dport 22 -j ACCEPT # Den HTTP-Zugang freigeben [ "$ACCESS_HTTP" = yes ] && $IPTABLES_BIN -t filter -A INPUT -p tcp --dport 80 -j ACCEPT # Den FTP-Zugang freigeben [ "$ACCESS_FTP" = yes ] && $IPTABLES_BIN -t filter -A INPUT -p tcp --dport 21 -j ACCEPT # und bestehende Verbindungen akzeptieren $IPTABLES_BIN -t filter -A INPUT -j ACCEPT -m state --state RELATED,ESTABLISHED
# Um Ping kümmern [ "$ENABLE_ICMP" = yes ] && $IPTABLES_BIN -t filter -A INPUT -p icmp -s 0.0.0.0/0 -j ACCEPT
Die Schalter aus dem Sysadm Menü abfragen und umsetzen.
# Diese Ports sperren $IPTABLES_BIN -t filter -A INPUT -p tcp -s 0.0.0.0/0 --dport 0:1024 -j reject_fkt $IPTABLES_BIN -t filter -A INPUT -p udp -s 0.0.0.0/0 --dport 0:1024 -j reject_fkt
Die Ports 0-1024 sind root-Ports und werden geschlossen, damit niemand
hier zusätzliche Dienste anbinden kann.
$IPTABLES_BIN -t filter -A INPUT -p tcp -s 0.0.0.0/0 --dport 8080 -j reject_fkt $IPTABLES_BIN -t filter -A INPUT -p tcp -s 0.0.0.0/0 --dport 10000 -j reject_fkt
Die Ports 8080 (Squid-Proxy) und 10000 (Webmin, falls genutzt) werden
nach außen geschlossen.
$IPTABLES_BIN -t filter -A INPUT -m state --state NEW -j reject_fkt
.. und Pakete mit Status "New" werden von außen abgewiesen (sofern sie nicht durch eine der davor stehenden Regeln durchgelassen werden).
# Und reines forward nur im lokalen Netz zulassen (NAT kommt anders) # Dabei die Ports 80, 3128 und 8080 sperren, damit beim Masquerading nichts # daneben geht. #$IPTABLES_BIN -t filter -A FORWARD -p tcp --dport 80 -j reject_fkt $IPTABLES_BIN -t filter -A FORWARD -p tcp --dport 3128 -j reject_fkt $IPTABLES_BIN -t filter -A FORWARD -p tcp --dport 8080 -j reject_fkt # Diese Ports benutzt ANON, ein Internet-Anonymizier $IPTABLES_BIN -t filter -A FORWARD -p tcp --dport 6544 -j reject_fkt $IPTABLES_BIN -t filter -A FORWARD -p tcp --dport 16544 -j reject_fkt $IPTABLES_BIN -t filter -A FORWARD -p tcp --dport 26544 -j reject_fkt $IPTABLES_BIN -t filter -A FORWARD -s 192.168.0.0/16 -j ACCEPT $IPTABLES_BIN -t filter -A FORWARD -s 172.16.0.0/12 -j ACCEPT $IPTABLES_BIN -t filter -A FORWARD -s 10.0.0.0/8 -j ACCEPT $IPTABLES_BIN -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Steht oben: Diese Pakete können in die FORWARD-Chain gehen. Danach setzt
Masquerading an. Hier müssen Deine Regeln eingebunden werden: Wenn also
Pakete von außen direkt an einen Rechner gehen sollen, muss eine FORWARD-
Regel eingebunden werden. Eventuell muss sogar das Masquerading unterbunden
werden.
# Sonderfunktionen zum Datendurchsatz $IPTABLES_BIN -A OUTPUT -j TOS -m state --state NEW,ESTABLISHED,RELATED -t mangle -p tcp --sport 53 --set-tos Minimize-Delay $IPTABLES_BIN -A OUTPUT -j TOS -m state --state NEW,ESTABLISHED,RELATED -t mangle -p udp --dport 53 --set-tos Minimize-Delay
Nameserveranfragen (Port 53) werden bevorzugt, also mit höherer Dringlichkeit
durchgeschickt. Wenn z.B. eine FTP-Verbindung die ganze Bandbreite zieht, aber
ein Client eine DNS-Anfrage hat, kommt die zuerst dran.
# Sonderfunktion: externes Interface $IPTABLES_BIN -N input_ext #$IPTABLES_BIN -A input_ext -j reject_fkt # Dann werden die externen Interfaces zugeordnet if [ -s /etc/ppp/adsl-dev ]; then dslif=`cat /etc/ppp/adsl-dev` $IPTABLES_BIN -A INPUT -i $dslif -j input_ext #$IPTABLES_BIN -A FORWARD -i $dslif -j reject_fkt fi
Diese Regel sorgt dafür, dass das Interface, das am DSL-Modem hängt,
garantiert keine Pakete verarbeitet. Es wird als "externes Interface"
definiert - und erhält daher einen besonderen Status. Der wird später
berücksichtigt.
# Nun noch NAT bearbeiten if [ "$USE_NAT" = yes ] ; then $IPTABLES_BIN -t nat -F # flush rules $IPTABLES_BIN -t nat -X $IPTABLES_BIN -t nat -A POSTROUTING -s 192.168.0.0/16 -d 0.0.0.0/0 -j MASQUERADE $IPTABLES_BIN -t nat -A POSTROUTING -s 172.16.0.0/12 -d 0.0.0.0/0 -j MASQUERADE $IPTABLES_BIN -t nat -A POSTROUTING -s 10.0.0.0/8 -d 0.0.0.0/0 -j MASQUERADE modprobe ip_nat_ftp modprobe ip_nat_irc echo 1 > /proc/sys/net/ipv4/ip_forward fi
Hier wird Masquerading eingeschaltet.