• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

iptables - versteh ich einfach nicht :/

Cyrics

Newbie
Hey,

also iptables dachte ich eigentlich würde ich verstehen. Dem ist aber anscheinend nicht so.
Also ich bin kein blutiger Anfänger in Sachen Linux. Aber ich kann eigentlich nur Beispielkonfigurationen mir anschauen, diese verstehen und selbst dann anders umsetzen ;)

Ich hab jetzt mehrere tolle iptables-Skripte gefunden und die miteinander verbunden. Sie sind in einer Datei gespeichert, die ich gerne bei iptables einfach nur "ranhängen" würde... also iptables einfach nur anweisen, die Datei auszulesen und anzuwenden :(

wieso kann das iptables nicht? Ich hab hier noch nie jemanden "sagen hören" (schreiben sehen :p) wie man bei iptables ein Skript ranhängt.

Wenn ich mir die HowTos von iptables durchlese, lese ich nur wie man tolle Regeln aufstellen kann, aber nirgends, wie man sein tolles Skript auch in einer Datei abspeichern kann, die man mit einer einfachen Zeile einlesen und ausführen lassen kann...

daher denke ich, dass ich iptables nicht verstanden habe! Wäre jemand so nett und könnte es mir nochmal ganz einfach erklären...
Also iptables anzuweisen eine Datei auszulesen, und die darin enthaltenen Befehle in die Tat umzusetzen.

Wenn der Befehl klar ist, kann ich diesen ja in die init.d packen als Skript. Aber mir fehlt dieser Befehl, oder das Verständnis, dass ich diesen Befehl nicht brauche....

ich hoffe einer versteht mich überhaupt *g*

Distri: Debian Sarge
 
Hey

Die Regeln in einer Datei speichern. Die datei ausführbar machen
mit chmod 755 (das x für den ders ausführen sollte/muss gesetzt sein) und dann einfach an der shell mit ./datei die Datei ausführen ( ./ bedeutet du befindest dich auch in dem Verzeichnis wo die scriptdatei steht, sonnst kompletten Pfad angeben oder ins Path verschieben)

Ich hoffe das hast du gemeint, sonnst über include /verzeichnis/datei in dein firewallscript mit einbinden
Du kannst aber auch das script in deinen runleveln starten lassen. Also in den init.d Ordener kopieren und über symlinks den einzellnen rc.x Ordner zufügen

By huflatisch
 
OP
C

Cyrics

Newbie
Hey,

also ich hab schon gehofft das über den Systemstart lösen zu können also init.d
Ich dachte eigentlich, dass es ausreichen würde das Skript dann einfach in den init.d Ordner zu schieben?! Was meinst du mit dem rc.x-Ordner?

Also ich fang sonst am besten nochmal von vorne an:
Hier wäre mein Skript:

Code:
#!/bin/bash
### BEGIN INIT INFO
# Provides: IP-Paketfilter
# Required-Start: $network $local_fs
# Required-Stop: $local_fs
# Default-Start: 3 5
# Default-Stop: 0 1 2 4 6
# Short-Description: My IP-Paketfilter
# Description: IP-Paketfilter
# IP-Security for Debian Server
### END INIT INFO
#

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 "

# Korrupte Pakete zurueckweisen
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -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

# SYN und FIN gesetzt
iptables -A INPUT -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

# FIN und RST gleichzeitig gesetzt
iptables -A INPUT -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

# PSH ohne ACK
iptables -A INPUT -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

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

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

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

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

# SMTP
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 25 -j DROP

# POP3
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 110 -j DROP

# POP3S
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 995 -j DROP

# IMAP
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 143 -j DROP

# IMAPS
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 993 -j DROP

# NNTP
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 119 -j DROP

# DNS
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 53 -j ACCEPT

# FTP
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 21 -j ACCEPT

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

# MYSQL
iptables -A INPUT -i eth0 -m state --state NEW -p tcp --dport 3306 -j DROP

# NTP
iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 123 -j DROP

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

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

# Speicherallozierung und -timing für 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
# 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

Ich hab dieses mit ein paar anderen zusammengeworfen und diese dann geordnet und meinen Bedürfnissen angepasst. Daher ist alles gesperrt ausser SSH, HTTP, HTTPS und FTP. Wer brauch auch schon die ganzen Mail-Ports auf einem File und Webserver?! *g*

Wenn ich dies in eine Datei packe und als Programm ausführe: also ./firewall-skript start

Kommt die Meldung:
Fehlerhafter Aufruf
Syntax: /usr/sbin/iptables {start|stop|status}
Und in etwa proportional zu jeder Zeile vom firewall-Skript. Also ein paar hundert mal :?

Deshalb dachte ich, dass ich es iptables irgendwie richtig zuordnen muss, und nicht einfach als Datei ausführen. Weil irgendwie scheint da ein Denkfehler zu sein, oder?

Oder ich versteh das ganze absolut nicht *hm*
 

oc2pus

Ultimate Guru
um dein script korrekt einzubinden liest du am besten mal dieses Posting durch:

Wichtig: [HOWTO] runlevel scripte - selber erstellen
http://www.linux-club.de/viewtopic.php?t=16069
 
OP
C

Cyrics

Newbie
Hey,
das Posting hatte ich schonmal gelesen. Aber das ist ziemlich SuSe-lastig, oder?

zumindestens insserv etc. funktioniert unter Debian nicht, und kenne da die Einbindung leider nicht.

Oder reicht es das Skript in /etc/init.d/ zu kopieren und mit chmod 755 zu belegen?

Und dann eben die Frage ob der Fehler an meinem Skript liegt, oder was ich falsch mache, dass an die Hundert mal dieser fehlerhafter-Syntax-Fehler auftritt.

PS: das Forum ist sowieso sehr SuSe-Lastig *g* wollte das nur mal gesagt haben :)
 
