StratoPower-Server Firewall einrichten/konfig.

Also, na dann werde ich noch mal versuchen den script besser zu schreiben, aber jetzt gehe ich schlafen ;) Komme gut nach Hause.
 
So, wie bereits angedroht, hier mein Firewall-Script.
Falls Du es nutzen willst musst Du es natuerlich noch ein wenig an Deine Gegebenheiten anpassen, z.B. den ganzen Quatsch von wegen -i ppp0 entfernen.
Weiterhin nutze ich vom Loggen den ULog-Daemon, der Vorteil dabei ist, dass Du nicht in's syslog loggst, sondern entweder in eine seperate Datei oder in eine MySQL-Datenbank.
Aber das Script soll Dir ja hauptsaechlich als Beispiel dienen.
Okay, here we go:
Code:
case "$1" in
start)
$0 enablelogging
$0 enablefirewall
;;
stop)
$0 disablefirewall
$0 disablelogging
iptables -F
iptables -X
;;
enablelogging)
echo "Enabling Logging"
ulogd -d
iptables -N logging
iptables -A logging -i ppp0 -m state --state INVALID -j ULOG
iptables -I INPUT 1 -j logging
;;
disablelogging)
echo "Disabling Logging"
iptables -D INPUT -j logging
iptables -F logging
iptables -X logging
killall ulogd
;;
enablefirewall)
echo "Enabling Firewall"
iptables -N firewall
iptables -A firewall -m state --state INVALID -j DROP
iptables -A firewall -i ppp0 -p tcp --dport 80 -j ACCEPT
iptables -A firewall -i ppp0 -p tcp --dport 21 -j ACCEPT
iptables -A firewall -i ppp0 -p tcp --dport 25 -j ACCEPT
iptables -A firewall -j DROP
iptables -A INPUT -j firewall
;;
disablefirewall)
echo "Disabling Firewall"
iptables -D INPUT -j firewall
iptables -F firewall
iptables -X firewall
;;
restart)
$0 stop  &&  $0 start  ||  return=$rc_failed
;;
*)
echo "Usage: $0 {start|stop||restart|enablelogging|disablelogging|enablefirewall|disablefirewall|}"
exit 1
;;
esac

Jetzt zur Erklaerung, auf dem Server laufen ein HTTP-Server, ein FTP-Server, ein Mail-Server und ein MySQL-Server. Der MySQL-Server ist nicht von aussen erreichbar, das muss er auch nicht, da ja nur der HTTP-Server darauf zugreifen muss.
Gestartet wird das Script ueber den Parameter start, gestoppt ueber stop (wer haette das gedacht? :) )
Weiterhin koennen auch einzelne Teile der Firewall deaktiviert werden. Ist in dieser Konstellation nicht wirklich sinnvoll, jedoch ist das Original-Script groesser. Das laeuft auf meinem Server back in Germany, dort wird zusaetzlich auch noch NAT gemacht und es gibt einen Abschnitt um VPN-Access erlauben und verbieten zu koennen.
Das Script ist so modular wie moeglich gehalten, sodass neue Funktionen, wie z.B. der angesprochene VPN-Access, ohne Probleme ohne Beeinflussung der eigentlich Firewall gestartet und gestoppt werden koennen.
Falls Module hinzugefuegt werden muessen diese die nach logging und vor firewall durchlaufen werden. Was erreicht wird indem diese in INPUT zwischen diese eingefuegt werden.
Der Grund dafuer ist, dass am Ende von firewall alles was nicht vorher akzeptiert wurde gedroppt wird.
Beispiel:
Code:
iptables -I INPUT 2 -j vpn
Dies fuegt die Chain vpn an Position 2 in die Chain INPUT ein. Position 1 hat logging, firewall wird dadurch von Position 2 auf 3 verschoben.
Voraussetzung, dass das alles in der Form funktioniert ist aktives Logging, also die Chain logging muss in der INPUT Chain sein, falls nicht muss an Position 1 eingefuegt werden.
In der Chain vpn wuerden dann die Ports und Protokolle fuer VPN-Access akzeptiert. Um das Beispiel zu Ende auszufuehren.
Geloescht wird diese dann mit folgender Zeile:
Code:
iptables -D INPUT -j vpn
Du gibst hier also nicht die Position an an der geloescht werden soll, es koennten ja in der Zwischenzeit noch weitere Chains eingefuegt worden sein, sondern die Regel selbst. In diesem Fall ist das nur die Verzweigung in die Chain vpn, mittels -j vpn.
Ich bevorzuge es die eigentlichen Regeln in eigene Chains auszulagern, und in den Standard-Chains nur die Verzweigungen in meine Chains zu haben.
Das sorgt meiner Meinung nach fuer bessere Uebersicht und hoehere Flexibilitaet.

