freebsd firewall ipfw

hallo leute,

in sachen freebsd bin ich absoluter neuling und habe mal ein problem meiner erstellten firewallregeln.
aber erstmal zum system.
ich benutze freebsd 5.2.1 release auf 900'er pIII mit 128mb ram und 2 net-interfaces.

-----netz_2--------------------router_2(fbsd)---------------netz_1----------router_1-----wan
(192.168.20.0) (192.168.20.1 & 192.168.10.2) (192.168.10.0) (192.168.10.1)

also, router_1 ist normaler dsl-router, mit dem alle clients ins wan gelangen sollen.
router_2 hat 2 interfaces und fungiert als gateway (gateway_enable=yes)
routing-daemons habe ich nirgens laufen. nur auf dem dsl-router (router_1) habe ich ne statische route zum netz_2 über 192.168.10.2 eingerichtet. das gesamte netz mit zugang zum wan und umgekehrt etc. funktioniert.

meine frage bezieht sich sich aber vielmehr auf die effizienz und wirksamkeit meiner erstellten regeln gegenüber angriffen, da ich ein absolut sicheres netz_2 (clients haben KEINE eigene firewall) benötige.
kann sich das mal bitte jemand anschauen, da ich aus den man-pages nicht schlau werde und das handbuch recht rudimentär ausgestattet ist, wenn es um die ipfw-regeln geht.
die hier dargestellten regeln funktionieren zwar, abe ich habe das gefühl da viele
regeln durch eine einzige ersetzt werden könnte. außerdem habe ich sie mehr oder weniger nur zusammenkopiert, da ich absolut kein plan habe.

relevanter abschnitt aus rc.firewall

[Rr][Oo][Uu][Tt][Ee][Rr])
#externes interface zum router_1
oif="rl0"
onet="192.168.10.0"
omask="255.255.255.0"
oip="192.168.10.2"

#internes interface
iif="em0"
inet="192.168.20.0"
imask="255.255.255.0"
iip="192.168.20.1"

router="192.168.10.1" #=router_1
homenet="192.168.20.1,192.168.20.2,192.168.20.255"
samba="137,138,139"
daemons="21......."

setup_loopback

##############################################################################
# abschnitt gesperrt #
##############################################################################

# Stop spoofing
${fwcmd} add deny log all from ${inet}:${imask} to any in via ${oif}
${fwcmd} add deny log all from ${onet}:${omask} to any in via ${iif}
${fwcmd} add deny log ip from any to any not verrevpath in
${fwcmd} add deny log ip from any to any in via ${oif} not verrevpath
${fwcmd} add deny log ip from any to any in via ${iif} not verrevpath

# Stop RFC1918 nets on the outside interface
${fwcmd} add deny log all from any to 10.0.0.0/8 via ${oif}
${fwcmd} add deny log all from any to 172.16.0.0/12 via ${oif}
${fwcmd} add deny log all from any to 192.168.0{0-19,21-255}.0/16 via ${oif}
# ${fwcmd} add deny log all from any to 192.168.0.0/16 via ${oif}
# ${fwcmd} add deny log all from any to 192.168.20.0/24 via ${oif}

# Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
# DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
# on the outside interface
${fwcmd} add deny log all from any to 0.0.0.0/8 via ${oif}
${fwcmd} add deny log all from any to 169.254.0.0/16 via ${oif}
${fwcmd} add deny log all from any to 192.0.2.0/24 via ${oif}
${fwcmd} add deny log all from any to 224.0.0.0/4 via ${oif}
${fwcmd} add deny log all from any to 240.0.0.0/4 via ${oif}

#verfolgen von packeten
${fwcmd} add check-state

#icmp erlauben
# ${fwcmd} add pass log icmp from any to any in recv ${oif} icmptype 3
# ${fwcmd} add pass log icmp from any to any in recv ${oif} icmptype 8
# ${fwcmd} add pass log icmp from any to any in recv ${iif} icmptype 3
# ${fwcmd} add pass log icmp from any to any in recv ${iif} icmptype 8

#samba nach außen sperren
${fwcmd} add deny log tcp from ${iip}:${imask} to ${onet}:${omask} 139, 445 setup
${fwcmd} add deny log udp from ${iip}:${imask} to ${onet}:${omask} 137, 138 setup
${fwcmd} add deny log tcp from ${iip}:${imask} to ${onet}:${omask} 139, 445 out xmit ${iif}
${fwcmd} add deny log udp from ${iip}:${imask} to ${onet}:${omask} 137, 138 out xmit ${iif}
${fwcmd} add deny log tcp from ${iip}:${imask} to ${onet}:${omask} 139, 445 in recv ${iif}
${fwcmd} add deny log udp from ${iip}:${imask} to ${onet}:${omask} 137, 138 in recv ${iif}

