#!/bin/sh
# vim:ai ts=4 sw=4
#
# tproxyrun:
#
# Use this file to start tproxy from /etc/inittab. If tproxy ever dies
# then the filter rules will be removed.
#

# This is fine for single ethernet card machines. For multiple ethernet
# cards then use the HOSTNAME2 and HOSTNAME3 variables as examples.
HOSTNAME1=`grep \`hostname\` /etc/hosts | head -1 | awk '{print$1}'`
#HOSTNAME2="192.168.1.1"
#HOSTNAME3="10.1.0.1"

# Details of the proxy we connect to.
PROXYNAME="proxy.domain.com"
PROXYPORT="8080"

# Details of how transproxy will operate.
TRANSPROXYPORT="8081"
TRANSPROXYLOG="/tmp/tproxy.log"	# Must be writable by the uid/gid we run as.

# List of address that are allowed to connect.
ACLS="192.168.1.0 10.1/24"

# URL to force all requests to.
#FORCE_URL="http://localhost/index.html"

# Check for possibly useless overhead configuration.
if [ `hostname` = "$PROXYNAME" ]; then
	echo "Why are you running transproxy and Squid on the same box!?!"
	echo "See the Squid FAQ for transparent proxying directly into Squid."
fi

# Add the filter rules.
case `uname` in
FreeBSD)
	ipfw add 10000 allow tcp from any to localhost 80 >/dev/null
	ipfw add 10001 allow tcp from any to "$HOSTNAME1" 80 >/dev/null
	if [ -n "$HOSTNAME2" ]; then
		ipfw add 10002 allow tcp from any to "$HOSTNAME2" 80 >/dev/null
	fi
	if [ -n "$HOSTNAME3" ]; then
		ipfw add 10003 allow tcp from any to "$HOSTNAME3" 80 >/dev/null
	fi
	ipfw add 10010 fwd "$HOSTNAME1","$TRANSPROXYPORT" tcp from any to any 80 >/dev/null
	;;
Linux)
	# I really have no idea about Linux, are these kernel versions correct
	# for the type if network filtering supported? Is there a surefire way?
	case `uname -r` in
	2.[3456789].*)
		iptables -t nat -A PREROUTING -p tcp -d localhost --dport 80 -j ACCEPT
		iptables -t nat -A PREROUTING -p tcp -d "$HOSTNAME1" --dport 80 -j ACCEPT
		if [ -n "$HOSTNAME2" ]; then
			iptables -t nat -A PREROUTING -p tcp -d "$HOSTNAME2" --dport 80 -j ACCEPT
		fi
		if [ -n "$HOSTNAME3" ]; then
			iptables -t nat -A PREROUTING -p tcp -d "$HOSTNAME3" --dport 80 -j ACCEPT
		fi
		iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port "$TRANSPROXYPORT"
		;;
	2.[12].*)
		ipchains -A input -p tcp -d localhost 80 -j ACCEPT
		ipchains -A input -p tcp -d "$HOSTNAME1" 80 -j ACCEPT
		if [ -n "$HOSTNAME2" ]; then
			ipchains -A input -p tcp -d "$HOSTNAME2" 80 -j ACCEPT
		fi
		if [ -n "$HOSTNAME3" ]; then
			ipchains -A input -p tcp -d "$HOSTNAME3" 80 -j ACCEPT
		fi
		ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT "$TRANSPROXYPORT"
		;;
	*)
		ipfwadm -I -a accept -P tcp -D localhost 80
		ipfwadm -I -a accept -P tcp -D "$HOSTNAME1" 80
		if [ -n "$HOSTNAME2" ]; then
			ipfwadm -I -a accept -P tcp -D "$HOSTNAME2" 80
		fi
		if [ -n "$HOSTNAME3" ]; then
			ipfwadm -I -a accept -P tcp -D "$HOSTNAME3" 80
		fi
		ipfwadm -I -a accept -P tcp -D 0.0.0.0/0 80 -r "$TRANSPROXYPORT"
		;;
	esac
	;;
esac

# Start the command options as an empty string.
CMD=""

# Build the ACL list.
for ACL in $ACLS; do
	CMD="$CMD -a $ACL"
done

# Check if a log file is required.
if [ -n "$TRANSPROXYLOG" ]; then
	CMD="$CMD -l $TRANSPROXYLOG"
fi

# Force all accesses to the specified URL.
if [ -n "$FORCE_URL" ]; then
	CMD="$CMD -f $FORCE_URL"
fi

# Start transproxy running.
/usr/local/sbin/tproxy -s "$TRANSPROXYPORT" -d $CMD "$PROXYNAME" "$PROXYPORT"

# Remove the filter rules.
case `uname` in
FreeBSD)
	ipfw delete 10010 10000 10001 >/dev/null
	if [ -n "$HOSTNAME2" ]; then
		ipfw delete 10002 >/dev/null
	fi
	if [ -n "$HOSTNAME3" ]; then
		ipfw delete 10003 >/dev/null
	fi
	;;
Linux)
	case `uname -r` in
	2.[3456789].*)
		iptables -t nat -D PREROUTING -p tcp -d localhost --dport 80 -j ACCEPT
		iptables -t nat -D PREROUTING -p tcp -d "$HOSTNAME1" --dport 80 -j ACCEPT
		if [ -n "$HOSTNAME2" ]; then
			iptables -t nat -D PREROUTING -p tcp -d "$HOSTNAME2" --dport 80 -j ACCEPT
		fi
		if [ -n "$HOSTNAME3" ]; then
			iptables -t nat -D PREROUTING -p tcp -d "$HOSTNAME3" --dport 80 -j ACCEPT
		fi
		iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port "$TRANSPROXYPORT"
		;;
	2.[12].*)
		ipchains -D input -p tcp -d localhost 80 -j ACCEPT
		ipchains -D input -p tcp -d "$HOSTNAME1" 80 -j ACCEPT
		if [ -n "$HOSTNAME2" ]; then
			ipchains -D input -p tcp -d "$HOSTNAME2" 80 -j ACCEPT
		fi
		if [ -n "$HOSTNAME3" ]; then
			ipchains -D input -p tcp -d "$HOSTNAME3" 80 -j ACCEPT
		fi
		ipchains -D input -p tcp -d 0.0.0.0/0 80 -j REDIRECT "$TRANSPROXYPORT"
		;;
	*)
		ipfwadm -I -d accept -P tcp -D localhost 80
		ipfwadm -I -d accept -P tcp -D "$HOSTNAME1" 80
		if [ -n "$HOSTNAME2" ]; then
			ipfwadm -I -d accept -P tcp -D "$HOSTNAME2" 80
		fi
		if [ -n "$HOSTNAME3" ]; then
			ipfwadm -I -d accept -P tcp -D "$HOSTNAME3" 80
		fi
		ipfwadm -I -d accept -P tcp -D 0.0.0.0/0 80 -r "$TRANSPROXYPORT"
		;;
	esac
	;;
esac

exit 0
