Inhaltsverzeichnis
Es ist unter /usr/local/sbin/firewall zu finden.
#!/bin/sh
#
# Firewall-Script für Gymnasium Münsingen
#
# /etc/init.d/firewall -> /usr/local/sbin/firewall
# /etc/rc[2345].d/S10firewall -> ../init.d/firewall
#
# Tool iptables vorhanden?
iptables=/sbin/iptables
test -x $iptables || exit 5
# ip_tables-Modul laden
modprobe ip_tables || exit 5
##############################################################
# FUNKTIONEN
##############################################################
function firewall_config() {
# 1. Interfaces
# extern -> Internet
ext_int="ppp+" ## nicht eth1, das wird quasi nicht verwendet...
# intern -> Intranet
int_int="eth0"
# loopback
lo_int="lo"
# 2. IP-Adressen
# server externe adresse
server_ext="0/0" # ist egal, s.o.: auf ppp+ kommen nur pakete an,
# die für den comp. bestimmt sind
# server interne adresse
server_int="192.168.0.1"
# intranet adress-bereich
lan="192.168.0.0/24"
# 3. Ports
# alle privilegierten ports
priv_ports="0:1023"
# alle unprivilegierten ports
unpriv_ports="1024:65535"
}
function firewall_init() {
# Alle regeln und chains löschen
$iptables -F
$iptables -t nat -F
$iptables -X
# default policy
$iptables -P INPUT DROP
$iptables -P FORWARD DROP
$iptables -P OUTPUT ACCEPT
# loopback interface aktivieren
$iptables -A INPUT -i $lo_int -j ACCEPT
# Schutz vor SYN Flooding
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "1" > $f
done
# IP Forwarding deaktivieren
echo "0" > /proc/sys/net/ipv4/ip_forward
# chains
$iptables -N intranet
$iptables -N internet
# spezielle regeln:
# spezielles dhcp-broadcast-paket
$iptables -A INPUT -i $int_int -d 255.255.255.255 -p udp --dport 67 \
-j ACCEPT
# spezielles smb-broadcast-paket...nötig??
$iptables -A INPUT -i $int_int -d 192.168.0.255 -p udp --sport 138 \
--dport 138 -j ACCEPT
$iptables -A INPUT -i $int_int -d 192.168.0.255 -p udp --sport 137 \
--dport 137 -j ACCEPT
$iptables -A INPUT -i $int_int -d 192.168.0.255 -p udp --dport 138 \
-j ACCEPT
$iptables -A INPUT -i $int_int -d 255.255.255.255 -p udp --dport 138 \
--sport 138 -j ACCEPT
# allgemeine regeln mit userdefined chains
$iptables -A INPUT -i $int_int -s $lan -d $server_int -j intranet
$iptables -A INPUT -i $ext_int -j internet
# erlaube ankommende Pakete von bestehenden Verbindungen
$iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
$iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT
# logging:
$iptables -A INPUT -j LOG --log-prefix "firewall: " -m limit
}
function firewall_intranet () {
#leere chain intranet
$iptables -F intranet
# icmp pakete in
# see /usr/include/netinet/ip_icmp.h
$iptables -A intranet -p icmp --icmp-type 0 -j ACCEPT
$iptables -A intranet -p icmp --icmp-type 3 -j ACCEPT
$iptables -A intranet -p icmp --icmp-type 4 -j ACCEPT
$iptables -A intranet -p icmp --icmp-type 8 -j ACCEPT
$iptables -A intranet -p icmp --icmp-type 12 -j ACCEPT
# erlaube ssh (tcp,1222) in
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 1222 -j ACCEPT
# erlaube smtp (tcp,25) in
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 25 -j ACCEPT
# erlaube domain (udp,53) in
$iptables -A intranet -p udp --sport $unpriv_ports --dport 53 -j ACCEPT
# erlaube dhcp (udp,67/68) in
$iptables -A intranet -p udp --sport $unpriv_ports --dport 67 -j ACCEPT
$iptables -A intranet -p udp --sport 68 --dport 67 -j ACCEPT
# erlaube httpd (tcp,80) in
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 80 -j ACCEPT
# erlaube pop3 (tcp,110) in
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 110 -j ACCEPT
# erlaube smb (tcp/udp,137:139) in
$iptables -A intranet -p udp --sport 137 --dport 137 -j ACCEPT
$iptables -A intranet -p udp --sport 138 --dport 138 -j ACCEPT
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 139 -j ACCEPT
# erlaube swat (tcp/901) in
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 901 -j ACCEPT
# reject smb (tcp/445) in
$iptables -A intranet -p tcp --dport 445 -j REJECT
# webmin (tcp/10000) in
$iptables -A intranet -p tcp --dport 10000 -j ACCEPT
### proxy - internet-freigabe
$iptables -A intranet -p tcp --sport $unpriv_ports --dport 3128 -j ACCEPT
# proxy-manager aufrufen
/usr/local/sbin/proxy-manager -d
# transparent proxy (nur für http)
$iptables -t nat -A PREROUTING -i eth0 -p tcp -d ! $server_int --dport 80 \
-j REDIRECT --to-port 3128
}
function firewall_internet () {
# leere chain internet
$iptables -F internet
# richtige adresse? -- prüfung entfällt (s.o.), da nur pakete ankommen,
# die auch für dem comp. bestimmt sind.
#$iptables -A internet -d ! $server_ext -j RETURN
### provided services! in
# icmp pakete in
$iptables -A internet -p icmp -d $server_ext --icmp-type 0 -j ACCEPT
$iptables -A internet -p icmp -d $server_ext --icmp-type 3 -j ACCEPT
$iptables -A internet -p icmp -d $server_ext --icmp-type 4 -j ACCEPT
$iptables -A internet -p icmp -d $server_ext --icmp-type 8 -j ACCEPT
$iptables -A internet -p icmp -d $server_ext --icmp-type 12 -j ACCEPT
# erlaube ssh (tcp,1222) in
$iptables -A internet -p tcp -d $server_ext --dport 1222 --sport \
$unpriv_ports -j ACCEPT
# erlaube http (tcp,80) in
#$iptables -A internet -p tcp -d $server_ext --dport 80 --sport \
$unpriv_ports -j ACCEPT
}
function firewall_stop () {
# proxy-manager beenden
/usr/local/sbin/proxy-manager -k
# alle chains leeren
$iptables -F
$iptables -t nat -F
# alle userdefined chains löschen
$iptables -X
# default policies
$iptables -P INPUT ACCEPT
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD ACCEPT
}
##############################################################
runfile=/var/run/firewall
case "$1" in
start)
if [ -e $runfile ]; then
echo "Firewall already running..."
echo "see: $runfile"
exit 1;
fi
echo "Starting firewall..."
firewall_config
echo "config: ext_int: $ext_int"
echo " int_int: $int_int"
echo " server_ext: $server_ext"
echo " server_int: $server_int"
firewall_init
firewall_intranet
firewall_internet
touch $runfile
echo "...done"
;;
stop)
if [ ! -e $runfile ]; then
echo "Firewall is not running..."
exit 1;
fi
echo -n "Stopping firewall..."
firewall_stop
rm $runfile
echo "done"
;;
restart)
$0 stop
$0 start
;;
status)
/usr/local/sbin/proxy-manager -t
echo -n "Checking for firewall..."
if [ -e $runfile ]; then
echo "running"
else
echo "not running!"
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
exit 0