# 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:

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

PaketFilter/MasqueradeSshProxy (zuletzt geändert am 2007-12-23 22:47:11 durch localhost)