Tools:IP-Filter

Aus Arktur
Wechseln zu: Navigation, Suche

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.

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Navigation
Dokumentation
Entwicklung
Werkzeuge