#!/bin/sh
#
# Letztes Update: 2012-01-27
#
############################################################################################
#### ####
#### Kernel-Optionen setzen ####
#### ####
############################################################################################
### Antispoofing
echo "1" > /proc/sys/net/ipv4/conf/all/arp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
### martian packets loggen?
echo "0" > /proc/sys/net/ipv4/conf/all/log_martians
### ICMP Redirects verweigern
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/all/send_redirects
### Source Routing deaktivieren
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
### ICMP Broadcast Echos ignorieren
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
### Bogus ICMP-Errors ignorieren
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
### Forwarding aktivieren
echo "1" > /proc/sys/net/ipv4/ip_forward
#############################################################################################
##### #####
##### Generelle Einstellungen #####
##### #####
#############################################################################################
### Vorhandene Tabellen loeschen
iptables -F
iptables -t nat -F
iptables -t mangle -F
lan="eth1"
wan="eth0"
intern=10.0.0.0/24
clients=10.0.0.3-10.0.0.20
extip="`ip addr show eth0 | grep 'inet ' | cut -d t -f2 | cut -d / -f1 | cut -b 2- | cut -d ' ' -f 1`"
#############################################################################################
##### #####
##### Filterregeln #####
##### #####
#############################################################################################
### Default-Policy: alles droppen
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
### Default-Policy: alles natten, erst beim Filtern verwerfen
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
### Akzeptiere Verbindungsaufbauten aus dem LAN
iptables -A FORWARD -s $intern -i $lan -o $wan -j ACCEPT
### Akzeptiere lokalen Traffic
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
### Akzeptiere alle Pakete, die zu einer aufgebauten Verbindung gehoeren
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
### Alle Pakete bei der Weiterleitung nach aussen maskieren
iptables -t nat -A POSTROUTING -o $wan -j MASQUERADE
### CLAMAV
iptables -A OUTPUT -m owner --uid-owner 109 -p tcp --dport 80 -j ACCEPT
### DCC
iptables -A FORWARD -i $wan -p tcp -m multiport --dports 5000:5010 -m state --state NEW -j ACCEPT
### DDCLIENT
iptables -A OUTPUT -o $wan -p tcp --dport 80 -m owner --uid-owner 102 -m state --state NEW -j ACCEPT
### DHCP
iptables -A INPUT -i $lan -p udp --dport 67 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -o $wan -d 83.169.186.130 -p udp --dport 67 -m state --state NEW -j ACCEPT
iptables -A INPUT -i $wan -p udp --dport 68 -j REJECT
iptables -A OUTPUT -o $lan -d $intern -p udp --dport 68 -m state --state NEW -j ACCEPT
### DNS
iptables -A INPUT -i $lan -s $intern -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -d $intern,62.141.58.13,57.118.100.175,213.73.91.35 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -d $intern,62.141.58.13,57.118.100.175,213.73.91.35 -p udp --dport 53 -j ACCEPT
### FTP
iptables -A OUTPUT -p tcp -d 130.133.110.66 --dport 21 -m state --state NEW -j ACCEPT
### HTTP
iptables -A FORWARD -i $wan -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -i $wan -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
iptables -A INPUT -p tcp --sport 80 -m state --state NEW -j REJECT
# REGEL FUER SQUID
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
### HTTPS
iptables -A FORWARD -i $wan -p tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -t nat -A PREROUTING -i $wan -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
### ICMP
iptables -A INPUT -p icmp -s $intern -m state --state NEW -j ACCEPT
iptables -A INPUT -p icmp ! -s $intern -j DROP
iptables -A OUTPUT -p icmp -j REJECT
### IMAP
iptables -A FORWARD -i $wan -p tcp --dport 993 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --dport 993 -j DNAT --to-destination 10.0.0.2:993
### IRC
iptables -A FORWARD -i $wan -p tcp --dport 6667 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --dport 6667 -j DNAT --to-destination 10.0.0.2:6667
iptables -A FORWARD -i $wan -p tcp --dport 6668 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --dport 6668 -j DNAT --to-destination 10.0.0.2:6668
### JABBER
iptables -A FORWARD -i $wan -p tcp --dport 5222 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --dport 5222 -j DNAT --to-destination 10.0.0.2:5222
iptables -A FORWARD -i $wan -p tcp --sport 5222 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --sport 5222 -j DNAT --to-destination 10.0.0.2
iptables -A FORWARD -i $wan -p tcp --dport 5223 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --dport 5223 -j DNAT --to-destination 10.0.0.2:5223
iptables -A FORWARD -i $wan -p tcp --dport 5269 -m state --state NEW -j ACCEPT
iptables -t nat -I PREROUTING -i $wan -p tcp --dport 5269 -j DNAT --to-destination 10.0.0.2:5269
### MPD
iptables -A INPUT -i $lan -s $intern -p tcp --dport 6600 -m state --state NEW -j ACCEPT
iptables -A INPUT -i !$wan -p tcp --dport 6600 -m state --state NEW -j ACCEPT
### MPDSCRIBBLE
iptables -A OUTPUT -p tcp --dport 80 -d 195.24.232.205 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -d 195.24.232.207 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -d 195.24.232.208 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -d 195.24.233.53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -d 195.24.233.57 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -d 195.24.233.58 -j ACCEPT
### NFS
iptables -A OUTPUT -p tcp -d 10.0.0.2 --dport 111 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp -d 10.0.0.2 --dport 111 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.0.2 --dport 2049 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp -d 10.0.0.2 --dport 2049 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.0.2 --dport 4000:4003 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp -d 10.0.0.2 --dport 4000:4003 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.0.2 --dport 4040 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp -d 10.0.0.2 --dport 4040 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp -d 10.0.0.2 --dport 55407 -m state --state NEW -j ACCEPT
### NTP
iptables -A INPUT -s $intern -p udp --dport 123 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -d 134.76.249.201,134.76.249.102,134.76.10.46 -p udp --dport 123 -m state --state NEW -j ACCEPT
### RSYNC
iptables -A OUTPUT -o $lan -p tcp -d 10.0.0.2 --dport 873 -m state --state NEW -j ACCEPT
### SQUID
iptables -t nat -A PREROUTING -i $lan -s $intern -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -A INPUT -i $lan -s $intern -p tcp --dport 3128 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3128 -j ACCEPT
### SSH (von aussen Redirect auf 22)
iptables -t nat -A PREROUTING -s $intern -d 10.0.0.1 -p tcp --dport 22 -j DNAT --to 10.0.0.1:10101
iptables -t nat -A PREROUTING -s 134.76.18.15 -p tcp --dport 22 -j DNAT --to 10.0.0.1:10101
iptables -t nat -A PREROUTING -s 134.76.84.167 -p tcp --dport 22 -j DNAT --to 10.0.0.1:10101
iptables -A INPUT -p tcp --dport 10101 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -d $intern -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i $wan ! -s $intern -p tcp --dport 22 -j REJECT
iptables -A INPUT -p tcp --dport 10101 -j ACCEPT
### SYSLOG-NG
iptables -A OUTPUT -o $lan -p tcp -d 10.0.0.2 --dport 514 -m state --state NEW -j ACCEPT
### UPTIME
iptables -A OUTPUT -p tcp -d 85.214.204.210 --dport 80 -m state --state NEW -j ACCEPT
### WHOIS
#iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT
### ZABBIX
iptables -A INPUT -i $lan -s 10.0.0.2 -p tcp --dport 10050 -j ACCEPT
iptables -A OUTPUT -o $lan -d 10.0.0.2 -p tcp --dport 10051 -j ACCEPT
#############################################################################################
##### #####
##### Logging #####
##### #####
#############################################################################################
### gespoofte Pakete des LAN
iptables -A INPUT ! -i $lan -s $intern -j LOG --log-prefix "SPOOFING eth1: " --log-level=4
iptables -A FORWARD ! -i $lan -s $intern -j LOG --log-prefix "SPOOFING eth1: " --log-level=4
### gespoofter lokaler Traffic
iptables -A INPUT ! -i lo -s 127.0.0.1 -j LOG --log-prefix "SPOOFING lo: " --log-level=4
iptables -A FORWARD ! -i lo -s 127.0.0.1 -j LOG --log-prefix "SPOOFING lo: " --log-level=4
### gespoofter Traffic von aussen
iptables -A INPUT ! -i $wan ! -s $intern -j LOG --log-prefix "SPOOFING eth0: " --log-level=4
iptables -A FORWARD ! -i $wan ! -s $intern -j LOG --log-prefix "SPOOFING eth0: " --log-level=4
#############################################################################################
##### #####
##### REJECTS #####
##### #####
#############################################################################################
### SPOOFING-REJECTS
iptables -A INPUT ! -i $lan -s $intern -j REJECT
iptables -A FORWARD ! -i $lan -s $intern -j REJECT
iptables -A INPUT ! -i lo -s 127.0.0.1 -j REJECT
iptables -A FORWARD ! -i lo -s 127.0.0,1 -j REJECT
iptables -A INPUT ! -i $wan -s $extip -j REJECT
iptables -A FORWARD ! -i $wan -s $extip -j REJECT
### Alles andere schliesslich loggen und verwerfen
iptables -A FORWARD -j LOG --log-prefix "REJECTED_FORWARD: " --log-level=5
iptables -A FORWARD -j REJECT
iptables -A OUTPUT -j LOG --log-prefix "REJECTED_OUTPUT: " --log-level=5
iptables -A OUTPUT -j REJECT
iptables -A INPUT -j LOG --log-prefix "REJECTED_INPUT: " --log-level=5
iptables -A INPUT -j REJECT
#############################################################################################
##### #####
##### Traffic Shaping #####
##### #####
#############################################################################################
tc qdisc del dev $wan root
# maximaler Upstream
CEIL=6000
# Bandbreite im HTB-Tree aufteilen, nicht zugewiesener Traffic wird Class 15 zugewiesen
tc qdisc add dev $wan root handle 1: htb default 15
# Definieren des HTB-Trees
tc class add dev $wan parent 1: classid 1:1 htb rate ${CEIL}kbit ceil ${CEIL}kbit
# hoechste Prio fuer interaktiven Traffic (SSH, IRC und SYN-geflaggte Pakete, Traffic der Clients)
# (min 2000kbit garantiert, max $CEIL moeglich, minimale Verzoegerung)
tc class add dev $wan parent 1:1 classid 1:10 htb rate 2000kbit ceil ${CEIL}kbit prio 1
# Prio 2 - Traffic von / nach Atlas / Windows-VM, maximaler Durchsatz
# (min 80kbit garantiert, max $CEIL moeglich)
tc class add dev $wan parent 1:1 classid 1:11 htb rate 1000kbit ceil ${CEIL}kbit prio 2
tc qdisc add dev $wan parent 1:10 handle 120: sfq perturb 10
tc qdisc add dev $wan parent 1:11 handle 130: sfq perturb 10
# Klassifizieren des Traffics
tc filter add dev $wan parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev $wan parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
# Markieren des Traffics
# Prio 1: interaktiver Traffic, Traffic der Clients
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp --sport 22 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp --sport 22 -j RETURN
iptables -t mangle -A PREROUTING -p tcp --dport 10101 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp --dport 6667 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp --dport 6668 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.4 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.4 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.5 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.4 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.10 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.10 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.11 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.12 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.13 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.14 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.14 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.15 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.15 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -s 10.0.0.16 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -d 10.0.0.16 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
# Prio 2: Traffic von / zu Atlas / Windows-VM
iptables -t mangle -A PREROUTING -s 10.0.0.2 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -d 10.0.0.2 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -d 10.0.0.20 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x2
### Speichern der Regeln
/etc/init.d/iptables save > /dev/null 2>&1