#!/bin/sh # # Copyright 2001, James Lee # Released under the GPL. # ### firewall start-up script case "$1" in start) ## set up variables # external interface EX_IN=eth0 # internal interface IN_IN=eth1 # external ip EX_IP="123.45.678.9" # internal network IN_NET="192.168.1.0/24" # dns servers DNS1="123.45.678.10" DNS2="123.45.678.11" DNS3="123.45.678.12" # turn on Source Address Verification and get # spoof protection on all current and future interfaces. if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then echo -n "Setting up IP spoofing protection..." for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done echo "done." else echo "Can't set up spoofing protection." fi # masquerading echo "Turning on masquerading..." echo 1 > /proc/sys/net/ipv4/ip_forward ### ### the ipchains commands ### echo "Executing ipchains commands..." ## initial stuff # flush current rules /sbin/ipchains -F # deny all packets while we set up the firewall - # these rules will be deleted later /sbin/ipchains -I input 1 -j DENY /sbin/ipchains -I forward 1 -j DENY /sbin/ipchains -I output 1 -j DENY # allow all packets to local interface /sbin/ipchains -A input -i lo -s 0/0 -d 0/0 -j ACCEPT /sbin/ipchains -A output -i lo -s 0/0 -d 0/0 -j ACCEPT # set up policies /sbin/ipchains -P input DENY /sbin/ipchains -P forward DENY /sbin/ipchains -P output ACCEPT # allow all packets from internal network to firewall /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d $IN_NET -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p tcp -s $IN_NET -d $IN_NET -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p udp -s $IN_NET -d $IN_NET -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p udp -s $IN_NET -d $IN_NET -j ACCEPT ## ip masquerading /sbin/ipchains -A forward -i $EX_IN -s $IN_NET -d 0/0 -j MASQ ## enter rules for allowed packets # dns /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d $DNS1 domain -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p udp -s $IN_NET -d $DNS1 domain -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d $DNS1 domain -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p udp -s $EX_IP -d $DNS1 domain -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s $DNS1 domain -j ACCEPT ! -y /sbin/ipchains -A input -i $EX_IN -p udp -d $EX_IP -s $DNS1 domain -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s $DNS1 domain -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p udp -d $IN_NET -s $DNS1 domain -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d $DNS2 domain -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p udp -s $IN_NET -d $DNS2 domain -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d $DNS2 domain -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p udp -s $EX_IP -d $DNS2 domain -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s $DNS2 domain -j ACCEPT ! -y /sbin/ipchains -A input -i $EX_IN -p udp -d $EX_IP -s $DNS2 domain -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s $DNS2 domain -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p udp -d $IN_NET -s $DNS2 domain -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d $DNS3 domain -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p udp -s $IN_NET -d $DNS3 domain -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d $DNS3 domain -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p udp -s $EX_IP -d $DNS3 domain -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s $DNS3 domain -j ACCEPT ! -y /sbin/ipchains -A input -i $EX_IN -p udp -d $EX_IP -s $DNS3 domain -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s $DNS3 domain -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p udp -d $IN_NET -s $DNS3 domain -j ACCEPT # ping out but not in... /sbin/ipchains -A input -i $EX_IN -p icmp --icmp-type echo-request -s 0/0 -d $EX_IP -j DENY /sbin/ipchains -A input -i $IN_IN -p icmp --icmp-type echo-request -s $IN_NET -d 0/0 -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p icmp --icmp-type echo-request -s $EX_IP -d 0/0 -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p icmp --icmp-type echo-reply -s 0/0 -d $EX_IP -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p icmp --icmp-type echo-reply -s 0/0 -d $IN_NET -j ACCEPT # telnet out /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 telnet -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 telnet -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 telnet -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 telnet -j ACCEPT # pop3 out /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 110 -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 110 -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 110 -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 110 -j ACCEPT # http out /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 www -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 www -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 www -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 www -j ACCEPT # https out /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 https -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 https -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 https -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 https -j ACCEPT # smtp out /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 smtp -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 smtp -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 smtp -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 smtp -j ACCEPT # ssh out /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 ssh -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 ssh -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 ssh -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 ssh -j ACCEPT # sendmail to 123.45.678.9 (mail server is 192.168.1.2) /sbin/ipchains -A input -i $EX_IN -p tcp -d 123.45.678.9 smtp -s 0/0 -j ACCEPT /sbin/ipchains -A output -i $IN_IN -p tcp -d 192.168.1.2 smtp -s 0/0 -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p tcp -s 192.168.1.2 smtp -d 0/0 -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s 123.45.678.9 smtp -d 0/0 -j ACCEPT # pop3 to 123.45.678.9 (pop3 server is 192.168.1.2) /sbin/ipchains -A input -i $EX_IN -p tcp -d 123.45.678.9 pop3 -s 0/0 -j ACCEPT -l /sbin/ipchains -A output -i $IN_IN -p tcp -d 192.168.1.2 pop3 -s 0/0 -j ACCEPT -l /sbin/ipchains -A input -i $IN_IN -p tcp -s 192.168.1.2 pop3 -d 0/0 -j ACCEPT -l /sbin/ipchains -A output -i $EX_IN -p tcp -s 123.45.678.9 -d 0/0 -j ACCEPT -l # to allow pop to happen faster /sbin/ipchains -A input -i $EX_IN -p tcp -d 123.45.678.9 -s 0/0 -j REJECT /sbin/ipchains -A output -i $IN_IN -p tcp -d 192.168.1.2 113 -s 0/0 -j REJECT /sbin/ipchains -A input -i $IN_IN -p tcp -s 192.168.1.2 113 -d 0/0 -j REJECT /sbin/ipchains -A output -i $EX_IN -p tcp -s 123.45.678.9 -d 0/0 -j REJECT /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 113 -j REJECT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 113 -j REJECT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 113 -j REJECT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 113 -j REJECT # www rules (192.168.1.2 is apache server) /sbin/ipchains -A output -i $IN_IN -p tcp -d 192.168.1.2 www -s 0/0 -j ACCEPT /sbin/ipchains -A input -i $IN_IN -p tcp -s 192.168.1.2 www -d 0/0 -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d 123.45.678.9 -s 0/0 -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s 123.45.678.9 -d 0/0 -j ACCEPT # real audio /sbin/ipchains -A input -i $IN_IN -p tcp -s $IN_NET -d 0/0 554 -j ACCEPT /sbin/ipchains -A output -i $EX_IN -p tcp -s $EX_IP -d 0/0 554 -j ACCEPT /sbin/ipchains -A input -i $EX_IN -p tcp -d $EX_IP -s 0/0 554 -j ACCEPT ! -y /sbin/ipchains -A output -i $IN_IN -p tcp -d $IN_NET -s 0/0 554 -j ACCEPT ## do the ip port forwarding echo "setting up port forwarding..." /usr/sbin/ipmasqadm portfw -f # web server /usr/sbin/ipmasqadm portfw -a -P tcp -L 123.45.678.9 -R 192.168.1.2 80 # mail server /usr/sbin/ipmasqadm portfw -a -P tcp -L 123.45.678.9 -R 192.168.1.2 25 # pop3 server /usr/sbin/ipmasqadm portfw -a -P tcp -L 123.45.678.9 -R 192.168.1.2 110 ## final stuff # if a packet gets this far, deny it and log it /sbin/ipchains -A input -j DENY -l /sbin/ipchains -A forward -j DENY -l # except output packets are ok /sbin/ipchains -A output -j ACCEPT -l # delete the intial blocking rules /sbin/ipchains -D input 1 /sbin/ipchains -D forward 1 /sbin/ipchains -D output 1 # probe modules modprobe ip_masq_ftp modprobe ip_masq_raudio modprobe ip_masq_autofw modprobe ip_masq_mfw modprobe ip_masq_portfw modprobe ip_masq_user ;; stop) echo Shutting down firewall... /sbin/ipchains -F input /sbin/ipchains -F forward /sbin/ipchains -F output /sbin/ipchains -P input ACCEPT /sbin/ipchains -P forward ACCEPT /sbin/ipchains -P output ACCEPT echo 0 > /proc/sys/net/ipv4/ip_forward ;; esac exit 0