Iptables und nmap-Fragen (gelöst)

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Iptables und nmap-Fragen (gelöst)

Beitrag von khelben » 17.05.2006 14:20:50

Guten Tag zusammen,

da ich mich gerade neu mit Debian beschäftige und vorher so gut wie keine Linux-Erfahrungen gesammelt habe, würd ich gern mal eure Meinung zu meinen Fragen / Problemen hören.

Ich habe mir ein kleines Script gemacht, welches beim Systemstart ein paar Regeln für ip_tables im Kernel hinterlegt.

Code: Alles auswählen

#! /bin/sh
# 
# Grundkonfiguration des Paketfilters mittels ip_tables
#

iptables -N block


# Pings werden vom Rechner 196er-Netz geblockt, Ausnahme eigner Arbeitsplatz

# iptables -A block -m limit --limit 10/s -j LOG --log-level warning --log-prefix "IP-TABLE-LOG"
iptables -A block -s ! 196.57.1.93 -p icmp -j DROP

# alles andere wird verworfen
#iptables -A block -j DROP

# Von INPUT und FORWARD Ketten zu Kette "block" springen

iptables -A INPUT -p tcp --sport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP
iptables -A INPUT -j block

iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -j DROP

iptables -A FORWARD -j block
Ob die eigene Kette "block" notwendig ist weiß ich nicht, aber ich hab mich da an ein kleines Tutorial gehalten, welches ich im Netz gefunden habe. Würde es vielleicht auch reichen das einfach mit unter die Input-Kette zu packen?

Ziel sollte sein, das ich a) einen FTP-Server auf dem Rechern laufen lassen kann und b) im Internet surfen. a funktioniert b konnte ich noch nicht testen.

Den Ping erlaube ich um von meinem Arbeitsplatz überprüfen zu können ob der Linux-Rechner noch lebt :)

Meine erste Frage ist jetzt, ob das soweit in Ordnung ist, oder ob ihr irgendwas anders machen würdet. Meine 2. Frage ist ob ich das Logging vom Paketfilter irgendwie umbiegen kann, damit es nicht im syslog erscheint.

Ich habe vor und nach dem einspielen der Regeln mit nmap einen Portscan gemacht und mir das Ergebnis in ein Logfile schreiben lassen. Leider kann ich mit dem Ergebnis nur begrenzt was anfangen und hab dazu noch ein paar Fragen.

Hier meine Logs..

Code: Alles auswählen

