# 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 -- 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 LinuxProfis, 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