${fwcmd} add deny log tcp from ${onet}:${omask} to ${iip}:${imask} 139, 445 setup
${fwcmd} add deny log udp from ${onet}:${omask} to ${iip}:${imask} 137, 138 setup
${fwcmd} add deny log tcp from ${onet}:${omask} to ${iip}:${imask} 139, 445 out xmit ${iif}
${fwcmd} add deny log udp from ${onet}:${omask} to ${iip}:${imask} 137, 138 out xmit ${iif}
${fwcmd} add deny log tcp from ${onet}:${omask} to ${iip}:${imask} 139, 445 in recv ${iif}
${fwcmd} add deny log udp from ${onet}:${omask} to ${iip}:${imask} 137, 138 in recv ${iif}

${fwcmd} add deny log tcp from ${onet}:${omask} to not ${iip}:${imask} 139, 445 setup
${fwcmd} add deny log udp from ${onet}:${omask} to not ${iip}:${imask} 137, 138 setup
${fwcmd} add deny log tcp from ${onet}:${omask} to not ${iip}:${imask} 139, 445 out xmit ${iif}
${fwcmd} add deny log udp from ${onet}:${omask} to not ${iip}:${imask} 137, 138 out xmit ${iif}
${fwcmd} add deny log tcp from ${onet}:${omask} to not ${iip}:${imask} 139, 445 in recv ${iif}
${fwcmd} add deny log udp from ${onet}:${omask} to not ${iip}:${imask} 137, 138 in recv ${iif}

# Network Address Translation.
case ${natd_enable} in
[Yy][Ee][Ss])
if [ -n "${natd_interface}" ]; then
${fwcmd} add divert natd all from any to any via ${natd_interface}
fi
;;
esac

# Stop RFC1918 nets on the outside interface
${fwcmd} add deny log all from 10.0.0.0/8 to any via ${oif}
${fwcmd} add deny log all from 172.16.0.0/12 to any via ${oif}
# ${fwcmd} add deny log all from 192.168.0.0/16 to any via ${oif}
${fwcmd} add deny log all from 192.168.0{0-19,21-255}.0/16 to any via ${oif}

# Stop draft-manning-dsua-03.txt (1 May 2000) nets (includes RESERVED-1,
# DHCP auto-configuration, NET-TEST, MULTICAST (class D), and class E)
# on the outside interface
${fwcmd} add deny log all from 0.0.0.0/8 to any via ${oif}
${fwcmd} add deny log all from 169.254.0.0/16 to any via ${oif}
${fwcmd} add deny log all from 192.0.2.0/24 to any via ${oif}
${fwcmd} add deny log all from 224.0.0.0/4 to any via ${oif}
${fwcmd} add deny log all from 240.0.0.0/4 to any via ${oif}

##############################################################################
# abschnitt erlaubt #
##############################################################################

#${fwcmd} add pass ip from ${homenet} to ${ip} 137,138,139 via ${interface}
#${fwcmd} add pass ip from ${homenet} to ${iip}:${imask} 137,138,139 via ${iif}

#bestehende verbindungen erlauben
# ${fwcmd} add pass tcp from any to any established
${fwcmd} add pass tcp from any to any via ${oif} established
${fwcmd} add pass tcp from any to any via ${iif} established

#Allow setup of outgoing TCP connections only
# ${fwcmd} add pass tcp from ${ip} to any setup
#${fwcmd} add pass tcp from ${oip} to any keep-state out xmit ${oif} setup
${fwcmd} add pass tcp from ${iip} to any keep-state out xmit ${iif} setup
${fwcmd} add pass tcp from ${homenet} to any ${daemons} keep-state in via ${iif} setup

#samba nur im internen netz erlauben
${fwcmd} add pass ip from ${iip} to ${homenet} out via ${iif} src-port ${samba}
#${fwcmd} add pass ip from ${homenet} to ${ip} 137,138,139 via ${interface}
${fwcmd} add pass ip from ${homenet} to ${iip}:${imask} ${samba} in via ${iif}

# Allow IP fragments to pass through
# ${fwcmd} add pass all from any to any frag

# Allow setup of incoming email
# ${fwcmd} add pass tcp from any to ${oip} 25 setup

# Allow access to our DNS
# ${fwcmd} add pass tcp from any to ${oip} 53 setup
# ${fwcmd} add pass udp from any to ${oip} 53
# ${fwcmd} add pass udp from ${oip} 53 to any

# Allow access to our WWW
# ${fwcmd} add pass tcp from any to ${oip} 80 setup

# Reject&Log all setup of incoming connections from the outside
${fwcmd} add deny log tcp from any to any in via ${oif} setup

# Allow setup of any other TCP connection
# ${fwcmd} add pass tcp from any to any setup

# Allow DNS queries out in the world
#${fwcmd} add pass udp from ${oip} to any 53 keep-state
${fwcmd} add pass udp from ${oip} to ${router} 53 keep-state
${fwcmd} add pass udp from ${homenet} to ${router} 53 keep-state in
${fwcmd} add pass udp from ${homenet} to ${router} 53 keep-state out

# Allow NTP queries out in the world
# ${fwcmd} add pass udp from ${oip} to any 123 keep-state

#reset an alle ident-packete
${fwcmd} add reset log tcp from any to any 113 in recv ${oif}
${fwcmd} add reset log tcp from any to any 113 in recv ${iif}

# Disallow setup of all other TCP connections
${fwcmd} add deny log all from any to any setup
${fwcmd} add deny log ip from any to any setup
${fwcmd} add deny log tcp from any to any setup
${fwcmd} add deny log udp from any to any setup
${fwcmd} add deny log all from any to any
${fwcmd} add deny log ip from any to any
${fwcmd} add deny log tcp from any to any
${fwcmd} add deny log udp from any to any

# Everything else is denied by default, unless the
# IPFIREWALL_DEFAULT_TO_ACCEPT option is set in your kernel
# config file.
;;
 
Hallo papa bär,

herzlich willkommen in diesem Forum und bei FreeBSD.

Die "Durchlässigkeit" Deiner Regeln kannst Du bei Sygate prüfen.

Die scannen online Deinen Rechner und zeigen Dir die offenen Stellen. Vollkommen kostenlos.

So wie ich gesehen habe, hast Du die Datei /etc/defaults/rc.conf bearbeitet. Dies ist nicht so gut. Es ist besser, wenn Du in der Datei /etc/rc.conf angibst, dass Du eine Firewall, ein natd usw. hast.

So sieht es bei mir z.B. aus:
Code:
# /etc/rc.conf
# erstellt: 24.04.2004
# Ergaenzung:
# 09.05.2004: NAT-Daemon aktiviert
#             ntp-Daemon aktiviert
# 05.06.2004: automounter aktiviert
# 26.06.2004: PPP automatisch starten
# =====================================================================

# =====================================================================
# Netzwerk-Einstellungen
# =====================================================================

# Netzwerkkarte sf0 (Intranet)
# Aliases fuer:
# /jail/www : 192.168.1.200
# /jail/mail: 192.168.1.201
# /jail/dns : 192.168.1.202
# ----------------------------
ifconfig_sf0="inet 192.168.1.1 netmask 255.255.255.0"
ifconfig_sf0_alias0="192.168.1.200 netmask 255.255.255.255"
ifconfig_sf0_alias1="192.168.1.201 netmask 255.255.255.255"
ifconfig_sf0_alias2="192.168.1.202 netmask 255.255.255.255"
hostname="server.juergendankoweit.net"

# Netzwerkkarte sf1 (T-DSL-Modem)
# -------------------------------
ifconfig_sf1="up"

# Default-Router
# --------------
defaultrouter="192.168.1.1"

# =====================================================================
# Netzwerkdienste:
# =====================================================================

# inet-Daemon
# -----------
inetd_enable="YES"
inetd_flags="-wW -a 192.168.1.1"

# Gateway einschalten
# -------------------
gateway_enable="YES"

# portmapper-Daemon
# -----------------
portmap_enable="YES"
portmap_flags="-h 192.168.1.1"

# DNS-Dienst (bind 9)
# -------------------
named_enable="YES"
named_program="/usr/local/sbin/named"
named_flags="-u bind  -c /etc/namedb/named.conf"

# NFS
# ---
nfs_server_enable="YES"
nfs_reserved_port_only="YES"
nfs_server_flags="-u -t -n 4 -h 192.168.1.1"

# sendmail abschalten
# stattdessen postfix ueber startup-Skript starten
# ------------------------------------------------
sendmail_enable="NONE"

# SSH-Dienst
# ----------
sshd_enable="YES"

# ntp-Daemon
# ----------
xntpd_enable="YES"
xntpd_flags="-c /etc/ntpd.conf -g -p /var/run/ntpd.pid"

# =====================================================================
# Firewall-Dienst
# =====================================================================

# Firewall
# --------
firewall_enable="YES"
firewall_script="etc/firewall/firewall.sh"
firewall_logging="YES"
# tcp_drop_synfin="YES"
# log_in_vain="YES"

# NAT-Daemon
# ----------
natd_program="/sbin/natd"
natd_enable="YES"
natd_interface="tun0"
natd_flags="-dynamic -f /etc/natd/natd.conf"

# =====================================================================
# PPP automatischen starten
# =====================================================================
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="tonline"
ppp_user="root"

# =====================================================================
# Terminal-Einstellungen
# =====================================================================
 
# Textmode-Fonts und Einstellungen
# --------------------------------
font8x14="cp850-8x14"
font8x16="cp850-8x16"
font8x8="cp850-8x8"
keymap="german.iso"
keyrate="fast"
saver="logo"
scrnmap="NO"

# =====================================================================
# Kernel-Einstellungen
# =====================================================================

# Kernel-Security
# ---------------
kern_securelevel_enable="NO"

# =====================================================================
# Emulationen
# =====================================================================

# Linux-Emulation
# ---------------
linux_enable="YES"

# =====================================================================
# sonstige Dienste
# =====================================================================

# Druckdienst
# -----------
lpd_enable="YES"

# USB-Daemon
# ----------
usbd_enable="YES"

# Mouse-Daemon
# ------------
moused_enable="NO"
moused_type="NO"

# automount-Dienst
# ----------------
amd_enable="YES"
amd_flags="-a /mnt/.amd_mnt -c 10 -w 5 -l syslog /mnt/host /etc/amd.map"

Für weitere Fragen steht das Forum gerne zur Verfügung.

Viele Grüße

Jürgen
 
hallo und vielen dank für deine schnelle antwort.

die defaultwerte (/etc/defaults) habe ich nicht verändert.

auf sygate war ich mal, alles dicht.
nun gut, war ja klar, da der erste router (dsl-router router_1) ja schon ne firewall hat, die grobe sachen (ca. 60% - 80%) aller attacken abfängt.

ich werd mir mal infos bezüglich anderer "schwerer" attacken (tunneln von diensten)
sowie dos etc besorgen.
vorher hatte ich ja suse 8.2 prof benutzt und da war standardmäßig schon anti-spoofing und schutz vor flooding und dos in der firewall integriert.
(war ne schöne sache)
will mal rausfinden wie das unter fbsd geht.

bis dann
 
Also mein IPFW-Ruleset sieht momentan so aus :
Code:
#!/bin/sh
# Keine Ausgaben
fwcmd="/sbin/ipfw -q"

# Bisherige Rules saeubern
${fwcmd} -f flush
#${fwcmd} pipe flush
#${fwcmd} queue flush

# Variablen setzen
#natd_interface="rl0"
natd_interface="tun0"
lan_interface="sis0"
dns_servers="217.237.150.225 217.237.149.161 217.237.149.225 194.25.0.69 \
194.25.0.70 194.25.0.61 194.25.0.62 194.25.0.53 194.25.0.54 194.25.2.129 \
194.25.2.130 194.25.2.131 194.25.2.132 192.25.2.133"
closed_ports="0-1056,1243,1720,1999,2049,5000,6000,6776,7789,12345,20034,31337,54320,54321"

# One-pass disabled due to firewall-management
# ${fwcmd} enable one_pass

# Upload-pipe for 22 kbyte/s
${fwcmd} pipe 1 config bw 192Kbit/s

# High-Priority queue for ACK-Packets
${fwcmd} queue 1 config pipe 1 weight 100 gred 0.05/35/45/0.4

# Medium-Priority queue for DNS/Gaming/SSH
${fwcmd} queue 2 config pipe 1 weight 80 gred 0.05/35/45/0.4

# Low-Priority for the dirty rest ;)
${fwcmd} queue 3 config pipe 1 weight 40 gred 0.05/35/45/0.4

# Outgoing ACK packets go thru the hp-queue
${fwcmd} 00100 add queue 1 tcp from any to any out via ${natd_interface} tcpflags ack iplen 0-80
${fwcmd} 00110 add skipto 00200 tcp from any to any out via ${natd_interface} tcpflags ack iplen 0-80

# Outgoing DNS/Gaming/SSH traffic go thru the mp-queue
${fwcmd} 00140 add queue 2 udp from any to any out via ${natd_interface}
${fwcmd} 00150 add skipto 00200 udp from any to any out via ${natd_interface}

# The dirty rest goes thru the lp-queue
${fwcmd} 00160 add queue 3 all from any to any out via ${natd_interface}
${fwcmd} 00170 add skipto 00200 all from any to any out via ${natd_interface}

# Localhost-Traffic erlauben
${fwcmd} add 00200 allow ip from any to any via lo0

# Anti-Spoofing Rules
${fwcmd} add deny log ip from 10.0.0.0/8 to any in via ${natd_interface}
${fwcmd} add deny log ip from 172.16.0.0/12 to any in via ${natd_interface}
${fwcmd} add deny log ip from 192.68.0.0/16 to any in via ${natd_interface}

# ICMP Types 3 und 8 mal mitprotokollieren
${fwcmd} add allow log icmp from any to any in via ${natd_interface} icmptype 3
${fwcmd} add allow log icmp from any to any in via ${natd_interface} icmptype 8

# Fragmentierte Pakete verwerfen
${fwcmd} add deny all from any to any frag in via ${natd_interface}

# Network-Adress-Translation ermoeglichen
${fwcmd} add divert natd all from any to any via ${natd_interface}

# Stateful-Firewall verwenden
${fwcmd} add check-state
${fwcmd} add allow ip from any to any out via ${natd_interface} keep-state
${fwcmd} add allow ip from any to any out via ${natd_interface} setup keep-state

# Allen DNS-Servern (auch Backup-Servern) Antwortpakete erlauben
for i in ${dns_servers}
do
        ${fwcmd} add allow ip from $i 53 to any in via ${natd_interface}
done

# Sonstige Anfragen auf den ersten 1056 Ports ohne vorigen Request abweisen
${fwcmd} add unreach host-unknown all from any to any ${closed_ports} via ${natd_interface}

# Alles erlauben
${fwcmd} add allow all from any to any
Zu erst deaktiviere ich one_pass, damit ich die Pakete auch nach dem Einordnen in eine Dummynet-Pipe weiter durchschleusen kann. Nachdem also ein Paket in einer Pipe "sitzt", skippe ich zu der Localhost-Regel weiter, danach werden Scriptkiddie-Anfragen von gefaketen oder ungültigen IPs geloggt (man weiss ja nie) und danach verwerfe ich alle fragmentierten Pakete.

Und nun kommt ein Bereich an dem ich ständig am fummeln bin, weil es scheint zwar alles zu funktionieren, aber manchmal gibts da auch Aussetzer - dazu später mehr.

Ich erlaube also NATD die Pakete ordentlich zu verwalten und nutze dann die Firewall im Stateful-Modus. Alle ausgehenden Verbindungen die schon aufgebaut worden, sollen offen bleiben, dadurch kann ich z.B. von meinem Rechner aus Surfen, eMails abfragen, ICQ nutzen usw.. aber das betrifft doch eigentlich nur ausgehende Pakete. Denn mit den folgenden Regeln erlaube ich nur den Telekom-DNS-Servern auf Port 53 Pakete ins Netz zu senden, ansonsten werden die ersten 1056 Ports und die bekannten Trojaner-Ports komplett gesperrt. Was dann noch als Traffic übrig bleibt, darf dann auch durch.

Das Ruleset funktioniert so auch ganz problemfrei - alles was ich an Programmen wie ICQ oder IRC laufen lasse funktioniert einwandfrei, auch zocken funktioniert ohne Probleme, aber manchmal scheint überhaupt nichts zu funktionieren.

Wenn ich mein Windows-Rechner hochgefahren hab, sendet Samurize z.B. Anfragen ins Netz bezüglich Wettervorschau, Anzahl ungelesener eMails und aktueller externer IP. Manchmal funktioniert das einwandfrei, manchmal scheint Samurize keine Netz-Verbindung zu bekommen. Ein Ping und Surfen funktioniert aber problemlos und ich finde ums Verrecken nicht heraus, warum die Firewall manchmal erst nen kleinen "Anstoss" per Hand braucht, bevor sie so die Pakete verwaltet, wie sie soll ...

[Edit]Habe nun nach einigem Testen herausgefunden, dass die Windows 98-Rechner im Netz z.b. die ersten fünf Minuten ausser PING garnichts machen können - Surfen geht nicht, FTP nicht, Mails abrufen auch nicht, pingen können sie aber alles und jeden, woraus ich folgere, dass DNS zu funktionieren scheint, aber irgendwelche anderen Ports scheinen wohl stress zu machen. Nach fünf bis zehn Minuten funktioniert dann aber alles und ich komm ums Verrecken nicht drauf, woran das liegen könnte ...

Zumal ich mich eh wundere, warum DNS-Anfragen nicht von der Stateful-Firewall erkannt werden, also eine auf Port 53 aufgebaute Anfrage nicht beantwortet werden kann und ich dafür extra Port 53-Antworten erlauben muss.
 
Zuletzt bearbeitet:
Zurück
Oben