# nmap 3.81 scan initiated Wed May 17 14:00:11 2006 as: nmap -sR -P0 -O -v -f -oN /var/log/nmap.log 196.57.1.91 
Interesting ports on schwarzstab.ARBEITSGRUPPE (196.57.1.91):
(The 1656 ports scanned but not shown below are in state: closed)
PORT      STATE SERVICE              VERSION
21/tcp    open  ftp 
22/tcp    open  ssh 
111/tcp   open  rpcbind (rpcbind V2) 2 (rpc #100000)
113/tcp   open  auth 
606/tcp   open  status (status V1)   1 (rpc #100024)
631/tcp   open  ipp 
10000/tcp open  snet-sensor-mgmt 
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.5.25 - 2.6.3 or Gentoo 1.2 Linux 2.4.19 rc1-rc7)
Uptime 0.016 days (since Wed May 17 13:37:06 2006)
TCP Sequence Prediction: Class=random positive increments
                         Difficulty=5187925 (Good luck!)
IPID Sequence Generation: All zeros

# Nmap run completed at Wed May 17 14:00:21 2006 -- 1 IP address (1 host up) scanned in 9.831 seconds 
und

Code: Alles auswählen


# nmap 3.81 scan initiated Wed May 17 13:52:41 2006 as: nmap -sR -P0 -O -v -f -oN /var/log/nmap.log 196.57.1.91 
Warning:  OS detection will be MUCH less reliable because we did not find at least 1 open and 1 closed TCP port
All 1663 scanned ports on schwarzstab.ARBEITSGRUPPE (196.57.1.91) are: filtered
Too many fingerprints match this host to give specific OS details
TCP/IP fingerprint:
SInfo(V=3.81%P=i686-pc-linux-gnu%D=5/17%Tm=446B1000%O=-1%C=-1)
T5(Resp=N)
T6(Resp=N)
T7(Resp=N)
PU(Resp=N)

# Nmap run completed at Wed May 17 13:58:56 2006 -- 1 IP address (1 host up) scanned in 375.748 seconds 

Meine Fragen dazu..was bedeutet:

TCP Sequence Prediction: Class=random positive increments
Difficulty=5187925 (Good luck!)
IPID Sequence Generation: All zeros

und ist das 2. Log eher gut oder eher schlecht, nachdem ich meine Regeln eingestellt habe?

Gibt es noch Alternativen oder Ergänzungen zu iptables?

Viele Fragen auf einmal, aber ich hoffe ich bekomme ein paar Antworten.

Vielen Dank schonmal vorab

MfG
Markus
Zuletzt geändert von khelben am 24.05.2006 14:51:02, insgesamt 1-mal geändert.

Benutzeravatar
chu-i
Beiträge: 157
Registriert: 10.11.2005 23:29:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Berlin

Beitrag von chu-i » 17.05.2006 18:58:40

Also ich werde mal nur auf die iptables Fragen antworten.
Dein Script wird so nicht sinnvoll funktionieren.
Der Grundsatz bei iptables lautet "Die erste Regel die Zutrifft wird ausgeführt."

Code: Alles auswählen

#! /bin/sh
#
# Grundkonfiguration des Paketfilters mittels ip_tables
#

set -e

MEINE_IP="196.57.1.93"
IPTABLES=´which iptables´
EXT_DEV="eth0"
OUT_PORTS="20,21,80,443"
IN_PORTS="20,21,80,443"


# LOESCHT ALLE ALTEN REGELN
        $IPTABLES -F

# SETZT STANDART VERHALTEN
        $IPTABLES -P INPUT DROP
        $IPTABLES -P FORWARD DROP
        $IPTABLES -P OUTPUT DROP

# LOOPBACK ERLAUBEN
        $IPTABLES -A INPUT -i lo -j ACCEPT
        $IPTABLES -A OUTPUT -o lo -j ACCEPT

# EIGENE KETTE DIE ALLE ICMP PAKETE DROPT, AUSSER SIE KOMMEN VON $MEINE_IP
        $IPTABLES -N block
        $IPTABLES -A block -s ! $MEINE_IP -p icmp -j DROP

# ERLAUBT OUTPUT UEBER DEFINIERTE PORTS
        $IPTABLES -A OUTPUT -p TCP -o $EXT_DEV -m multiport --dports $OUT_PORTS -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# ERLAUBT INPUT UEBER DEFINIERTE PORTS
        $IPTABLES -A INPUT -j block
        $IPTABLES -A INPUT -p TCP -i $EXT_DEV -m multiport --sports $IN_PORTS -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Die Variablen MEINE_IP; EXT_DEV; OUT_PORTS; IN_PORTS solltest du anpassen.
Die Firewall sollte dir so aktives und passives FTP erlauben sowie http und https.

Die Blockkette ist im jetzigen Zustand etwas übertrieben, erlaubt dir jedoch eine einfach Erweiterung auf gewisse limit oder log Regeln, so wie in deinem ursprünglichen Listing auskommentiert.

Das Pingen geht nur vom Rechner der unter MEINE_IP eingetragen ist.
IDu hast da einen Server der offensichtlich auf mindestens 4 Ports offen ist, willst aber nicht das er angepingt wird?

Wieso möchtest Du das loggen im Syslog unterbinden? Macht auch nicht viel Sinn, da dir dann das debugen erheblich erschwert wird. :wink:
Ein Möglichkeit ist das log in ein eigenes Firewall logfile zu schreiben.
Das Prinzip ist hier kurz umrissen.

Dein Listing:

Code: Alles auswählen

iptables -A FORWARD -j block 
Achja, warum eine forward Regel?

Ansonsten findest Du hier alle Infos die Du für iptables brauchst.
Zuletzt geändert von chu-i am 18.05.2006 00:37:56, insgesamt 2-mal geändert.
Thx & cya Chu-i

„Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“
Benjamin Franklin (1706-1790†)

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 17.05.2006 20:53:15

Vielen Dank für deine Verbesserungen. Leuchtet mir auch soweit alles ein. :)

Ich wollte das Logging nicht ausschalten sondern, wie in deinem Link gezeigt in eine andere Datei umleiten :)

