#!/bin/sh
 #------------------------------------------------------------
 # DO NOT MODIFY THIS FILE! It is updated automatically by the
 # SME Server software. Instead, modify the source template in
 # an /etc/e-smith/templates-custom directory. For more
 # information, see http://www.e-smith.org/custom/
 #
 # copyright (C) 1999-2003 Mitel Networks Corporation
 #------------------------------------------------------------
           INTERNALIF=eth0
     OUTERIF=eth1
     OUTERNET=$(/sbin/e-smith/db configuration get ExternalIP)
     if [ -z "$OUTERNET" ]
     then
  # Make sure that OUTERNET value is set to syntactly valid value
  # to ensure that iptables syntax is at least correct
  OUTERNET=1.2.3.4
     fi
   adjust_tcp_in() {
     local dport=$1
     local target=$2
     local chain=$3
     local dnet=$4
     # Add the rule requested.
     rule="/sbin/iptables --append $chain --protocol tcp --dport $dport"
     if [ -n "$dnet" ]; then
         rule="$rule --destination $dnet"
     fi
     rule="$rule --in-interface $OUTERIF --jump $target"
     $rule
     }
   adjust_udp_in() {
     local dport=$1
     local target=$2
     local chain=$3
     local dnet=$4
     # Add the rule requested.
     rule="/sbin/iptables --append $chain --protocol udp --dport $dport"
     if [ -n "$dnet" ]; then
         rule="$rule --destination $dnet"
     fi
     rule="$rule --in-interface $OUTERIF --jump $target"
     $rule
     }
   get_safe_id() {
     # Expect arguments of, chain_name, table, mode, where mode can be either
     # find or new
     local chain_name=$1
     local table=$2
     local mode=$3
       # Find the existing numbered chain.
     current=$(/sbin/iptables --table $table --list $chain_name --numeric |\
         sed -n '3s/ .*//p')
     if [ "x$current" = "x" ]; then
         # We didn't find it.
         echo "ERROR: Cannot find chain $chain_name in table $table" 1>&2
         exit 1
     fi
       # If we're in find mode, return this chain.
     case "$mode" in
     find)           echo $current ;;
       new)
         # Make sure the number on this chain doesn't conflict with our
         # process ID.
         current_id=$(echo $current |\
         sed -n -e "s/^$chain_name//" -e "s/^_//p" )
         if [ "x$current_id" = "x" ]
         then
         echo "ERROR: Cannot find process ID on chain name" 1>&2
         exit 1
         fi
         # If it conflicts with our process ID, add one to ours.
         if [ $current_id -eq $$ ]
         then
         echo ${chain_name}_$(expr $$ + 1)
         else
         echo ${chain_name}_$$
         fi
     ;;
     esac
 }
   case "$1" in
    start)
     echo -n "Enabling IP masquerading: "
       /sbin/iptables -F -t filter
     /sbin/iptables -F -t nat
     /sbin/iptables -F -t mangle
     /sbin/iptables -X -t filter
     /sbin/iptables -X -t nat
     /sbin/iptables -X -t mangle
     /sbin/iptables --flush  FORWARD
     /sbin/iptables --flush  INPUT
     /sbin/iptables --flush  OUTPUT
 /sbin/modprobe ip_nat_ftp
 /sbin/modprobe ip_conntrack_ftp
       /sbin/iptables --new-chain denylog
     /sbin/iptables --append denylog --jump DROP
     /sbin/iptables --append denylog --jump DROP
     /sbin/iptables --append denylog --jump DROP
     /sbin/iptables --append denylog --jump DROP
     /sbin/iptables --append denylog --jump DROP
     # Set telnet, www, smtp, pop3 and FTP for minimum delay       for port in 21 22 23 25 80 110
     do
         /sbin/iptables --table mangle --append OUTPUT \
      --protocol tcp --dport $port \
      -j TOS --set-tos Minimize-Delay
     done
       # Set ftp-data for maximum throughput
     /sbin/iptables --table mangle --append OUTPUT \
      --protocol tcp --dport 20 \
      -j TOS --set-tos Maximize-Throughput
     # TODO - this hasn't yet been converted for iptables - does it
     # need to be?
       # set timeouts for tcp tcpfin udp
     #/sbin/iptables --masquerading --set 14400 60 600
       /sbin/iptables --table nat --new-chain SMTPProxy
     /sbin/iptables --table nat --append PREROUTING\
  -p tcp --dport 25 -j SMTPProxy
     /sbin/iptables --table nat --append SMTPProxy \
  --destination 127.0.0.1 --jump ACCEPT
     /sbin/iptables --table nat --append SMTPProxy \
  --destination 192.168.1.1 --jump ACCEPT
     /sbin/iptables --table nat --append SMTPProxy \
  --destination $OUTERNET --jump ACCEPT
     /sbin/iptables --table nat --append SMTPProxy\
  -p TCP -j DNAT --to 192.168.1.1:25
       /sbin/iptables --table nat --new-chain TransProxy
     /sbin/iptables --table nat --append PREROUTING\
  -p tcp --dport 80 -j TransProxy
     /sbin/iptables --table nat --append TransProxy \
  --destination 127.0.0.1 --jump ACCEPT
     /sbin/iptables --table nat --append TransProxy \
  --destination 192.168.1.1 --jump ACCEPT
     /sbin/iptables --table nat --append TransProxy \
  --destination $OUTERNET --jump ACCEPT
     /sbin/iptables --table nat --append TransProxy\
  -p TCP -j DNAT --to 192.168.1.1:3128
         /sbin/iptables --new-chain state_chk
     # Allow any already established or related connection
     /sbin/iptables --append state_chk -m state --state ESTABLISHED,RELATED -j ACCEPT
       # We filter all input and forwarded traffic this way
     /sbin/iptables --append INPUT -j state_chk
     /sbin/iptables --append FORWARD -j state_chk
       # Create a new chain to handle local traffic
     /sbin/iptables --new-chain local_chk
     /sbin/iptables --new-chain local_chk_1
       # Accept any traffic initiated on "local" interfaces
     /sbin/iptables --append local_chk_1 \
  --in-interface ! $OUTERIF -j ACCEPT
     /sbin/iptables --append local_chk -j local_chk_1
       # We filter all input and forwarded traffic this way
     /sbin/iptables --append INPUT -j local_chk
     /sbin/iptables --append FORWARD -j local_chk
         # Create new chain to handle PPP interfaces from PPTP connections.
     # Note: We cannot simply permit ppp+, as that would put a huge hole in the
     # firewall for PPPoE users.
     /sbin/iptables --new-chain PPPconn
     /sbin/iptables --new-chain PPPconn_1
     /sbin/iptables --append INPUT -j PPPconn
     /sbin/iptables --append OUTPUT -j PPPconn
     /sbin/iptables --append PPPconn -j PPPconn_1
     # Drop all multicast traffic. Note that anything on from a local network
     # will have already been accepted via the local_chk chain.
     /sbin/iptables --append INPUT -s 224.0.0.0/4    -j DROP
     /sbin/iptables --append INPUT -d 224.0.0.0/4    -j DROP
           /sbin/iptables --append OUTPUT -s 224.0.0.0/4   -j DROP
     /sbin/iptables --append OUTPUT -d 224.0.0.0/4   -j DROP
     /sbin/iptables --table nat --new-chain PostroutingOutbound
     /sbin/iptables --table nat --append PostroutingOutbound \
  --source $OUTERNET -j ACCEPT
     /sbin/iptables --append PostroutingOutbound -t nat -j MASQUERADE
     /sbin/iptables --append POSTROUTING -t nat \
  --out-interface $OUTERIF -j PostroutingOutbound
     /sbin/iptables --append INPUT -p udp --dport 67:68 -i $OUTERIF -j ACCEPT
       /sbin/iptables --new-chain InboundICMP
     /sbin/iptables --new-chain InboundICMP_1
     /sbin/iptables --append INPUT --protocol icmp --jump InboundICMP
     /sbin/iptables --append InboundICMP --protocol icmp --jump InboundICMP_1
     # Catch any returns, just in case
     /sbin/iptables --append INPUT --protocol icmp --jump denylog
     /sbin/iptables --append InboundICMP --protocol icmp --jump denylog
     /sbin/iptables --new-chain OutboundICMP
     /sbin/iptables --new-chain OutboundICMP_1
     /sbin/iptables --append OUTPUT --protocol icmp --jump OutboundICMP
     /sbin/iptables --append OutboundICMP --protocol icmp --jump OutboundICMP_1
     # Catch any returns, just in case
     /sbin/iptables --append OUTPUT --protocol icmp --jump denylog
     /sbin/iptables --append OutboundICMP --protocol icmp --jump denylog
     /sbin/iptables --new-chain ForwardedTCP
     /sbin/iptables --new-chain ForwardedTCP_1
     /sbin/iptables --append FORWARD --protocol tcp --syn --jump ForwardedTCP
     /sbin/iptables --append ForwardedTCP --protocol tcp --syn --jump ForwardedTCP_1
     # Catch any returns.
     /sbin/iptables --append ForwardedTCP --protocol tcp --syn --jump denylog
     /sbin/iptables --new-chain InboundTCP
     /sbin/iptables --new-chain InboundTCP_1
     /sbin/iptables --append INPUT --protocol tcp --syn --jump InboundTCP
     /sbin/iptables --append InboundTCP --protocol tcp --syn --jump InboundTCP_1
     # Catch any returns, just in case
     /sbin/iptables --append INPUT --protocol tcp --syn --jump denylog
     /sbin/iptables --append InboundTCP --protocol tcp --syn --jump denylog
     /sbin/iptables --new-chain ForwardedUDP
     /sbin/iptables --new-chain ForwardedUDP_1
     /sbin/iptables --append FORWARD --protocol udp --jump ForwardedUDP
     /sbin/iptables --append ForwardedUDP --protocol udp --jump ForwardedUDP_1
     # Catch any returns.
     /sbin/iptables --append ForwardedUDP --protocol udp --jump denylog
     /sbin/iptables --new-chain InboundUDP
     /sbin/iptables --new-chain InboundUDP_1
     /sbin/iptables --append INPUT --protocol udp --in-interface $OUTERIF \
        --jump InboundUDP
     /sbin/iptables --append InboundUDP --protocol udp --jump InboundUDP_1
     # Catch any returns, just in case
     /sbin/iptables --append INPUT --protocol udp --in-interface $OUTERIF \
        --jump denylog
     /sbin/iptables --append InboundUDP --protocol udp --jump denylog
     /sbin/iptables -t nat --new-chain PortForwarding
     /sbin/iptables -t nat --new-chain PortForwarding_1
     /sbin/iptables -t nat --insert PREROUTING --jump PortForwarding
     /sbin/iptables -t nat --append PortForwarding --destination $OUTERNET \
                     --jump PortForwarding_1
       /sbin/iptables --append INPUT -p udp --sport 67:68 -i $INTERNALIF -j ACCEPT
   # Allow IMAPS on port 993
 /sbin/ipchains --append input -p tcp -s 0/0 -d $OUTERNET 993 -j ACCEPT
 /sbin/ipchains --append output ! -y -p tcp -d 0/0 -s $OUTERNET 993 -j ACCEPT
   # Allow POP3S on port 995
 /sbin/ipchains --append input -p tcp -s 0/0 -d $OUTERNET 995 -j ACCEPT
 /sbin/ipchains --append output ! -y -p tcp -d 0/0 -s $OUTERNET 995 -j ACCEPT
   # Allow SMTPS on port 465
 /sbin/ipchains --append input -p tcp -s 0/0 -d $OUTERNET 465 -j ACCEPT
 /sbin/ipchains --append output ! -y -p tcp -d 0/0 -s $OUTERNET 465 -j ACCEPT
       /sbin/iptables --new-chain gre-in
     /sbin/iptables --append INPUT -p 47 -j gre-in
     /sbin/iptables --append INPUT -p 47 -j denylog
     /sbin/iptables --append gre-in -d \! $OUTERNET -j denylog
     /sbin/iptables --append gre-in -j denylog
           /sbin/iptables --policy FORWARD DROP
     /sbin/iptables --append FORWARD --jump denylog
           /sbin/iptables --policy INPUT DROP
     /sbin/iptables --append INPUT --jump denylog
           /sbin/iptables --policy OUTPUT ACCEPT
     /sbin/iptables --append OUTPUT --jump ACCEPT
     $0 adjust
     echo "done"
     ;;
     adjust)
     OLD_ForwardedTCP=$(get_safe_id ForwardedTCP filter find)
     NEW_ForwardedTCP=$(get_safe_id ForwardedTCP filter new)
     /sbin/iptables --new-chain $NEW_ForwardedTCP
         /sbin/iptables --replace ForwardedTCP 1 \
         --jump $NEW_ForwardedTCP
     /sbin/iptables --flush $OLD_ForwardedTCP
     /sbin/iptables --delete-chain $OLD_ForwardedTCP
       OLD_ForwardedUDP=$(get_safe_id ForwardedUDP filter find)
     NEW_ForwardedUDP=$(get_safe_id ForwardedUDP filter new)
     /sbin/iptables --new-chain $NEW_ForwardedUDP
         /sbin/iptables --replace ForwardedUDP 1 \
         --jump $NEW_ForwardedUDP
     /sbin/iptables --flush $OLD_ForwardedUDP
     /sbin/iptables --delete-chain $OLD_ForwardedUDP
       OLD_InboundTCP=$(get_safe_id InboundTCP filter find)
     NEW_InboundTCP=$(get_safe_id InboundTCP filter new)
     /sbin/iptables --new-chain $NEW_InboundTCP
     /sbin/iptables --append $NEW_InboundTCP \! --destination $OUTERNET --jump denylog
       adjust_tcp_in 113 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 21 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 80 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 443 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 143 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 389 denylog $NEW_InboundTCP
     adjust_tcp_in 110 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 1723 denylog $NEW_InboundTCP
     adjust_tcp_in 25 denylog $NEW_InboundTCP
     adjust_tcp_in 22 ACCEPT $NEW_InboundTCP
     adjust_tcp_in 23 denylog $NEW_InboundTCP
       /sbin/iptables --replace InboundTCP 1 \
      --jump $NEW_InboundTCP
     /sbin/iptables --flush $OLD_InboundTCP
     /sbin/iptables --delete-chain $OLD_InboundTCP
       OLD_InboundUDP=$(get_safe_id InboundUDP filter find)
     NEW_InboundUDP=$(get_safe_id InboundUDP filter new)
     /sbin/iptables --new-chain $NEW_InboundUDP
     /sbin/iptables --append $NEW_InboundUDP \! --destination $OUTERNET --jump denylog
         /sbin/iptables --replace InboundUDP 1 \
      --jump $NEW_InboundUDP
     /sbin/iptables --flush $OLD_InboundUDP
     /sbin/iptables --delete-chain $OLD_InboundUDP
          /sbin/iptables --replace denylog 1 --jump DROP
     /sbin/iptables --replace gre-in 1 -d \! $OUTERNET -j denylog
     /sbin/iptables --replace gre-in 2 -j denylog
     # Find the current InboundICMP_$$ chain, and create a new one.
     IBI=$(get_safe_id InboundICMP filter find)
     new=$(get_safe_id InboundICMP filter new)
     /sbin/iptables --new-chain $new
     /sbin/iptables --append $new --proto icmp \
  --icmp-type echo-request --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type echo-reply --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type destination-unreachable --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type source-quench --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type time-exceeded --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type parameter-problem --jump ACCEPT
       /sbin/iptables --append $new --jump denylog
     /sbin/iptables --replace InboundICMP 1 --jump $new
     /sbin/iptables --flush "$IBI"
     /sbin/iptables --delete-chain "$IBI"
     # Find the current OutboundICMP_$$ chain, and create a new one.
     OBICMP=$(get_safe_id OutboundICMP filter find)
     new=$(get_safe_id OutboundICMP filter new)
     /sbin/iptables --new-chain $new
     /sbin/iptables --append $new --proto icmp \
  --icmp-type echo-request --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type echo-reply --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type destination-unreachable --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type source-quench --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type time-exceeded --jump ACCEPT
     /sbin/iptables --append $new --proto icmp \
  --icmp-type parameter-problem --jump ACCEPT
       /sbin/iptables --append $new --jump denylog
     /sbin/iptables --replace OutboundICMP 1 --jump $new
     /sbin/iptables --flush $OBICMP
     /sbin/iptables --delete-chain $OBICMP
     /sbin/iptables --table nat --replace PostroutingOutbound 1 \
  --source $OUTERNET -j ACCEPT
     /sbin/iptables --table nat \
  --replace SMTPProxy 3\
  --destination $OUTERNET --jump ACCEPT
     /sbin/iptables --table nat --replace SMTPProxy 4
       /sbin/iptables --table nat \
  --replace TransProxy 3\
  --destination $OUTERNET --jump ACCEPT
     /sbin/iptables --table nat --replace TransProxy 4\
  -p TCP -j DNAT --to 192.168.1.1:3128
       OLD_local_chk=$(get_safe_id local_chk filter find)
     NEW_local_chk=$(get_safe_id local_chk filter new)
     /sbin/iptables --new-chain $NEW_local_chk
     /sbin/iptables -A $NEW_local_chk --in-interface lo -j ACCEPT
       for network in 192.168.1.0/255.255.255.0
     do
         /sbin/iptables -A $NEW_local_chk -s $network -j ACCEPT
     done
       /sbin/iptables --replace local_chk 1 \
         --jump $NEW_local_chk
     /sbin/iptables --flush $OLD_local_chk
     /sbin/iptables --delete-chain $OLD_local_chk
   # Create a new PortForwarding chain
 PFC=$(/sbin/iptables --table nat --numeric --list PortForwarding |\
    sed -n '3s/ .*//p')
     /sbin/iptables --table nat --new-chain PortForwarding_$$
     /sbin/iptables --table nat --replace PortForwarding 1 --destination $OUTERNET --jump PortForwarding_$$
     /sbin/iptables --table nat --flush $PFC
     /sbin/iptables --table nat --delete-chain $PFC
       ;;
     masqstop)
       echo ""
       echo -n "Shuting down IP Masquerading:"
       /sbin/iptables -F FORWARD
       /sbin/iptables -P FORWARD DROP
       echo "  Done!"
       echo "" ;;
 restart)
         $0 stop
         $0 start
         ;;
      status)
       echo $"Table: filter"
       /sbin/iptables --list -n
       echo $"Table: nat"
       /sbin/iptables -t nat --list -n
       echo $"Table: mangle"
       /sbin/iptables -t mangle --list -n
       ;;
   stop)
      echo ""
      echo -n "Shutting down IP masquerade and firewall rules:"
      /sbin/iptables -P FORWARD DROP
      /sbin/iptables -P OUTPUT ACCEPT
      /sbin/iptables -P INPUT DROP
      /sbin/iptables -F INPUT
      /sbin/iptables -F OUTPUT
      /sbin/iptables -F FORWARD
      /sbin/iptables -F       /sbin/iptables --append FORWARD -s 192.168.1.0/255.255.255.0 -d 192.168.1.0/255.255.255.0 -j ACCEPT
      /sbin/iptables -X        echo "  Done!"
      echo "" ;;
      *)
     echo "Usage: masq {start|stop|restart|...}"
     exit 1
   esac
 exit 0
   |