So, ich hoffe Du hast im Laufe dieses Threads ein wenig was ueber's Firewalling mit iptables gelernt. :)
Viel Erfolg beim Filtern.
Falls noch Fragen offen sind, immer her damit.
 
Zuletzt bearbeitet:
Oh Man :eek: , da habe ich noch etwas vor mir. Ich habe mir das Buch bestellt! Ich werde damit jetzt experimentieren. Bis dahin habe ich etwas zu tun ;) Besten dank für deine Hilfe. Ich melde mich noch, ganz bestimt ;)
Schönes Wochenende
Grüße
Bohlen
 
Hallo :)

Ich habe dein script noch mal überarbeitet und an meine Bedurfnisse angepasst.
Ich habe derzeit folgende Dienste laufen:

Code:
21	ftp	 File Transfer [Control]	
       22	ssh	SSH Remote Login Protocol	
       25	smtp	Simple Mail Transfer	
       53	domain	Domain Name Server	
       80	www-http	World Wide Web HTTP	
       110	pop3	Post Office Protocol - Version 3	
       111	sunrpc	SUN Remote Procedure Call	
       443	https	http protocol over TLS/SSL	
       783	spamd	Spamassassin-Daemon	
       953	rndc	BIND remote config	
       3306	mysql	Mysql

Port 22222 ist wichtig für "ViSAS" Zugrif von Aussen.
Anhand dieser Portsliste http://helpdesk.rus.uni-stuttgart.de/~rustomfi/Firewalls/Grundlagen/port-numbers.txt
habe ich die Ports eingestellt.

Und hier das Ergebniss:

Code:
iptables -N firewall
        iptables -A firewall -m state --state INVALID -j DROP
        iptables -A firewall -i eth0 -p tcp --dport 21 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 21 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 22 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 22 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 25 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 25 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 53 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 53 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 80 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 80 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 110 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 110 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 111 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 111 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 443 -j ACCEPT
        iptables -A firewall -i eth0 -p udp --dport 443 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 783 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 953 -j ACCEPT
        iptables -A firewall -i eth0 -p tcp --dport 22222 -j ACCEPT
        iptables -A firewall -i lo -j ACCEPT
        iptables -A firewall -j DROP
        iptables -A INPUT -j firewall

Ich habe die Mysql nicht freigeschaltet aber als ich portscan gemacht (funktion in ViSAS Admin tool) habe, war das Port offen.
Wie kann ich mein Server scannen um zu sehen welche Ports noch offen sind?

Das Ergebnis von # iptables -L
Code:
iptables -L
         Chain INPUT (policy ACCEPT)
 target	 prot opt source			 destination
        firewall   all  --  anywhere			 anywhere
         
         Chain FORWARD (policy ACCEPT)
 target	 prot opt source			 destination
         
         Chain OUTPUT (policy ACCEPT)
 target	 prot opt source			 destination
         
         Chain firewall (1 references)
 target	 prot opt source			 destination
 DROP	 all -- anywhere			 anywhere		 state INVALID
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:ftp
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:fsp
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:ssh
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:ssh
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:smtp
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:smtp
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:domain
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:domain
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:http
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:http
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:pop3
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:pop3
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:sunrpc
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:sunrpc
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:https
 ACCEPT	 udp -- anywhere			 anywhere		 udp dpt:https
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:783
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:953
 ACCEPT	 tcp -- anywhere			 anywhere		 tcp dpt:22222
  ACCEPT	 all -- anywhere			 anywhere
 DROP	 all -- anywhere			 anywhere