Warum ich nur das Pingen von einem Rechner erlauben möchte..hmm..ping ist der erste Versuch in einem Netzwerk zu schauen ob ein Rechner lebt, Portscanner und Co haben die wenigsten auf ihrem Rechner (rede jetzt von einem Lan) Das das nicht die beste Sicherheitsvorkehrung ist ist mir klar, aber man muss ja nicht alle Scheunentore offen haben :)

Werde dein Skript morgen mal ausprobieren :)

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 19.05.2006 08:59:18

Nachdem ich das Skript jetzt ausprobieren wollte, habe ich festgestellt, das es leider nicht funktioniert. :(

Ausführbar ist das Skript (755) allerdings bekomme ich nur eine Ausgabe ins Terminal geschrieben "/sbin/iptables" mehr passiert nicht.
Ein iptables -L bringt eine leere Tabelle für alle Ketten.

Wenn ich den Anfang des Skripts richtig gedeutet habe werden Umgebungsvariablen gesetzt. Ein "set" im Terminal bringt diese leider nicht ans Tageslicht. Es scheint, als würden diese gar nicht gesetzt werden, womit dann wahrscheinlich auch der Rest vom Skript nicht funktioniert?

Woran kann das liegen?

edit: statt set -e ein export nach den Variablen und es klappt, wobei ich IPTABLES weggelassen habe und im Skript an den entsprechenden Stellen die Variable entfernt habe.

Nachdem jetzt die Regeln eingespielt sind, geht nur leider gar nix mehr ausser dem loopback. Es scheint an der Policy zu liegen, was mich aber wundert, denn ich dachte das die Policy erst dann zieht, wenn auf ein Paket gar keine Regel zutreffend ist.. Ein Irrtum?

Gruß

Markus

Benutzeravatar
chroiss
Beiträge: 332
Registriert: 29.10.2004 09:29:43
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: BREMEN (in Wellington,NZ a.D) (in OLDENBURG a.D.) (in BREMEN a.D.) (in COLOGNE a.D.)

Beitrag von chroiss » 19.05.2006 11:22:06

schöne sache das mit den multiports - kannt ich gar nich 8O

hier ein Vorschlag der deinen Ansprüchen genügen sollte ohne auch nur irgendwem hier was zu wollen ... [1]

is n bischen scriptlastig mit dem 1024:65535 , ich weiss , aber es funktioniert.

[1] http://nopaste.debianforum.de/3185

Edit by Snoopy:
Bitte grosse Ausgaben von Configs oder Logs ins NoPaste [2] schieben und in den Thread verlinken.
Siehe auch die Verhaltensregeln des Forums [3].

[2] http://nopaste.debianforum.de/
[3] http://wiki.debianforum.de/debianforum. ... tensregeln
"The only secure computer is one that's unplugged, locked in a safe, and buried 20 feet under the ground in a secret location... and I'm not even too sure about that one"--Dennis Huges, FBI.

Benutzeravatar
chu-i
Beiträge: 157
Registriert: 10.11.2005 23:29:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Berlin

Beitrag von chu-i » 20.05.2006 19:54:14

Sorry, wenns nicht klappt. Hab das aus der holen Hand aus deinem org Skript heraus umgeschrieben.
Werde das mal bei mir testen. Poste dir dann das korrigierte Skript. :oops:
Zuletzt geändert von chu-i am 20.05.2006 21:05:21, insgesamt 3-mal geändert.
Thx & cya Chu-i

„Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“
Benjamin Franklin (1706-1790†)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 20.05.2006 20:12:36

Die Quotes bei "which iptables" gehören andersrum:

Code: Alles auswählen

IPTABLES=`which iptables`
oder

Code: Alles auswählen

IPTABLES=$(which iptables)
nur könnte man da eigentlich auch

Code: Alles auswählen

IPTABLES=iptables
schreiben

am besten und sichersten wäre

Code: Alles auswählen

IPTABLES=/sbin/iptables
Gruß
gms

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 20.05.2006 20:45:33

khelben hat geschrieben:Nachdem jetzt die Regeln eingespielt sind, geht nur leider gar nix mehr ausser dem loopback. Es scheint an der Policy zu liegen
NEW sollte von ESTABLISHED,RELATED getrennt werden, weil sonst die weiteren Bedingungen auch für alle ESTABLISHED und RELATED Pakete gelten müssen, was im Normalfall aber nicht zutrifft

Code: Alles auswählen

#! /bin/sh 
# 
# Grundkonfiguration des Paketfilters mittels ip_tables 
# 

set -e 

MEINE_IP="196.57.1.93" 
IPTABLES=/sbin/iptables
EXT_DEV="eth0" 
OUT_PORTS="20,21,80,443" 
IN_PORTS="20,21,80,443" 


# LOESCHT ALLE ALTEN REGELN 
        $IPTABLES -F 

# SETZT STANDART VERHALTEN 
        $IPTABLES -P INPUT DROP 
        $IPTABLES -P FORWARD DROP 
        $IPTABLES -P OUTPUT DROP 

# LOOPBACK ERLAUBEN 
        $IPTABLES -A INPUT -i lo -j ACCEPT 
        $IPTABLES -A OUTPUT -o lo -j ACCEPT 

# EIGENE KETTE DIE ALLE ICMP PAKETE DROPT, AUSSER SIE KOMMEN VON $MEINE_IP 
        $IPTABLES -N block 
        $IPTABLES -A block -s ! $MEINE_IP -p icmp -j DROP

# ERLAUBT BESTEHENDE VERBINDUNGEN
        $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
        $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ERLAUBT OUTPUT UEBER DEFINIERTE PORTS 
        $IPTABLES -A OUTPUT -p TCP -o $EXT_DEV -m multiport --dports $OUT_PORTS -m state --state NEW -j ACCEPT 

# ERLAUBT INPUT UEBER DEFINIERTE PORTS 
        $IPTABLES -A INPUT -j block 
        $IPTABLES -A INPUT -p TCP -i $EXT_DEV -m multiport --sports $IN_PORTS -m state --state NEW -j ACCEPT
Gruß
gms

Benutzeravatar
chu-i
Beiträge: 157
Registriert: 10.11.2005 23:29:01
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Berlin

Beitrag von chu-i » 20.05.2006 21:06:51

Stimmt gms. :D

Würde höchsten noch die Regeln dublizieren und für -p UDP ergänzen.
Thx & cya Chu-i

„Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren.“
Benjamin Franklin (1706-1790†)

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 21.05.2006 17:45:15

Danke, werd ich Montag mal direkt testen :)

