{{{ #!/bin/sh # Einfache Paketfilter-Firewall für LANs # optional: ssh-Fernwartungszugriff vom Internet aus # optional: Support für transparenten Squid-HTTP-Proxy # hier das externe Interface definieren # Modem/DSL arbeitet mit ppp0, ppp1, ... # EXTIF=ppp+ # ISDN arbeitet mit ippp0, ippp1, ... # EXTIF=ippp+ EXTIF=ippp+ # meine eigene (interne) IP # kann man mit ifconfig ermitteln, z.B. eth1 -> 10.10.10.1 oder eben 192.168.100.1 MYIP=192.168.100.1 # _____ #Incoming / \ Outgoing # -->[Routing ]--->|FORWARD|-------> # [Decision] \_____/ ^ # | | # v ____ # ___ / \ # / \ |OUTPUT| # |INPUT| \____/ # \___/ ^ # | | # ----> Local Process ---- # "gefälschte" IP-Adressen verhindern: for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done # setzen der Policy der Standard-Regelketten # von aussen nach innen wird eine "deny all, allow some"-Strategie verwendet iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # löschen aller bereits definierten Regeln (flush) iptables -F INPUT iptables -F FORWARD iptables -F OUTPUT # neue Regelkette "no-conns-from-extif" anlegen iptables -N no-conns-from-extif # falls es "no-conns-from-extif" schon gab: leeren per flush iptables -F no-conns-from-extif # icmp-Pakete (z.B. ping) generell zulassen (nur für nicht-DoS-gefährdete Anwendung) iptables -A no-conns-from-extif -p icmp -j ACCEPT # lo-Interface zulassen iptables -A no-conns-from-extif -i lo -j ACCEPT # Pakete, die zu bereits bestehenden Verbindungen gehören (oder damit zusammenhängen) erlauben iptables -A no-conns-from-extif -m state --state ESTABLISHED,RELATED -j ACCEPT # neue Verbindungen nur dann erlauben, wenn sie NICHT über das externe Interface reinkommen iptables -A no-conns-from-extif -m state --state NEW -i ! $EXTIF -j ACCEPT #optional: ssh-Port nach außen aufmachen für Fernwartung vom Internet aus #iptables -A no-conns-from-extif -m state --state NEW -i $EXTIF -p tcp --dport 22 -j ACCEPT #optional: Port 80 nach außen aufmachen für Webserver #iptables -A no-conns-from-extif -m state --state NEW -i $EXTIF -p tcp --dport 80 -j ACCEPT #optional: VNC für mehrere Rechner im LAN #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5800 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5900 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5801 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5802 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5902 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5803 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5903 -j ACCEPT #optional: PC-Anywhere ab >= 9.0 #iptables -A no-conns-from-extif -i $EXTIF -p tcp -m state --state NEW -m tcp --dport 5631 -j ACCEPT #iptables -A no-conns-from-extif -i $EXTIF -p udp -m udp --dport 5632 -j ACCEPT # unerwünschte Pakete in's Log schreiben (max. aber 1 Eintrag pro Sekunde, um DoS zu verhindern) iptables -A no-conns-from-extif -i $EXTIF -m limit --limit 1/sec -j LOG --log-prefix "Bad packet from $EXTIF :" iptables -A no-conns-from-extif -i ! $EXTIF -m limit --limit 1/sec -j LOG --log-prefix "Bad packet not from $EXTIF :" # ... und verwerfen (würde auch ohne Regel durch Policy passieren). iptables -A no-conns-from-extif -j DROP # PaketFilter-Regelkette für hereinkommende und durchlaufende Pakete anspringen. iptables -A INPUT -j no-conns-from-extif iptables -A FORWARD -j no-conns-from-extif # _____ _____ # / \ / \ # PREROUTING -->[Routing ]----------------->POSTROUTING-----> # \D-NAT/ [Decision] \S-NAT/ # | ^ # | | # | | # | | # | | # | | # | | # --------> Local Process ------ # Modul für NAT laden modprobe iptable_nat # Masquerading (spezielle Form von SNAT) aktivieren iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE #optional: VNC-Zugriff auf internen PC #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5800 -j DNAT --to-destination 192.168.100.2:5800 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5900 -j DNAT --to-destination 192.168.100.2:5900 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5801 -j DNAT --to-destination 192.168.100.14:5800 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5901 -j DNAT --to-destination 192.168.100.14:5900 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5802 -j DNAT --to-destination 192.168.100.15:5800 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5902 -j DNAT --to-destination 192.168.100.15:5900 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5803 -j DNAT --to-destination 192.168.100.16:5800 #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5903 -j DNAT --to-destination 192.168.100.16:5900 #optional: PC-Anywhere-Zugriff (ab PCA >=9) auf internen PC #iptables -t nat -A PREROUTING -i $EXTIF -p tcp -m tcp --dport 5631 -j DNAT --to-destination 192.168.100.2:5631 #iptables -t nat -A PREROUTING -i $EXTIF -p udp -m udp --dport 5632 -j DNAT --to-destination 192.168.100.2:5632 # IP-Forwarding einschalten echo 1 > /proc/sys/net/ipv4/ip_forward # optional: # sende hereinkommende Port-80 Web-Zugriffe auf unseren (transparenten) Squid Proxy # iptables -t nat -A PREROUTING -p tcp -d ! $MYIP --dport 80 -j REDIRECT --to-port 3128 # bitte beachten: Squid muss entsprechend konfiguriert werden, damit er weiss, # dass er ein transparenter Proxy ist! # squid.conf (für Squid v2.3): # http_port 3128 # httpd_accel_host virtual # httpd_accel_port 80 # httpd_accel_with_proxy on # httpd_accel_uses_host_header on # # Squid v2.4 benötigt zusätzlich diese Zeile: # httpd_accel_single_host off }}} Anmerkungen und Erfahrungsberichte bitte hier: * das Skript ist mittlerweile im Einsatz und hat auch nen Portscan von aussen gut überstanden. * Eine Gewähr wird natürlich nicht übernommen B) -- ThomasWaldmann = nachträglich weiteren Port öffnen = Was genau muss man tun, um einen weiteren Port zu öffnen? (Sollte man sowas eigentlich tun?) Wenn man z.B. auch für eingehende Anrufe (OpenH323) den Port 1720 öffnen will? /!\ Was jetzt kommt sind nur Vorschläge eines LinuxLaien mit der Bitte an LinuxProfi``s, diese zu überprüfen, ggf. zu verbessern: Im Skript sind ja schon so ähnliche Zeilen auskommentiert. Man müsste also wohl reinzuschreiben: {{{ iptables -A no-conns-from-extif -m state --state NEW -i $EXTIF -p tcp --dport 1720 -j ACCEPT }}} {{{ /etc/init.d/iptables save active }}} Das Ergebnis kann man sich in {{{/var/lib/iptables/active}}} anschauen. Sollte es dort doppelte Einträge geben, kann man diese entfernen und bei Gelegenheit neu booten. ---- siehe auch PortForwarding, FireWall