! /bin/bash
# Copyright (c) 2001, Timor Sommer
#
# Author: Timor Sommer <timor@timor-home.de>
#
# init.d/FOO
#
# and symbolic its link
#
# /sbin/rcFOO
#
# System startup script for Timors cusomized firewall
#
# Source SuSE config
. /etc/rc.config
# Determine the base and follow a runlevel link name.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}
# Force execution if not called by a runlevel directory.
test $link = $base && START_TSFW=yes
test "$START_TSFW" = yes || exit 0
# Shell functions sourced from /etc/rc.status:
# rc_check check and set local and overall rc status
# rc_status check and set local and overall rc status
# rc_status -v ditto but be verbose in local rc status
# rc_status -v -r ditto and clear the local rc status
# rc_failed set local and overall rc status to failed
# rc_failed <num> set local and overall rc status to <num><num>
# rc_reset clear local rc status (overall remains)
# rc_exit exit appropriate to overall rc status
. /etc/rc.status
# First reset status of this service
rc_reset
# Return values acc. to LSB for all commands but status:
# 0 - success
# 1 - generic or unspecified error
# 2 - invalid or excess argument(s)
# 3 - unimplemented feature (e.g. "reload")
# 4 - insufficient privilege
# 5 - program is not installed
# 6 - program is not configured
# 7 - program is not running
#
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signalling is not supported) are
# considered a success.
# set some vars
PTABLES=iptables
#IPTABLES="echo iptables "
WORLD_IF=ppp0
LAN_IF=eth1
LAN_IP=192.168.0.2
LAN_NET=192.168.0.0
LAN_MASK=255.255.255.0
LAN_BCAST=192.168.0.255
FORWARD_IP=192.168.0.5
HIGHPORTS=1024:65535
case "$1" in
start)
echo -n "Starting Timor's customized firewall"
# setup some kernel stuff
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 0 > /proc/sys/net/ipv4/tcp_ecn
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
# default policies: drop everything in table filter
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
# make sure, our packets don't need to be fragmented on their way
$IPTABLES -A FORWARD -o $WORLD_IF -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1451: -j TCPMSS --set-mss 1450
$IPTABLES -A OUTPUT -o $WORLD_IF -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1451: -j TCPMSS --set-mss 1450
# allow traffic from lan to world, for each each supported protocol on top of ip
# 2 entries, one for outgoing traffic, one for incoming
$IPTABLES -A FORWARD -p TCP -i $LAN_IF -o $WORLD_IF -s ${LAN_NET}/${LAN_MASK} -j ACCEPT
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d ${LAN_NET}/${LAN_MASK} ! --syn -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $LAN_IF -o $WORLD_IF -s ${LAN_NET}/${LAN_MASK} -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d ${LAN_NET}/${LAN_MASK} -j ACCEPT
$IPTABLES -A FORWARD -p ICMP -i $LAN_IF -o $WORLD_IF -s ${LAN_NET}/${LAN_MASK} -j ACCEPT
$IPTABLES -A FORWARD -p ICMP -i $WORLD_IF -o $LAN_IF -d ${LAN_NET}/${LAN_MASK} -j ACCEPT
# allow the lan to access everthing on the firewall, including traffic backwards
$IPTABLES -A INPUT -i $LAN_IF -s ${LAN_NET}/${LAN_MASK} -d $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -i $LAN_IF -s ${LAN_NET}/${LAN_MASK} -d $LAN_BCAST -j ACCEPT
$IPTABLES -A OUTPUT -o $LAN_IF -s $LAN_IP -d ${LAN_NET}/${LAN_MASK} -j ACCEPT
# allow ssh connections from the world, including reverse traffic
$IPTABLES -A INPUT -p TCP -i $WORLD_IF --sport $HIGHPORTS --dport ssh -j ACCEPT
$IPTABLES -A OUTPUT -p TCP -o $WORLD_IF --dport $HIGHPORTS --sport ssh ! --syn -j ACCEPT
# allow everthing on lo locally
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# allow the router to access the internet, TCP and ICMP only, UDP for DNS
$IPTABLES -A OUTPUT -p TCP -o $WORLD_IF -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $WORLD_IF ! --syn -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP -o $WORLD_IF -j ACCEPT
$IPTABLES -A INPUT -p ICMP -i $WORLD_IF -j ACCEPT
$IPTABLES -A OUTPUT -p UDP -o $WORLD_IF --sport $HIGHPORTS --dport domain -j ACCEPT
$IPTABLES -A INPUT -p UDP -i $WORLD_IF --dport $HIGHPORTS --sport domain -j ACCEPT
# Masquerade the traffic from the local net to world via World-IF
$IPTABLES -t nat -A POSTROUTING -o $WORLD_IF -s ${LAN_NET}/${LAN_MASK} -j MASQUERADE
# redirect some Highports on this machine to clients on the lan to be reachable from
# the internet for ICQ or IRC-DCC and the
# ident
$IPTABLES -t nat -A PREROUTING -p TCP -i $WORLD_IF --dport 113 -j DNAT --to-destination $FORWARD_IP
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 113 -j DNAT --to-destination $FORWARD_IP
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 113 -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 113 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p TCP -i $WORLD_IF --dport 30000:31999 -j DNAT --to-destination $FORWARD_IP
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 30000:31999 -j DNAT --to-destination $FORWARD_IP
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 30000:31999 -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 30000:31999 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p TCP -i $WORLD_IF --dport 32000:32999 -j DNAT --to-destination 192.168.0.4
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 32000:32999 -j DNAT --to-destination 192.168.0.4
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d 192.168.0.4 --dport 32000:32999 -j ACCEPT
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d 192.168.0.4 --dport 32000:32999 -j ACCEPT
# esel
$IPTABLES -t nat -A PREROUTING -p TCP -i $WORLD_IF --dport 4662 -j DNAT --to-destination $FORWARD_IP
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 4672 -j ACCEPT
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 4662 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 4672 -j DNAT --to-destination $FORWARD_IP
# portforwarding for bc
$IPTABLES -t nat -A PREROUTING -p tcp --dport 2300:2400 -i $WORLD_IF -j DNAT --to $FORWARD_IP
$IPTABLES -t nat -A PREROUTING -p udp --dport 2300:2400 -i $WORLD_IF -j DNAT --to $FORWARD_IP
$IPTABLES -t nat -A PREROUTING -p tcp --dport 47624 -i $WORLD_IF -j DNAT --to $FORWARD_IP:47624
$IPTABLES -t nat -A PREROUTING -p udp --dport 47624 -i $WORLD_IF -j DNAT --to $FORWARD_IP:47624
$IPTABLES -t nat -A PREROUTING -p udp --dport 28800:28900 -i $WORLD_IF -j DNAT --to $FORWARD_IP
# allow bc connection form outside
$IPTABLES -A FORWARD -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP -p udp --dport 2300:2400 -j ACCEPT
$IPTABLES -A FORWARD -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP -p tcp --dport 2300:2400 -j ACCEPT
$IPTABLES -A FORWARD -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP -p tcp --dport 47624 -j ACCEPT
$IPTABLES -A FORWARD -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP -p udp --dport 47624 -j ACCEPT
$IPTABLES -A FORWARD -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP -p udp --dport 28800:28900 -j ACCEPT
# ts2 server
$IPTABLES -t nat -A PREROUTING -p tcp --dport 8767 -i $WORLD_IF -j DNAT --to $FORWARD_IP
$IPTABLES -t nat -A PREROUTING -p udp --dport 8767 -i $WORLD_IF -j DNAT --to $FORWARD_IP
# special redirects
$IPTABLES -t nat -A PREROUTING -p TCP -i $WORLD_IF --dport 8080 -j DNAT --to-destination $FORWARD_IP # Webcam auf 8080
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 8080 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p TCP -i $WORLD_IF --dport 80 -j DNAT --to-destination $FORWARD_IP # Apache auf 80
$IPTABLES -A FORWARD -p TCP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 80 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 9110:9111 -j DNAT --to-destination $FORWARD_IP # GV
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 9110:9111 -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 2302:2400 -j DNAT --to-destination $FORWARD_IP # DS
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 2302:2400
$IPTABLES -t nat -A PREROUTING -p UDP -i $WORLD_IF --dport 6073 -j DNAT --to-destination $FORWARD_IP # DS
$IPTABLES -A FORWARD -p UDP -i $WORLD_IF -o $LAN_IF -d $FORWARD_IP --dport 6073
# transparent proxying
# $IPTABLES -t nat -A PREROUTING -p TCP -i $LAN_IF --dport http -j REDIRECT --to-ports 8080
# allow all ICMP traffic for testing
# $IPTABLES -A INPUT -p ICMP -j ACCEPT
# $IPTABLES -A OUTPUT -p ICMP -j ACCEPT
# $IPTABLES -A FORWARD -p ICMP -j ACCEPT
# Add logging for dropped packets
$IPTABLES -A INPUT -j LOG --log-prefix "drop INPUT "
$IPTABLES -A OUTPUT -j LOG --log-prefix "drop OUTPUT "
$IPTABLES -A FORWARD -j LOG --log-prefix "drop FORWARD "
# Remember status and be verbose
rc_status -v
;;
stop)
echo -n "Shutting down Timor's customized firewall"
## Stop daemon with killproc(8) and if this fails
## set echo the echo return value.
# disable forwarding, mainly for security
echo 0 > /proc/sys/net/ipv4/ip_forward
# reset default policies
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
# flush all modified chains, since default is empty
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
$IPTABLES -t nat -F
$IPTABLES -t nat -F
# Remember status and be verbose
rc_status -v
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
$0 start
# Remember status and be quiet
rc_status
;;
force-reload)
## Signal the daemon to reload its config. Most daemons
## do this on signal 1 (SIGHUP).
## If it does not support it, restart.
echo -n "Reload Timor's coustomized firewall"
$0 stop && $0 start
rc_status
;;
reload)
## Like force-reload, but if daemon does not support
## signalling, do nothing (!)
rc_failed 3
rc_status -v
;;
*)
echo "Usage: $0 {start|stop|try-restart|restart|force-reload|reload}"
exit 1
;;
esac
rc_exit