Gruß

Markus

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 22.05.2006 15:03:16

Hab das Skript jetzt getestet und irgendwie hakt's immer noch...
Allerdings bezweifel ich langsam das es am Skript selbst lieg, sondern mehr an einer Einstellung des Systems, auch wenn ich nicht weiß woran es liegen könnte.

Alles was über loopback rein / raus kommt funktioniert tadellos, sobald ich aber von einem anderen Rechner zugreifen will war es das... Ich bekomme keine FTP-Verbindung zustande (mehr konnte ich noch nicht testen, in Ermangelung einer online-Verbindung für diesen Rechner)

Wenn ich ein Logfile erzeuge sehe ich, das der 2. Rechner versucht über Port 21 reinzukommen, aber irgendwie passiert da nicht mehr. :(

Benötigt der FTP-Dienst (pure-ftpd in meinem Fall) noch mehr als Port 21?

In den manpages hab ich auf den ersten Blick nichts dazu gefunden.

Mir graust es jetzt schon davor das Ding ins öffentliche Netz sicher zu hängen, wenn der Server intern schon nicht so will wie ich.... :cry:

Danke für eure Unterstützung bisher

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 22.05.2006 19:56:56

khelben hat geschrieben:Benötigt der FTP-Dienst (pure-ftpd in meinem Fall) noch mehr als Port 21?
ja, bei "Active FTP" wird serverseitig noch eine Verbindung von Port 20 (ftp-data) zum Client benötigt. Bei "Passive FTP" wird eine Verbindung vom Client zu einem Serverport >=1024 aufgebaut.
Aber eigentlich sollte das alles über die RELATED Verbindungen/Pakete abgedeckt sein.

Hier habe ich dir noch einen netten Überblick über "Active FTP" und "Passive FTP" herausgesucht: http://slacksite.com/other/ftp.html.

Aufgefallen ist mir noch, daß diese icmp-Geschichte so wahrscheinlich nicht gewünscht ist. Derzeit werden alle icmp Pakete defaultmäßig gedroppt, außer sie kommen über INPUT rein und haben eine andere IP als deine. In diesem Fall werden sie explicit gedroppt :?

Am Ende von INPUT und OUTPUT solltest du auch noch die zu droppenden Pakete loggen, damit man sieht was da schief läuft.

Gruß
gms

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 23.05.2006 12:50:24

Ich habe jetzt mal das Skript von chroiss ausprobiert und siehe da, es geht auf Anhieb.

Offenbar ist wirklich das Problem gewesen das der FTP-Server mehr als nur Port 21 brauchte.
Mit multiport war das irgendwie nicht zu realisieren (oder ich war zu doof dazu) ;) , jetzt hab ich zwar etwas mehr Schreibarbeit, wenn ich nen Port hinzufügen will, aber es klappt erstmal.

