#!/bin/sh # # firewall-inside.sh # # Axel Pemmann, 14.03.2013, 09.12.2016 # # Übungsskript; die einzelnen Abschnitte (via Positionsparameter für die case-Verzweigung) haben folgende Aufgaben: # # a) start # Alle alten Regeln löschen; Firewall mit Stateful Packet Inspection, wobei allerdings der ssh-Zugang als # einfache statische Regel realisiert wird; weiterhin werden Regeln für die Verwendung als transparenter Proxy # im Zusammenhang mit squid3 aktiviert. # Ergänzungen in der '/etc/squid3/squid.conf': eine acl / http_access - Direktive für das umzuleitende # LAN hinzufügen, außerdem ist zusätzlich unterhalb der Direktive # # http_port 3128 # # die folgende Zeile hinzuzufügen: # # http_port 3129 intercept # # # Siehe dazu auch die Quelle: http://www.krizna.com/centos/how-to-install-squid-proxy-on-centos-6/ # Zusätzlich ist eine Beispielzeile für Deep Packet Inspection enthalten. # # b) natonly # Alle alten Regeln löschen; NAT-Router-Funktionalität ohne Firewallregeln für das LAN aktivieren # # c) open # Alle alten Regeln löschen; Firewall ist deaktiviert # extif=eth0 intif=eth1 squidsrv=10.20.30.5 squidprt=3129 gateway=10.20.30.1 flush () { iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X } fwclose () { flush iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP } fwopen () { flush iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT } natrouter () { # Aktivieren von IP-Forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # Aktivieren von NAT mit MASQUERADE, speziell sinnvoll für die Internetweinwahl bei wechselnder öffnetlicher IP iptables -t nat -A POSTROUTING -o $extif -j MASQUERADE # Aktivieren von NAT, hier allerdings mit SNAT, was u.U. performanter ist (dabei ist feste IP erforderlich) #iptables -t nat -A POSTROUTING -o $extif -j SNAT --to-source $gateway } case "$1" in start) # Standard-Policies setzen, die FORWARD-Chain wird nicht auf DROP gesetzt fwclose iptables -P FORWARD ACCEPT # Deep Packet Inspection für einen Zielserver (10.2.3.113), der Suchstring (z.B. für einen Zielordner) lautet: Write iptables -A OUTPUT -p tcp --dport 80 -d 10.20.30.3 -m string --algo bm --string "Write" -j REJECT # Einbinden der Funktion "natrouter" natrouter # Allen Verkehr über localhost erlauben iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Lokale Prozesse mit stateful-Mitteln erlauben iptables -A INPUT -i $extif -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o $extif --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT # LAN-Weiterleitung eingehend erlauben iptables -A FORWARD -i $intif -j ACCEPT # Unlimited access to LAN iptables -A INPUT -i $intif -j ACCEPT iptables -A OUTPUT -o $intif -j ACCEPT # DNAT port 80 request comming from LAN systems to squid 3128 #iptables -t nat -A PREROUTING -i $intif -p tcp --dport 80 -j DNAT --to $squidsrv:$squidprt # # If it is same system #iptables -t nat -A PREROUTING -i $extif -p tcp --dport 80 -j REDIRECT --to-port $squidprt # Unter Debian 8 und Version 3.4.8 funktioniert ds obige 'DNAT' nicht mehr, siehe dazu: # http://unix.stackexchange.com/questions/138013/routing-internet-on-nat-server-thru-squid-proxy iptables -t mangle -A PREROUTING -j ACCEPT -p tcp --dport 80 -s $squidsrv iptables -t mangle -A PREROUTING -j MARK --set-mark 8 -p tcp --dport 80 ip rule add fwmark 8 table 2 ip route add default via $squidsrv dev eth0 table 2 # Eingehend ssh für Fernadministration erlauben iptables -A INPUT -i $extif -p tcp --dport 22 -j ACCEPT # Abschließend alle Meldungen über geblockte Pakete ins Systemlog schreiben iptables -A INPUT -m limit --limit 5/m --limit-burst 7 -j LOG --log-level info --log-prefix="iptables: " ;; natonly) fwopen natrouter ;; open) fwopen ;; *) echo "Syntax: $0 {start|natonly|open}" ;; esac