OP
C

Cyrics

Newbie
naja, ich hoffe ich krieg trotzdem ein bisschen Hilfe, auch wenn ich kein Suse verwende :?

Denn wie es scheint, funktioniert mein iptables fehlerhaft.
Egal was ich mache:
Fehlerhafter Aufruf
Syntax: /usr/sbin/iptables {start|stop|status}

Ich hab nämlich einfach mal versucht mir die derzeitigen Regeln auflisten zu lassen...
beim Befehl: iptables -L
dann kam:
Fehlerhafter Aufruf
Syntax: /usr/sbin/iptables {start|stop|status}

beim Befehl: iptables -F forward
Fehlerhafter Aufruf
Syntax: /usr/sbin/iptables {start|stop|status}

usw. usf.
Wenn ich per apt-get iptables neuinstallieren will, heisst es auch nur, dass ich bereits die neuste Version besitze *g*

aber ich will iptables auch nun nicht komplett entfernen um es dann mit neuzuinstallieren *hm* woran kann es denn nur liegen?

Immer wenn "iptables" in der Befehlszeile vorkommt, tritt dieser Fehler auf! :(
 

oc2pus

Ultimate Guru
du hast offensichtlich ein Script iptables und ein Programm iptables ...

in /usr/sbin/iptables steht dein script und das word immer VOR dem eigentlichen Programm gefunden, nenne das einfach mal um und suche dann nach deinem "echten" iptables.
 
OP
C

Cyrics

Newbie
Danke! Darauf wäre ich nun nie gekommen! :oops:
War ja sehr clever von mir das Skript genauso wie das Programm zu nennen....
Das Problem war wohl an dem Skript, dass es fehlerhaft war. Daher wollte ich mein neues raufspielen.

Ich hab mein neues Skript namens firewall nun in den /etc/init.d/ Ordner gepackt.
Ich hab chmod 755 drauf angewannt. Muss ich noch etwas beachten, dass es mit dem Systemstart automatisch funktioniert?

Ich hab es jetzt auf jeden Fall manuell erstmal gestartet, und es läuft ohne Probleme :)

Wie könnte ich nun zum Beispiel testen, ob die Firewall wirklich aktiv ist?
 

oc2pus

Ultimate Guru
Cyrics schrieb:
Ich hab mein neues Skript namens firewall nun in den /etc/init.d/ Ordner gepackt.
Ich hab chmod 755 drauf angewannt. Muss ich noch etwas beachten, dass es mit dem Systemstart automatisch funktioniert?

damit dein Script beim booten geladen wird musst du es in den Ordner rc.3 (nur netz) bzw rc.5 (netz + GUI) noch verlinken.

Bei SuSE passiert das mit dem Befehl insserv, bei debian gibt es glaube ich chkconfig (oder so ähnlich).

Durch den EIntrag im Runlevel-Verzeichnis wird das Script beim Starten ausgeführt. Durch die Nummerierung legt man die Reihenfolge fest... aber ich bin kein debian-Spezi :)
 
OP
C

Cyrics

Newbie
Hey,

also chkconfig scheint auf meinem Debian-System nicht zu existieren. Anscheinend sollte das mal ins System miteinfliessen. Zumindestens hatte ich das jetzt aus einer Mailinglist herausgelesen.

Aber auf dem System existiert dafür /usr/sbin/update-rc.d

man kann sein Firewall-Skript dann mit folgenden Befehl zuordnen :)
update-rc.d firewall start 40 S . stop 89 0 6 .

Hab eigentlich keine Ahnung was die Zahlen und Punkte bedeuten... weil ich kein runlevel 40 und 89 kenne *g*
Aber es funktioniert super :D

Also vielen Dank für die Hilfe!
*wieder etwas schlauer bin*
 
Oben