Ist alles richtig? (sehe auch das vorletzte Kette, geht es um lokale Verbindungen die frei sind?)
Zum starten und stopen bin ich noch nicht reif genug. Ich würde gerne vielmehr erfahren wie ich mich gegen flood und ddos schutzen kann. Mein Beispiel zuvor war also unbrauchbar in meiner Konfiguration, wie kann ich diese scripte (oder andere gleiche Lösung) bei mir anwenden?

Jetzt als ich mich pit PuTTY anmelde, dauert es sehr lange bis ich Password eingeben kann.
 
Zuletzt bearbeitet:
Das ist soweit in Ordnung, obwohl Du ein wenig uebertrieben hast. :)
Du brauchst nicht fuer jeden Dienst sowohl TCP als auch UDP oeffnen. In der Regel laeuft ein Dienst nur ueber TCP oder UDP. Die Dienste die Du nutzt duerften alle TCP sein.
Dass Visas alle Ports anzeigt liegt daran, dass es auf der zu scannenden Maschine laeuft und der Portscan somit wohl ueber Loopback laeuft. Da Du fuer -i lo alles ACCEPTest ist es kein Wunder, dass Du dort auch MySQL offen siehst.
Am besten laedst Du Dir mal den nmap (gibt's sogar fuer Windows) runter und scannst von daheim.
Dass SSH so lange braucht kann ich mir im Moment nur damit erklaeren, dass es vielleicht vor der eigentlichen Verbindung eine Art Ping-Test durchfuehrt. Da ICMP geblockt ist kommt natuerlich kein Paket zurueck und somit wartet PuTTY bis zum TimeOut.
Mehr Infos ueber Deine Chains bekommst Du mit iptables -L -v.
Da siehst Du dann auch die Interfaces.
 
Hallo Reptiler :)

