Diese Anleitung ist etwas überholt und bedarf der Überarbeitung!
Erstellung einer FreeBSD Firewall für den Internet-Zugriff über DSL
Der Anleitung einfach Schritt für Schritt folgen.
Es ist wichtig das die Punkte nacheinander in der beschriebenen Reihenfolge abgearbeitet werden. Sonst kommen einige Sachen durcheinander oder werden vergessen, und dann klappt es nicht!
0. Vorraussetzungen und Vorbereitung:
Aufschreiben (#> ifconfig -a):
Welchens Device ist LAN und WAN!
z.b. LAN = dc0, WAN = dc1
1. FreeBSD Installieren
Standard durchgehen, kein anonymous ftp, kein inetd aktivieren
2. DSL Einrichten
2.1 Zugansdaten
#> cd /etc/ppp
#> edit ppp.conf
default:
# PPP over Ethernet
set device PPPoE:dc3 # Hier das WAN-Interface eintragen
set speed sync
set mru 1492
set mtu 1492
set ctsrts off
accept lqr # Überwachung der Verbindungsqualität
disable vjcomp
disable acfcomp
disable protocomp
set log phase tun Warning Error Alert # Diverse Logging-Funktionen
add default HISADDR # Setzen der Route zur IP des Providers
enable dns # Eintrag des Provider-DNS in die /etc/resolve.conf
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
set authname XXXXXXX # Benutzername
set authkey XXXXXXXX # Kennwort
Nach dem speichern vor den Augen anderer schützen!
#> chmod 600 ppp.conf
2.2 Verbindung testen
#> ppp -ddial
Nun mit einem Ping, z.B. auf www.heise.de, probieren ob man online ist.
2.3 Automatischer Start beim booten und halten der Verbindung
#> edit /etc/rc.conf
ppp_enable="YES"
ppp_nat="NO"
ppp_mode="ddial"
ppp_profile="default"
3. Auf aktuellen Stand bringen #1
3.1 cvsup-without-gui installieren
#> pkg_add -r cvsup-without-gui
#> pkg_add -r portupgrade
#> rehash
3.2 Ports updaten
#> cp /usr/share/examples/cvsup/ports-supfile /usr/ports/
#> cd /usr/ports
#> edit ports-supfile
*default host=cvsup2.de.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
*default compress
ports-all
#> cvsup -L 2 ports-supfile
4. DNS-Server
4.1 Einfache Weiterleitung an externen DNS
#> cd /etc/namedb
#> edit namedb.conf
options {
directory "/etc/namedb";
pid-file "/var/run/named/pid";
forward only;
forwarders {
212.185.253.136; # HINT: Hier den DNS des Providers eintragen
194.25.2.129; # HINT: Hier den 2. DNS des Providers eintragen
};
query-source address * port 53;
notify no;
listen-on {
192.168.1.1; # HINT: Hier die eigene IP eintragen
127.0.0.1;
};
};zone "." {
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA"
type master;
file "localhost-v6.rev";
};
#> chmod 744 make-localhost
#> ./make-localhost
#> chmod 644 make-localhost
#> edit /etc/rc.conf
named_enable="YES"
named_flags="-u bind -g bind"
4.2 Eigene Rechner in den DNS eintragen
Es sollen ja auch die eigenen Computer im Netzwerk, oder zumindest die wichtigsten (die mit z.b. einer festen IP) per Name angesprochen werden können.
#> edit /etc/namedb/named.conf
zone "bsdbox.de" {
type master;
file "bsdbox.de.zone";
};
zone "0.168.192.in-addr.arpa" {
type master;
file "1.168.192.in-addr.arpa.rev";
};
#> edit /etc/named/bsdbox.de.zone
$TTL 3D
@ 3600 IN SOA firewall.bsdbox.de. root.firewall.bsdbox.de. (
233
900
00
86400
3600 )
NS firewall
firewall 600 IN A 192.168.1.1
ccnc 3600 IN A 192.168.1.100
www 3600 IN A 192.168.1.111
knecht 3600 IN A 192.168.1.112
#> edit 1.168.192.in-addr.arpa.rev
$TTL 3D
@ 3600 IN SOA firewall.bsdbox.de. root.firewall.bsdbox.de. (
7
900
600
86400
3600 )
3600 IN NS firewall.bsdbox.de.
1 600 IN A firewall.bsdbox.de.
100 3600 IN A ccnc.bsdbox.de.
111 3600 IN A www.bsdbox.de.
112 3600 IN A knecht.bsdbox.de.
5. DHCP-Server
#> cd /usr/ports/net/isc-dhcp3-server/
#> make install clean
#> edit /usr/local/etc/dhcpd.conf
option domain-name "bsdbox.de";
option domain-name-servers firewall.bsdbox.de;
default-lease-time 86400; # 1 Tag
max-lease-time 604800; # 1 Woche
authoritative;
ddns-update-style ad-hoc;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.200 192.168.1.220;
option routers 192.168.1.1;
option broadcast-address 192.168.1.255;
}
# host BEISPIEL {
# hardware ethernet 00:00:00:00:00:00;
# fixed-address 192.168.1.201;
# }
#> edit /etc/rc.conf
dhcpd_enable="YES"
dhcpd_flags=""
dhcpd_conf="/usr/local/etc/dhcpd.conf"
dhcpd_ifaces="xl0" # Auf diese Netzwerkkarte hört der DHCP
6. NATD
#> edit /etc/rc.conf
natd_enable="YES"
natd_interface="tun0"
natd_flags="-dynamic -f /etc/natd.conf"
#> touch /etc/natd.conf
7. Wenn nun alles eingerichtet ist
#> edit /etc/ppp/ppp.conf
enable dns # Eintrag des Provider-DNS in die /etc/resolve.conf
in
# enable dns # Eintrag des Provider-DNS in die /etc/resolve.conf
umändern.
#> edit /etc/resolve.conf
Vorhandene Nameserver löschen und stattdessen:
nameserver 127.0.0.1
eintragen
8. Dienste an interne Rechner weiterleiten.
Wenn z.B. ein Webserver oder gar ein ftp intern steht, muss man die entsprechenden Ports weiterleiten. z.B.:
#> edit /etc/natd.conf
redirect_port tcp 192.168.1.111:80 80 # HTTP
redirect_port udp 192.168.1.111:80 80 # HTTP
redirect_port tcp 192.168.1.111:21 21 # FTP
redirect_port udp 192.168.1.111:21 21 # FTP
Das Natd wird erst funktionieren, wenn die Kernel neu kompiliert wurde!
9. Auf aktuellen Stand bringen #2
9.1 Screen installieren
Gerade bei langsamen Rechner dauert das compilieren der Programme mitunter doch recht lange. Damit keine Verbindungsabbrüche oder andere Zwischenfälle dies unterbrechen, empfiehlt sich das Programm “Screen” Es hält eine Session aufrecht auch wenn die Verbindung getrennt wurde. Dieser Punkt kann übersprungen werden, wenn lokal an der Maschine gearbeitet wird.
#> cd /usr/ports/misc/screen
#> make install clean
#> rehash
#> screen
Sollte die Verbindung nun unterbrochen worden sein, kann nach einem erneuten Login mit
#> screen -r die “alte” Session wieder herangeholt werden. Praktische Sache das
9.2 System-Sourcen
#> cp /usr/share/examples/cvsup/standard-supfile /usr/src/
#> cd /usr/src
#> edit standard-supfile
*default host=cvsup2.de.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_5_2
*default delete use-rel-suffix
*default compress
src-all
#> cvsup -L 2 standard-supfile
10.Firewall installieren
10.1 Kernel
Die Kernel-Konfiguration bearbeiten:
#> cd /usr/src/sys/i386/conf/
#> cp GENERIC firewall
#> edit firewall
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPDIVERT
options TCP_DROP_SYNFIN # To hide from nmap, remove if create web server
options IPSTEALTH # To hide firewall from traceroute
options DUMMYNET # enables the "dummynet" bandwidth limiter.
Wen dies in den Kernel eingebunden und aktiviert ist, ist per default erstmal ALLES blockiert! Es gibt nur eine Regel:
65534 add deny ip from any to any
10.2 Kernel bauen und installieren
#> config firewall
Kernel build directory is ../compile/firewall
Don’t forget to do a “make depend”
#> cd ../compile/firewall
#> make depend && make all install
10.3 Konfiguration der Firewall
#> edit /etc/rc.conf
firewall_enable=”YES”
firewall_script=”/etc/ipfw.conf”
firewall_logging=”YES”
#> edit /etc/ipfw.conf
#!/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="xl0" # ${int_interface} Internes Interface
natd_interface="tun0" # ${natd_interface} Externes Interface
dns_server1="212.185.253.136" # ${dns_server1} 1. DNS-Server des ISP
dns_server2="194.25.2.129" # ${dns_server2} 2. DNS-Server des ISP
open_tcpports="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
#> edit /etc/syslog.conf
# IPFW
!ipfw
*.* /var/log/firewall.log
11. Absichern
#> edit /etc/sysctl.conf
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
#> edit /etc/rc.conf
syslogd_flags=”-ss”
kern_securelevel_enable=”YES”
kern_securelevel=”1″
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
12. Neustarten und viel Spass