#!/bin/sh

status="0"

LO_IP="127.0.0.1"
LO_NETMASK="127.0.0.0"
ETH0_IP="10.0.0.254"
ETH0_NETMASK="10.0.0.0"
ETH1_IP="192.168.1.254"
ETH1_NETMASK="192.168.1.0"
TUN0_IP="192.168.254.1"
TUN0_NETMASK="192.168.254.0"

SERVER_IP="1.2.3.4"

startFirewall()
  {
    echo -n "Starting Firewall .................... "
    echo "Done."
    echo

##################################################################################################################################################################################
##################################################################################################################################################################################
##################################################################################################################################################################################

    echo -n "Create Rules for Chain: INPUT .................... "
    /sbin/iptables --table filter --append INPUT --protocol TCP --match multiport --destination-port 25,110,143 --jump ACCEPT || { status="1"; echo "Setting up Rule: MAIL_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol TCP --match multiport --destination-port 53 --jump ACCEPT || { status="1"; echo "Setting up Rule: DNS_TCP_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol UDP --match multiport --destination-port 53 --jump ACCEPT || { status="1"; echo "Setting up Rule: DNS_UDP_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol TCP --match multiport --destination-port 80,443 --jump ACCEPT || { status="1"; echo "Setting up Rule: HTTP_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol TCP --match multiport --destination-port 100 --jump ACCEPT || { status="1"; echo "Setting up Rule: SSH_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol UDP --match multiport --destination-port 1194 --jump ACCEPT || { status="1"; echo "Setting up Rule: VPN_SERVER FAILED !!!"; exit 1; }

    /sbin/iptables --table filter --append INPUT --protocol ICMP --icmp-type 0 --jump ACCEPT || { status="1"; echo "Setting up Rule: ICMP_0_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol ICMP --icmp-type 3 --jump ACCEPT || { status="1"; echo "Setting up Rule: ICMP_3_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol ICMP --icmp-type 8 --jump ACCEPT || { status="1"; echo "Setting up Rule: ICMP_8_SERVER FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol ICMP --icmp-type 11 --jump ACCEPT || { status="1"; echo "Setting up Rule: ICMP_11_SERVER FAILED !!!"; exit 1; }

    /sbin/iptables --table filter --append INPUT --protocol ALL --in-interface lo --jump ACCEPT || { status="1"; echo "Setting up Rule: LOOPBACK FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol ALL --in-interface eth1 --jump ACCEPT || { status="1"; echo "Setting up Rule: LOCALNET FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --protocol ALL --in-interface tun0 --jump ACCEPT || { status="1"; echo "Setting up Rule: LOCALNET FAILED !!!"; exit 1; }

    /sbin/iptables --table filter --append INPUT --match state --state RELATED,ESTABLISHED --jump ACCEPT || { status="1"; echo "Setting up Rule: CONNRACK FAILED !!!"; exit 1; }
    /sbin/iptables --table filter --append INPUT --match limit --limit 1/second --jump LOG || { status="1"; echo "Setting up Rule: LOGGING FAILED !!!"; exit 1; }

    /sbin/iptables --table filter --policy INPUT DROP || { status="1"; echo "Setting up Rule: Chain: INPUT Default Target FAILED !!!"; exit 1; }
    echo "Done."

##################################################################################################################################################################################
##################################################################################################################################################################################
##################################################################################################################################################################################

    echo -n "Create Rules for Chain: OUTPUT .................... "
    /sbin/iptables --table filter --append OUTPUT --protocol ALL --source ${LO_IP} --jump ACCEPT
    /sbin/iptables --table filter --append OUTPUT --protocol ALL --source ${ETH0_IP} --jump ACCEPT
    /sbin/iptables --table filter --append OUTPUT --protocol ALL --source ${ETH1_IP} --jump ACCEPT
    /sbin/iptables --table filter --append OUTPUT --protocol ALL --source ${TUN0_IP} --jump ACCEPT

    /sbin/iptables --table filter --policy OUTPUT DROP || { status="1"; echo "Setting up Rule: Chain: OUTPUT Default Target FAILED !!!"; exit 1; }
    echo "Done."

##################################################################################################################################################################################
##################################################################################################################################################################################
##################################################################################################################################################################################

    echo -n "Create Rules for Chain: POSTROUTING .................... "
    /sbin/iptables --table nat --insert POSTROUTING --out-interface eth0 --jump MASQUERADE || { status="1"; echo "Setting up Rule: POSTROUTING FAILED !!!"; exit 1; }
    /sbin/iptables --table nat --insert PREROUTING --destination ${SERVER_IP} --jump DNAT --to-destination ${ETH0_IP} || { status="1"; echo "Setting up Rule: PREROUTING FAILED !!!"; exit 1; }
    echo "Done."

##################################################################################################################################################################################
##################################################################################################################################################################################
##################################################################################################################################################################################

    echo
    /etc/init.d/iptables save active
    echo
  }

stopFirewall()
  {
    echo -n "Shutdown Firewall .................... "
    /sbin/iptables -t nat -F || status="1"
    /sbin/iptables -t nat -X || status="1"
    /sbin/iptables -t filter -F || status="1"
    /sbin/iptables -t filter -X || status="1"
    /sbin/iptables -t filter -P INPUT ACCEPT || status="1"
    /sbin/iptables -t filter -P OUTPUT ACCEPT || status="1"
    /sbin/iptables -t filter -P FORWARD ACCEPT || status="1"
    echo "Done."
    echo
    /etc/init.d/iptables save active
    echo
  }

case $1 in
  start)
  echo
  startFirewall
  ;;
  stop)
  echo
  stopFirewall
  ;;
  restart)
  echo
  stopFirewall
  startFirewall
  ;;
  *)
  echo "Usage: firewall { start | stop | restart } "
  ;;
esac

if [ "$status" = "1" ];
  then
    exit 1
  else
    exit 0
fi
