Konfiguration NAT und Firewall
NAT benötigt unbedingt den NAT-Daemon. Dieser Dienst nimmt von der Firewall "Pakete" entgegen, übersetzt die Adressen und wirft das Paket wieder "zurück" ... Bildlich gesehen :-)
Der NAT Daemon wird einfach in der /etc/rc.conf konfiguriert und dann gestartet. Der Dienst selbst macht ja nicht viel und wird quasi nur vom IPFW aus gesteuert
natd_enable=YES natd_interface=em1 natd_flags="-dynamic -m"
Danach mittels /etc/rc.d/natd start den Dienst starten. Damit das aber auch klappt, müssen wir den Host als Router kennzeichnen. Das geht wieder in der /etc/rc.conf mittels
gateway_enable=YES
Sollte das noch nicht drinstehen, bitte Rebooten, weil sonst kann man es nicht gleich testen
Als nächstes schauen wir uns die Firewall an. Dazu erstelle ich immer eine /etc/fwruleset wo ich die Regeln einpflege. Aber zuerst aktivieren wir es in der /etc/rc.conf und zwar wie folgt
firewall_enable=YES
firewall_type=/etc/fwruleset
firewall_logging=YES
Danach erstellen wir eine /etc/fwruleset und definieren die Regeln :
add 30101 allow ip from any to any via lo0
add 30201 allow ip from any to any via em0
add 30301 allow tcp from me to any via em1 keep-state
add 30302 allow udp from me to any via em1 keep-state
add 30303 allow icmp from me to any via em1 keep-state
add 30401 divert natd ip from any to any in via em1
add 30501 skipto 40001 icmp from 10.0.0.0/24 to any keep-state
add 30502 skipto 40001 tcp from 10.0.0.0/24 to any keep-state
add 30503 skipto 40001 udp from 10.0.0.0/24 to any keep-state
add 30999 deny log all from any to any
add 40001 divert natd ip from any to any out via em1
add 40002 allow ip from any to any
Was passiert da ?
Die Regel 30101 erlaubt die Kommunikation über das Loopback. Die Regel 30201 erlaubt jede Kommunikation auf dem internen Interface, und die Regeln 30301, 30302 und 30303 erlaubt die uneingeschränkte Kommunikation von der Firewall selbst ins Internet Netzwerk
Die Regel 30401 leitet alle ankommenden Pakete aus dem Internet an den NAT Daemon weiter. Der NAT schaut dann in seine Tabellen und ersetzt möglicherweise die Destination Adresse, er Translatet die dann
Die Regeln 30501, 30502, 30503 legen fest, welcher der internen Hosts mit dem Internet sprechen dürfen und wie. Wenn einer dieser Regeln greift spring der IPFW zu Regel 40001. Dort können dann diverse Filter eingepflegt werden. Also zum Beispiel der Host 10.0.0.42 darf nur mit TCP Port 80 raus. Oder so. In meinen Regeln darf jeder alles
Alles was nicht mehr passt wird gnadenlos in Regel 30999 gekillt.
Die Regel 40001, die von einem erlaubten Paket aufgerufen wird leitet dieses jene welches weiter zum NAT. Das NAT ersetzt die Quell IP mit der IP auf em1 und speichert diese Verbindung in einer Liste. Nach dem Translate setzt IPFW weiter fort mit Regel 40002 die alles erlaubt. Das Paket geht also genattet auf reisen.
Es wird also quasi zweimal genattet. In Regel 40001 wird ein Outgoing-NAT gemacht, in Regel 30401 ein Incoming-NAT
Um das ganze zu testen kann die Firewall manuell reloaded werden mittels
echo y | ipfw flush; ipfw /etc/fwruleset
Achtung der Befehl ist nur für das Testen !!!!! NIEMALZ dieses Ding in Produktion verwenden ... es wirft nähhhhhhhmlich ein paar recht wichtige Regeln in Bezug auf IPv6 weg ...
Später sollte man die Regel in die Datei einfügen, und danach aus der gespeicherten Datei sich die Zeile per Copy And Paste in die Kommandozeile holen und dort mit ipfw ausführen. Dann kann man sicher sein das die Zeile beim Booten auch kein Ärger macht
Ok Was jetzt noch fehlt ist die Sache Boot fest zu machen. Leider wird der NAT Dienst erst nach der Firewall gestartet (FreeBSD 8.2). Das bedeutet das zum Zeitpunkt der Firewall das NAT noch nicht aktiv ist und das Script volle Pulle gegen die Wand ballert ... Mit Getöse und so ...
Um das Problem zu umgehen laden wir beim Booten gleich das Divert Modul und dann ist alles toll. In der /boot/loader.conf trägt man also noch schnell die zwei Zeilen ein
ipfw_load="YES"
ipdivert_load="YES"
Danach rebootet man mal und schaut ob er alles läd so wie man will. Technisch gesehen sollte unsere Firewall jetzt eigentlich schon Natten können und die Verbindungen müssten gehen. Probiert mal ... es geht schon ^^
Und wer noch mehr aus seiner Firewall machen will liest einfach weiter ... wenn er will ... aber nur wenn er will ... ansonsten nicht ... keiner wird gezwungen ... ehrlisch net ... :-)