Eine wirkliche Sicherheitslücke kann ich jetzt nicht erkennen, denn ich gehe mal davon aus, das die Portrange 1024-65535 nur dann verfügbar ist, wenn Pakete über die definierten Ports 20 bzw. 21 kommen / rausgehen und ansonsten verworfen werden.

Stellt sich für mich nur noch die Frage: Wenn ein Portscanner wie nmap einen offenen Port findet, ist das dann schon ein großes Sicherheitsrisiko oder hält es sich in Grenzen weil der Paketfilter über diese Ports ja eigentlich keinen Datenverkehr zulassen dürfte, sofern nicht explizit gesagt?

Danke für eure Hilfe :)

Benutzeravatar
chroiss
Beiträge: 332
Registriert: 29.10.2004 09:29:43
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: BREMEN (in Wellington,NZ a.D) (in OLDENBURG a.D.) (in BREMEN a.D.) (in COLOGNE a.D.)

Beitrag von chroiss » 23.05.2006 19:04:25

das andere script würde wahrscheinlich auch klappen , ohne da jetzt noch mal rüberzukucken ....

ich schätze mal der grund dafür , dass meins funktioniert ist folgender eintrag

Code: Alles auswählen

modprobe ip_conntrack_ftp
denn, für die Probleme, die aus dem 2-Port Protokoll von FTP resultieren,schafft dieses Kernel-Modul Abhilfe. Dieses observiert den Verbindungsaufbau einer FTP-Verbindung auf Protokoll-Ebene, und erkennt den Rückkanal automatisch.

gruss chroiss

ps: nmap wird keinen dieser ports finden , du bietest ja nichts drüber an :wink:
und scriptlastig soll nicht unsicher meinen, sondern vielschreiberei... da einige sachen auch weggelassen werden könnten...
unsicher ist es nicht.
"The only secure computer is one that's unplugged, locked in a safe, and buried 20 feet under the ground in a secret location... and I'm not even too sure about that one"--Dennis Huges, FBI.

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 23.05.2006 19:31:38

Dann probiere ich das auch nochmal damit :)

Die Geschichte mit dem multiport ist einfach zu verlockend :)


Danke euch erstmal allen, habt mir in jedem Fall sehr geholfen

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 23.05.2006 19:46:21

khelben hat geschrieben:Stellt sich für mich nur noch die Frage: Wenn ein Portscanner wie nmap einen offenen Port findet, ist das dann schon ein großes Sicherheitsrisiko
wieso "offen" ? Nmap sollte nur die TCP Ports als offen anzeigen, welche du explicit erlaubt hast. Alle anderen TCP Ports sollten eigentlich den Status "filtered" bekommen

Gruß
gms

khelben
Beiträge: 8
Registriert: 17.05.2006 14:04:50

Beitrag von khelben » 24.05.2006 14:50:27

Du hast natürlich recht gehabt... Selten dämlich von mir.. :roll:
Ich hab den Portscan immer auf dem gleichen Rechner laufen gehabt, auf dem auch die Filterregeln eingestellt sind. Da ich dabei alles über loopback zugelassen habe, hat der natürlich auch offene Ports gefunden.
Kaum auf einem 2. Rechner getestet und schon steht da filtered, außer bei den zugelassenen Ports.

ip_conntrack_ftp war offenbar nicht die Lösung, aber es funktioniert ja mit dem Script und das so, wie ich es gern hätte.

Danke für die Hilfe, Problem gelöst :)

Gruß Markus

Antworten