Wie bekomme ich wieder die ICMP für PuTTY frei?
Ich kann sich auch nicht mehr mit dem WinSCP3 einlogen :(
nmap geht bei mir, ich habe WinXP Pro SP2 und da öffnet sich das Fenster nicht :(

Morgen geht meine Webseite Online, ich möchte bis dan wenigstens den Firewall hinbekommen. Ich kann jetzt nichts mehr uploaden auf den Server.
Ich werde die UDP später entfernen.
Schönen Gruß
Bohlen

Code:
# iptables -L -v
  Chain INPUT (policy ACCEPT 40641 packets, 2093K bytes)
 pkts bytes target	 prot opt in	 out	 source			 destination 
 5148 1537K firewall all -- any	any	 anywhere			 anywhere	
  
  Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target	 prot opt in	 out	 source			 destination 
  
  Chain OUTPUT (policy ACCEPT 81245 packets, 4243K bytes)
 pkts bytes target	 prot opt in	 out	 source			 destination 
  
  Chain firewall (1 references)
 pkts bytes target	 prot opt in	 out	 source			 destination 
 	0	 0 DROP	 all -- any	any	 anywhere			 anywhere		 state INVALID
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:ftp
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:fsp
 221 20947 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:ssh
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:ssh
 15 624 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:smtp
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:smtp
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:domain
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:domain
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:http
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:http
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:pop3
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:pop3
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:sunrpc
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:sunrpc
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:https
 	0	 0 ACCEPT	 udp -- eth0 any	 anywhere			 anywhere		 udp dpt:https
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:783
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:953
 	0	 0 ACCEPT	 tcp -- eth0 any	 anywhere			 anywhere		 tcp dpt:22222
 	0	 0 ACCEPT	 all -- lo	 any	 anywhere			 anywhere	
 4912 1515K DROP	 all -- any	any	 anywhere			 anywhere
 
Zuletzt bearbeitet:
Hallo Bohlen,
also mal weiter im Text ;)

Alle folgenden Script-Zeilen musst Du vor
Code:
iptables -A firewall -j DROP
einfuegen. Ansonsten bringen die nichts, da diese Regel ja alles DROPt.

Um ICMP wieder zuzulassen fuegst Du diese Zeile ein:
Code:
iptables -A firewall -p icmp -j ACCEPT
Das kann man auch noch genauer spezifizieren, sodass nur der Ping (echo-request) reindarf, jedoch hab ich den Parameter dafuer nicht im Kopf.

Welche Zeile Du sinnvollerweise fuer FTP noch mit eintragen kannst waere:
Code:
iptables -A firewall -m state --state RELATED -j ACCEPT

Was genau machst Du mit WinSCP3? Hab grad mal auf die Website geguckt und da steht was von wegen Secure File Transfer. Jedoch ist die Abkuerzung falsch. SFTP steht fuer Simple File Transfer Protocol
FTPS hingegen steht fuer ftp protocol over TLS/SSL, also das was eigentlich der Secure File Transfer sein duerfte.
Weiterhin steht auf dem Screenshot von WinSCP was von Port 22, das waere SSH.
Wie es aussieht scheint WinSCP ueber SSH zu arbeiten.

Es kann natuerlich sein, dass auch diese Programm erstmal einen Ping sendet um zu gucken ob der Host wach ist. Und wenn nichts zurueckkommt meldet "Geht nicht"
Oder aber die Daten-Verbindung konnte bislang nicht aufgebaut werden, was durch die Zeile mit dem RELATED behoben sein sollte.
Also probier erstmal diese beiden Sachen bevor Du weitere Schritte ergreifst.

Falls es dann also immer noch nicht geht wirst Du mal schauen muessen ob vielleicht ein FTPS-Server auf dem System laeuft mit dem WinSCP vielleicht connecten will.
Diesen solltest Du auf TCP-Port 990 finden.

Der nmap hat auch unter Windows kein Fenster, den musst Du in der Shell (also ueber cmd) ausfuehren. Da im Moment ICMP noch geblockt wird brauchst Du auch noch den Parameter -P0
Der teilt nmap mit, dass vor dem Scan kein Ping gesendet werden soll um zu testen ob der Host wach ist.

So, das war der naechste Teil unserer Workshops: Wie basteln wir unsere Firewall ;)
Viel Erfolg weiterhin.
 
Hallo Reptiler, ist die Reihenfolge der Ketten wichtig? Werden diese von 1 bis Ende abgefragt und sich dementsprechend verhalten?
 
Wenn eine Regel auf ein Paket zutrifft wird es aus der Chain geworfen und durchlaeuft sie nicht bis zum Ende. Das gilt fuer nahezu alle Targets (also ACCEPT, DROP, etc.). Es gibt jedoch ein paar Ausnahmen wie zum Beispiel LOG und ULOG.
Bei den "normalen" Target ACCEPT, DROP und REJECT wird das Paket aber aus der Chain genommen und der Regel entsprechend verarbeitet.
 
Soweit einiges verstanden, von Tag zur Tag wird alles klarer ;)

Nun weitere Frage zur Ports, kann ich ohne weiteres die Ports: 111, 953 sperren?
Brauche ich die zur meinen Server?
Bei dieser Konfiguration mit "firewall" habe da noch Frage, ich verstehe daß als aller erste die Ketten der firewall nach der Reihenfolge bearbeitet werden, danach werden die Packete in INPUT weitergeleitet. Wen ich aber noch in INPUT einige Regeln habe, ist das Eintrag iptables -A INPUT -j firewall richtig?

Was genau machst Du mit WinSCP3? Hab grad mal auf die Website geguckt und da steht was von wegen Secure File Transfer.
Hier ;)
http://winscp.sourceforge.net/eng/docs/introduction
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück