natd und ipfw - Bitte um Hilfe

_jo

Well-Known Member
Hallo,

nach der Einleitung von asg hier im Forum und von marzl
(http://www.bsdbox.de/firewall.html)
hab ich den Versuch gestartet meinen Router auf FreeBSD umzustellen.
An dieser Stelle vielen Dank an euch beiden für die Anleitungen, sie
waren mir sehr hilfreich.

Ein Problem trat jedoch auf, was ich versucht hab in den letzten Tagen
zu lösen und um das ich euch um Hilfe bitte:

Ich habe nat mittels IPDIVERT im KERNEL ermöglicht und in der rc.conf
starten lassen, aber trotzdem deutet alles darauf hin, dass es nicht richtig
aktiviert wird... :/

Das erste Mal beunruhigt wurde ich, als bei mir im LAN auf keinem Klienten
mehr der Internetzugriff ging, sobald ich die Zeile
Code:
ppp_nat="NO"
in die rc.conf hinzufügte.
Zusätzlich kam es in den letzten Tagen zu vielen Fehlfunktionen mit ipfw,
so dass ich weitere Nachforschungen angestellt hab.

1. Dmesg liefert mir folgende Fehlermeldungen:
Code:
IP packet filtering initialized, divert disabled, rule-based forwarding enabled, default to deny, logging disabled
ip_fw_ctl: invalid command

2. Starte ich das Regelset (ist identisch mit dem dynamischen von marzl)
so bekomme ich folgendes zu sehen:
Code:
fileserver# /etc/ipfwrules
ip_fw_ctl: invalid command
ipfw: getsockopt(IP_FW_ADD): Invalid argument
ipfw: unknown argument ``established''

Der Stand ist, dass wenn ich ppp_nat="NO" auskommentiere aus der rc.conf,
dann funktioniert das Internet im LAN, jedoch gibt es dann viele Probleme
mit ipfw zum Beispiele werden Dienste nicht abgeschirmt oder portforwading
geht nicht.
Auf dem Server läuft FreeBSD 4.10-RELEASE-p2, welches ich von einem 4.8
geupgraded hab (mittels make build&installworld).

Weiter unten hab ich ein paar Debug-Informationen angehängt, die vielleicht
hilfreich sein können.
Ich bin hier echt schon ein wenig verzweifelt und freue mich über jede Hilfe!
mfg
jo



Code:
fileserver# cat /etc/rc.conf

# -- sysinstall generated deltas -- # Sat Jul 12 23:35:57 2003
# Created: Sat Jul 12 23:35:57 2003
# Enable network daemons for user convenience.
# Please make all changes to this file, not to /etc/defaults/rc.conf.
# This file now contains just the overrides from /etc/defaults/rc.conf.
hostname="fileserver.jotech.lan"
gateway_enable="YES"
ifconfig_txp0="inet 192.168.10.1  netmask 255.255.255.0"
ifconfig_xl0="up"
#
kern_securelevel_enable="NO"
firewall_enable="YES"
#firewall_type="OPEN"
firewall_script="/etc/ipfwrules"
firewall_logging="YES"
linux_enable="YES"
nfs_client_enable="YES"
nfs_reserved_port_only="YES"
nfs_server_enable="YES"
portmap_enable="YES"
mountd_flags="-r"
sendmail_enable="NO"
usbd_enable="NO"
inetd_enable="NO"
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="default"
ppp_nat="NO"
natd_program="/sbin/natd"
natd_enable="YES"
natd_interface="tun0"
natd_flags="-dynamic -f /etc/natd.conf"
named_enable="YES"
named_flags="-u bind -g bind"
syslogd_enable="YES"
syslogd_flags="-ss"
tcp_extensions="NO" # disables RFC 1323
tcp_drop_synfin="YES" # ignore TCP frames that have both the SYN and FIN flags set
tcp_keepalive="NO" # disable probing idle TCP connections
icmp_drop_redirect="YES" # ignore ICMP REDIRECT packets.
icmp_bmcastecho="NO" # disable respond to broadcast ping packets



Code:
fileserver# sysctl -a net.inet.ip
net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 1024
net.inet.ip.portrange.last: 5000
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535
net.inet.ip.portrange.randomized: 1
net.inet.ip.forwarding: 1
net.inet.ip.redirect: 1
net.inet.ip.ttl: 64
net.inet.ip.rtexpire: 3600
net.inet.ip.rtminexpire: 10
net.inet.ip.rtmaxcache: 128
net.inet.ip.sourceroute: 0
net.inet.ip.intr_queue_maxlen: 50
net.inet.ip.intr_queue_drops: 0
net.inet.ip.accept_sourceroute: 0
net.inet.ip.fastforwarding: 0
net.inet.ip.keepfaith: 0
net.inet.ip.gifttl: 30
net.inet.ip.subnets_are_local: 0
net.inet.ip.maxfragpackets: 78
net.inet.ip.maxfragsperpacket: 16
net.inet.ip.sendsourcequench: 0
net.inet.ip.check_interface: 0
net.inet.ip.fw.enable: 1
net.inet.ip.fw.one_pass: 1
net.inet.ip.fw.debug: 1
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.verbose_limit: 0
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_count: 197
net.inet.ip.fw.dyn_max: 1000
net.inet.ip.fw.static_count: 23
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_grace_time: 10



Code:
fileserver# cat /etc/ipfwrules
#!/bin/sh
#
# Erstmal alles saubermachen bevor wir anfangen

# Also die Regeln auf "Null" stellen
/sbin/ipfw -q -f flush

# IPFW-Kommando "Quiet"
fwcmd="/sbin/ipfw -q add"

# Das setzen unserer eigenen Variabeln
int_interface="txp0" # ${int_interface} Internes Interface
natd_interface="tun0" # ${natd_interface} Externes Interface
dns_server2="194.25.2.130" # ${dns_server1} 1. DNS-Server des ISP
dns_server1="194.25.2.129" # ${dns_server2} 2. DNS-Server des ISP
open_tcpports="" # 22,80,21,22,25,80,443,465,993,49152-65535" ${open_tcpports} Offene Ports
open_udpports="" # 7777,7778,7787,28902" ${open_udpports} Offene Ports

# Erlaubt Loopbackverbindungen
${fwcmd} 00100 allow ip from any to any via lo0

# Hiermit dürfen alle ins Internet
${fwcmd} 00150 divert natd all from any to any via ${natd_interface}

# Stateful Packet Inspection
${fwcmd} 00200 check-state

# Erlaubt internen Verkehr
${fwcmd} 00210 allow ip from any to any via ${int_interface} keep-state

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

# Fragmentiert Packete werden verworfen
${fwcmd} 00250 deny all from any to any frag in via ${natd_interface}

# Ack Packete ohne vorheriges Req werden geblockt
${fwcmd} 00260 deny tcp from any to any established in via ${natd_interface}

# Erlaubt alle Verbindungen welche von hier initiiert wurden
${fwcmd} 00300 allow tcp from any to any out via ${natd_interface} setup keep-state
${fwcmd} 00310 allow udp from any to any out via ${natd_interface} keep-state

# Wenn die Verbindung einmal hergestellt wurde, erlaube dieser offen zu stehen
${fwcmd} 00320 allow tcp from any to any via ${natd_interface} established
${fwcmd} 00330 allow udp from any to any via ${natd_interface} established

# Erlaubte Dienste die ausm Internet erreicht werden dürfen
${fwcmd} 00400 allow tcp from any to any ${open_tcpports} setup keep-state
${fwcmd} 00410 allow udp from any to any ${open_udpports} keep-state

# This sends a RESET to all ident packets.
${fwcmd} 00500 reset log tcp from any to me 113 in via ${natd_interface}

# Erlaubt ausgehende DNS queries NUR auf angegebenem DNS-Server
${fwcmd} 00600 allow udp from any to ${dns_server1} 53 out via ${natd_interface} keep-state
${fwcmd} 00610 allow tcp from any to ${dns_server1} 53 out via ${natd_interface} setup keep-state
${fwcmd} 00620 allow udp from any to ${dns_server2} 53 out via ${natd_interface} keep-state
${fwcmd} 00630 allow tcp from any to ${dns_server2} 53 out via ${natd_interface} setup keep-state

# Loggt ICMP Anfragen (echo und dest. unreachable) == script kiddies
${fwcmd} 00700 allow log icmp from any to any in recv ${natd_interface} icmptype 3
${fwcmd} 00710 allow log icmp from any to any in recv ${natd_interface} icmptype 8

# ICMP erlauben
${fwcmd} 00750 allow icmp from any to any

# Alles andere verbieten (Wird nicht geloggt)
${fwcmd} deny ip from any to any
 
Wieso nimmst du nicht das interne NAT von ppp?

Und kann es sein, dass du im Kernel IPFW2 hast, aber dein Userland nicht für IPFW2 gebaut hast?
 
Setze Deine "divert rule", die als zweites gesetzt wird (150) an die erste Stelle (sprich es soll die erste rule sein die in Deiner IPFW Configuration gesetzt ist und auch aufgerufen wird).
 
Hi,
danke für eure Antworten.

Ich hab in der rc.conf ppp_nat="YES" und natd_enable="NO" gesetzt und die
divert-Regel mit dem Index 100 versehen, so dass sie zuerst ausgeführt wird.

Das Internet funktioniert so im LAN, bloß mit ipfw gibt es wieder die Probleme...
Wenn ich mich z.B. von außen scanne (http://scan.sygate.com/quickscan.html),
dann ist der ssh-Port auf, bzw. udp 53 für den Nameserver. Eigentlich sollten
die doch deaktiviert sein?! (laut der Regeldatei für ipfw)

Die Fehlermeldung ist im übrigen immer noch:
Code:
IP packet filtering initialized, divert disabled, rule-based forwarding enabled, default to deny, logging disabled
ip_fw_ctl: invalid command

Interessant ist auch, dass ein ipfw list folgendes anzeigt:
Code:
00150 allow ip from any to any via lo0
00200 check-state
00210 allow ip from any to any keep-state via txp0
00220 deny log ip from 10.0.0.0/8 to any in recv tun0
00230 deny log ip from 172.16.0.0/12 to any in recv tun0
00240 deny log ip from 192.68.0.0/16 to any in recv tun0
00250 deny ip from any to any in recv tun0 frag
00260 deny tcp from any to any in recv tun0 established
00300 allow tcp from any to any keep-state out xmit tun0 setup
00310 allow udp from any to any keep-state out xmit tun0
00320 allow tcp from any to any via tun0 established
00400 allow tcp from any to any keep-state setup
00410 allow udp from any to any keep-state
00500 reset log tcp from any to me 113 in recv tun0
00600 allow udp from any to 194.25.2.129 53 keep-state out xmit tun0
00610 allow tcp from any to 194.25.2.129 53 keep-state out xmit tun0 setup
00620 allow udp from any to 194.25.2.130 53 keep-state out xmit tun0
00630 allow tcp from any to 194.25.2.130 53 keep-state out xmit tun0 setup
00700 allow log icmp from any to any in recv tun0 icmptype 3
00710 allow log icmp from any to any in recv tun0 icmptype 8
00750 allow icmp from any to any
00850 deny ip from any to any
65535 deny ip from any to any

Die nat-Regel (divert) scheint komplett ausgesetzt zu werden, oder?

Im Kernel habe ich eigentlich ipfw1 eingestellt:

Code:
options         IPDIVERT                # nat
options         IPFIREWALL              # ipfw
options         IPFIREWALL_VERBOSE      # loggen von Paketen mit syslog
options         IPFIREWALL_VERBOSE_LIMIT=100 # loggen begrenzen (dos)
options         NETGRAPH                # dsl
options         NETGRAPH_SOCKET         # "
options         NETGRAPH_PPPOE          # "
options         NETGRAPH_ETHER          # "
options         IPSTEALTH               # hide firewall from traceroute
options         DUMMYNET                # dummy bandwidth limiter


Kann es sein, dass durch das "make world"-Update von 4.8 auf 4.10p2
irgendwas total durcheinander gekommen ist?
mfg
johannes
 
@_jo
Ok, das irgendwas nicht stimmt ist klar ;-).
Lädst Du evtl. ipfw als Modul nochmals?

Deine divert Regel muss als erstes kommen, und wird dann auch mit "ipfw list" angezeigt:
Code:
nummer1# ipfw list
00010 divert 8668 ip from any to any via tun0
[...]

ipfw code dazu:
Code:
ipfw add 10 divert natd all from any to any via tun0
Muss also die erste rule sein die geladen wird.

Schalte das "ppp_nat" mal wieder aus, und lasse nur den "natd" rennen (wie in der rc.conf angegeben).
Stimmen denn die Pfade der natd.conf und Deiner Firewall Config?
 
Hallo asg,

füge ich die divert-Regel hinzu, dann kommt ja gerade die Fehlermeldung, die
ich gepostet hatte. Daraus schloss ich ja, dass nat die Fehlerursache ist:

Code:
fileserver# ipfw add 10 divert natd all from any to any via tun0
ipfw: getsockopt(IP_FW_ADD): Invalid argument
In den Regeln von ipfw taucht es dadurch auch nicht auf.

In der /boot/loader.conf ist nur userconfig_script_load aktiviert mehr
nicht.

mfg
jo
 
Ich hab das Problem jetzt in den Griff bekommen, bloß komisch bleibt das
Ganze allemal...
Ich hab mir den Generic-Kernel genommen und sämtliche Änderungen, die
ich vorher auch gemacht hab dort eingetragen und mit der alten Methode
den Kernel dann erstellt.
Und siehe da nach einem Neustart kam aufeinmal:
Code:
IP packet filtering initialized, divert enabled, rule-based forwarding enabled, default to deny, logging limited to 100 packets/entry by default
Ipfw läuft und reagiert jetzt, wie in den Anleitungen beschrieben, Danke ;)


Zwei kleine Fragen hab ich dann allerdings noch:

a) Beim Starten von ipfw erhalte ich noch immer die Meldung
Code:
ipfw: unknown argument ``established''
Das betrifft die beiden Zeilen in den ipfw-Regeln, die ich so von
marzl übernommen habe:
Code:
${fwcmd} 00320 allow tcp from any to any via ${natd_interface} established
${fwcmd} 00330 allow udp from any to any via ${natd_interface} established
Wie kann ich das beseitigen bzw. wie lautet das richtige Argument?


b) Auf der Suche nach dem Unterschied zwischen dem tun0-Interface und der
wan-Karte hab ich mal tcpdump laufen lassen und den Verkehr über beide
mitgeschnitten und verglichen. Dabei ist mir aufgefallen, dass fast alles
identisch war bis auf die Echo-Request-Anfragen, welche nur von der
wan-Karte aufgezeichnet wurden:
Code:
18:36:59.656959 PPPoE  [ses 0x6e0] Echo-Req(21), Magic-Num=0141f87d
18:36:59.657313 PPPoE  [ses 0x6e0] Echo-Rep(21), Magic-Num=08c49b5b
Kann mir einer erklären, wieso die nur über die wan-Karte aber nicht auch über
tun laufen?

Vielen Dank,
jo
 
Zurück
Oben