#!/bin/sh # ***************************************************** # * use /etc/init.d/iptables reconnect in ip-up.d * # ***************************************************** TC=/usr/local/sbin/tc test -x /sbin/iptables || exit 0 unset RUNNING if iptables -L LSERV >/dev/null 2>&1; then RUNNING=1; fi shaper_on () { if [ -x $TC ]; then # HTB: $TC qdisc add dev ppp0 root handle 1: htb default 40 CLASS="$TC class add dev ppp0 parent" $CLASS 1: classid 1:1 htb rate 128kbit burst 16k $CLASS 1:1 classid 1:10 htb rate 96kbit ceil 128kbit burst 16k $CLASS 1:1 classid 1:20 htb rate 16kbit ceil 128kbit burst 16k $CLASS 1:1 classid 1:30 htb rate 8kbit ceil 128kbit burst 16k $CLASS 1:1 classid 1:40 htb rate 7kbit ceil 128kbit burst 16k $CLASS 1:1 classid 1:50 htb rate 1kbit ceil 40kbit burst 4k # SFQ: $TC qdisc add dev ppp0 parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev ppp0 parent 1:20 handle 20: sfq perturb 10 $TC qdisc add dev ppp0 parent 1:30 handle 30: sfq perturb 10 $TC qdisc add dev ppp0 parent 1:40 handle 40: sfq perturb 10 $TC qdisc add dev ppp0 parent 1:50 handle 50: sfq perturb 10 # Paket-Verteiler: HANDLE="$TC filter add dev ppp0 protocol ip parent 1:0 prio 1 handle" $HANDLE 10 fw flowid 1:10 $HANDLE 20 fw flowid 1:20 $HANDLE 30 fw flowid 1:30 $HANDLE 40 fw flowid 1:40 $HANDLE 50 fw flowid 1:50 # Downstream: $TC qdisc add dev ppp0 handle ffff: ingress $TC filter add dev ppp0 parent ffff: protocol ip prio 60 u32 match ip \ src 0.0.0.0/0 police rate 980kbit burst 10k drop flowid :1 fi } shaper_off () { if [ -x $TC ]; then $TC qdisc del dev ppp0 root >/dev/null 2>&1 $TC qdisc del dev ppp0 ingress >/dev/null 2>&1 fi } flush () { iptables -t nat -F iptables -t mangle -F iptables -F iptables -t nat -X iptables -t mangle -X iptables -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT shaper_off } case "$1" in start) if [ $RUNNING ]; then echo "Netfilter already active." exit 0 fi if [ -x $TC ]; then echo -n "Starting Netfilter and traffic control: " else echo -n "Starting Netfilter: " fi # Alte Konfiguration loeschen: flush # Kernel-konfig: echo 24576 >/proc/sys/net/ipv4/ip_conntrack_max echo 1 >/proc/sys/net/ipv4/ip_dynaddr echo 1 >/proc/sys/net/ipv4/tcp_syncookies # Traffic Shaper aktivieren: shaper_on # Pakete für Traffic Shaper markieren: MANGLE="iptables -t mangle -A POSTROUTING" # priorisierter Verkehr: $MANGLE -p icmp -j MARK --set-mark 10 # ICMP $MANGLE -p tcp --dport 6660:6669 -j MARK --set-mark 10 # IRC $MANGLE -p tcp --dport 22 -j MARK --set-mark 10 # SSH $MANGLE -p udp --dport 53 -j MARK --set-mark 10 # DNS $MANGLE -p tcp --sport 33167 -j MARK --set-mark 10 # Skype $MANGLE -p udp --sport 33167 -j MARK --set-mark 10 # Skype # interaktiver Verkehr: $MANGLE -p tcp --dport 21 -j MARK --set-mark 20 # FTP $MANGLE -p tcp --dport 25 -j MARK --set-mark 20 # SMTP $MANGLE -p tcp --dport 80 -j MARK --set-mark 20 # www $MANGLE -p tcp --dport 110 -j MARK --set-mark 20 # POP $MANGLE -p tcp --dport 443 -j MARK --set-mark 20 # https # Server-Verkehr: $MANGLE -p tcp --sport 80 -j MARK --set-mark 30 # www $MANGLE -p tcp --sport 25 -j MARK --set-mark 30 # SMTP # P2P iptables -t mangle -A OUTPUT -m owner --gid-owner p2p -j MARK --set-mark 50 $MANGLE -p tcp --dport 4661 -j MARK --set-mark 50 $MANGLE -p tcp --dport 4662 -j MARK --set-mark 50 $MANGLE -p tcp --dport 4672 -j MARK --set-mark 50 # Masquerading (SNAT): iptables -t nat -A POSTROUTING -s 192.168.99.1 -j RETURN iptables -t nat -A POSTROUTING -s 192.168.99.129 -j RETURN iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/16 -o ppp0 \ -j MASQUERADE --to-ports 1024-32000 iptables -t nat -A POSTROUTING -p udp -s 192.168.0.0/16 -o ppp0 \ -j MASQUERADE --to-ports 1024-32000 iptables -t nat -A POSTROUTING -p icmp -s 192.168.0.0/16 -o ppp0 \ -j MASQUERADE # Port-forwarding (DNAT): # Skype iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 33167 \ -j DNAT --to-destination 192.168.99.2 iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 33167 \ -j DNAT --to-destination 192.168.99.2 iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 33168 \ -j DNAT --to-destination 192.168.99.7 iptables -t nat -A PREROUTING -i ppp0 -p udp --dport 33168 \ -j DNAT --to-destination 192.168.99.7 # WLAN Web iptables -t nat -A PREROUTING -i eth3 -p tcp --dport 80 \ -j DNAT --to-destination 192.168.142.1 # Paketfilter : #^^^^^^^^^^^^^^ # LREJECT (TCP und UDP Pakete sauber abweisen, Rest ignorieren): iptables -N LREJECT iptables -A LREJECT -p tcp -j REJECT --reject-with tcp-reset iptables -A LREJECT -p udp -j REJECT iptables -A LREJECT -j DROP # LLOG (Logging-Chain): iptables -N LLOG # aussortieren, was zu häufig vorkommt: iptables -A LLOG -p tcp --dport 135 -j RETURN #\ iptables -A LLOG -p udp --dport 137 -j RETURN # | NetBIOS Ports iptables -A LLOG -p udp --dport 138 -j RETURN # | iptables -A LLOG -p tcp --dport 139 -j RETURN # | (scriptkiddies) iptables -A LLOG -p tcp --dport 445 -j RETURN #/ iptables -A LLOG -p tcp --sport 4662 -j RETURN # <- wildgewordene Esel # nicht den gleichen Host mehrfach loggen: iptables -A LLOG -m recent --update --name 'LOG' --seconds 30 -j RETURN # Rest loggen: iptables -A LLOG -m recent --set --name 'LOG' \ -j LOG --log-level notice --log-prefix 'Packet rejected: ' # WLAN (spezielle Regeln für WLAN): iptables -N WLAN # Ping erlauben: iptables -A WLAN -p icmp --icmp-type echo-request -j ACCEPT # DNS erlauben (für VPN-Fehlermeldung): iptables -A WLAN -d 192.168.142.1 -p udp --dport 53 -j ACCEPT # Web erlauben (für VPN-Fehlermeldung): iptables -A WLAN -d 192.168.142.1 -p tcp --dport 80 -j ACCEPT # AP-Administration iptables -A WLAN -s 192.168.0.50 -p tcp --sport www -j ACCEPT # OpenVPN erlauben: iptables -A WLAN -d 192.168.142.1 -p udp --dport 1194 -j ACCEPT # Rest ablehnen: iptables -A WLAN -j LREJECT # NOBF (Chain für BF-geschützte Dienste): iptables -N NOBF iptables -N BFLOG iptables -A NOBF -m recent --rcheck --name 'BF' --seconds 120 \ --hitcount 4 --rttl -j BFLOG iptables -A BFLOG -m recent --update --name 'BFLOG' --seconds 30 -j RETURN iptables -A BFLOG -m recent --set --name 'BFLOG' \ -j LOG --log-prefix 'Bruteforce: ' iptables -A NOBF -m recent --update --name 'BF' --seconds 120 \ --hitcount 4 --rttl -j LREJECT iptables -A NOBF -m recent --set --name 'BF' -j ACCEPT # BLx (Blacklisten für 'böse Jungs'): iptables -N BL1 iptables -N BL2 iptables -A BL1 -m recent --rcheck --name 'BL1' --seconds 4 \ --hitcount 20 -j BL2 iptables -A BL1 -m recent --set --name 'BL1' -j LREJECT iptables -A BL2 -m recent --set --name 'BL2' -j LREJECT # IDENT (Zugriff auf ident erlauben): iptables -N IDENT iptables -A IDENT -p tcp --dport 25 -m recent \ --set --rdest --name 'IDENT' -j RETURN # SMTP-Server iptables -A IDENT -p tcp --dport 6667 -m recent \ --set --rdest --name 'IDENT' -j RETURN # IRC-Server # TCPSCAN (TCP Portscans stören): # bei der Erkennung von TCP Portscans muss Port 80 ausgenommen werden, # da beim http-Protokoll 6 neue Verbindungen innerhalb von 2 Sekunden # ganz normal sind. iptables -N TCPSCAN iptables -N TCPLOG # Scanversuche loggen: iptables -A TCPSCAN -p tcp --dport ! www -m recent --rcheck \ --name 'TCP' --seconds 2 --hitcount 6 -j TCPLOG iptables -A TCPLOG -m recent --update --name 'TLOG' --seconds 30 \ -j RETURN iptables -A TCPLOG -m recent --set --name 'TLOG' \ -j LOG --log-prefix 'TCP Portscan: ' # und in die Blacklist: iptables -A TCPSCAN -p tcp --dport ! www -m recent --update --name 'TCP' \ --seconds 2 --hitcount 6 -j BL1 # Clients ablehnen, die in letzter Zeit blacklisted wurden: iptables -A TCPSCAN -m recent --rcheck --name 'BL2' --seconds 300 -j LREJECT iptables -A TCPSCAN -m recent --rcheck --name 'BL1' --seconds 60 -j LREJECT iptables -A TCPSCAN -m recent --set --name 'TCP' -j RETURN # UDPSCAN (UDP Portscans stören): # bei UDP muss Overnet ausgenommen werden, hier scheinen auch viele neue # Verbindungen in kurzer Zeit normal zu sein. iptables -N UDPSCAN iptables -N UDPLOG # Scanversuche loggen: iptables -A UDPSCAN -p udp --dport ! 3189 -m recent --rcheck \ --name 'UDP' --seconds 2 --hitcount 5 -j UDPLOG iptables -A UDPLOG -m recent --update --name 'ULOG' --seconds 30 \ -j RETURN iptables -A UDPLOG -m recent --set --name 'ULOG' \ -j LOG --log-prefix 'UDP Portscan: ' # und in die Blacklist: iptables -A UDPSCAN -p udp --dport ! 3189 -m recent --update --name 'UDP' \ --seconds 2 --hitcount 5 -j BL1 # Clients ablehnen, die in letzter Zeit blacklisted wurden: iptables -A UDPSCAN -m recent --rcheck --name 'BL2' --seconds 300 -j LREJECT iptables -A UDPSCAN -m recent --rcheck --name 'BL1' --seconds 60 -j LREJECT iptables -A UDPSCAN -m recent --set --name 'UDP' -j RETURN # LSERV (angebotene Dienste): iptables -N LSERV iptables -A LSERV -p tcp --dport auth -m recent \ --rcheck --seconds 15 --name 'IDENT' -j ACCEPT # ident-Server iptables -A LSERV -p tcp -j TCPSCAN # auf Scanversuche iptables -A LSERV -p udp -j UDPSCAN # testen iptables -A LSERV -p tcp --dport www -j ACCEPT # Webserver iptables -A LSERV -p tcp --dport ftp -j NOBF # FTP-Server iptables -A LSERV -p tcp --dport ssh -j NOBF # sshd iptables -A LSERV -p tcp --dport smtp -j ACCEPT # Mailserver iptables -A LSERV -p tcp --dport 8025 -j ACCEPT # alt. Mailserver iptables -A LSERV -p tcp --dport nntps -j ACCEPT # News/SSL iptables -A LSERV -p tcp --dport imaps -j ACCEPT # IMAP/SSL iptables -A LSERV -p tcp --dport saft -j ACCEPT # SAFT iptables -A LSERV -p tcp --dport 4662 -j ACCEPT # Overnet iptables -A LSERV -p udp --dport 3189 -j ACCEPT # Overnet # FSERV (weitergeleitete Dienste): iptables -N FSERV iptables -A FSERV -p tcp -j TCPSCAN iptables -A FSERV -p udp -j UDPSCAN iptables -A FSERV -p udp -d 192.168.99.2 --dport 33167 -j ACCEPT iptables -A FSERV -p tcp -d 192.168.99.2 --dport 33167 -j ACCEPT iptables -A FSERV -p udp -d 192.168.99.7 --dport 33168 -j ACCEPT iptables -A FSERV -p tcp -d 192.168.99.7 --dport 33168 -j ACCEPT # INPUT iptables -P INPUT DROP # VPN: iptables -A INPUT -i tap0 -j ACCEPT # WLAN: iptables -A INPUT -i eth3 -j WLAN # Antworten und related Connections akzeptieren: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Ping erlauben: iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Zugriff fuer lokales Netz: iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -i br0 -s 192.168.99.0/25 -j ACCEPT iptables -A INPUT -i eth1 -s 192.168.99.128/25 -j ACCEPT # neue Verbindungen nur zu angebotenen Diensten: iptables -A INPUT -i ppp0 -m state --state NEW -j LSERV # Rest loggen und abweisen: iptables -A INPUT -j LLOG iptables -A INPUT -j LREJECT # FORWARD iptables -P FORWARD DROP # WLAN: iptables -A FORWARD -i eth3 -j WLAN # MSS-Clamping: iptables -A FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -m tcpmss \ --mss 1453: -j TCPMSS --set-mss 1452 # Antworten und related Connections akzeptieren: iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Ident bei Bedarf freischalten: iptables -A FORWARD -o ppp0 -m state --state NEW -j IDENT # Routing fuer lokales Netz: iptables -A FORWARD -i br0 -s 192.168.99.0/25 -j ACCEPT iptables -A FORWARD -i eth1 -s 192.168.99.128/25 -j ACCEPT # neue Verbindungen zu Diensten im LAN: iptables -A FORWARD -i ppp0 -m state --state NEW -j FSERV # Rest loggen und abweisen: iptables -A FORWARD -j LLOG iptables -A FORWARD -j LREJECT # OUTPUT # Ident bei Bedarf freischalten: iptables -A OUTPUT -o ppp0 -m state --state NEW -j IDENT echo "done." ;; stop) if [ -z $RUNNING ]; then echo "Netfilter not active." exit 0; fi if [ -x $TC ]; then echo -n "Stopping Netfilter and traffic control: " else echo -n "Stopping Netfilter: " fi flush echo "done." ;; restart) $0 stop $0 start ;; reconnect) if [ $RUNNING ]; then shaper_off shaper_on fi ;; *) echo "Usage: $0 {start|stop|restart|reconnect}" ;; esac exit 0