home *** CD-ROM | disk | FTP | other *** search
/ PCNET 2006 September - Disc 1 / PCNET_CD_2006_09.iso / linux / puppy-barebones-2.01r2.iso / pup_201.sfs / usr / sbin / firewall_install.sh < prev    next >
Encoding:
Linux/UNIX/POSIX Shell Script  |  2005-12-28  |  91.9 KB  |  2,709 lines

  1. #!/bin/bash
  2. #
  3. # The Linux Firewall Project Graphical Installation Utility
  4. # Version 1.1 -- 1/21/03
  5. # http://projectfiles.com/firewall/ 
  6. #
  7. # Linux Firewall
  8. # Copyright (C) 2001-2002 Scott Bartlett <srb@mnsolutions.com>
  9. #
  10. # Graphical Installation Utility
  11. # Copyright (C) 2002 Vincent Rivellino <var@mnsolutions.com>
  12. #                    and Scott Bartlett <srb@mnsolutions.com>
  13. #
  14. # This program is free software; you can redistribute it and/or
  15. # modify it under the terms of the GNU General Public License
  16. # as published by the Free Software Foundation; either version 2
  17. # of the License, or (at your option) any later version.
  18. #
  19. # This program is distributed in the hope that it will be useful,
  20. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22. # GNU General Public License for more details:
  23. # http://www.gnu.org/licenses/gpl.html
  24. #
  25. #
  26. ##############################################
  27. # -- Administrative Configuration Options -- #
  28. ##############################################
  29. #
  30. # LONG_NETWORK_NAME below should be a character string to be displayed
  31. # by the installer as an explanation of the list of networks and/or
  32. # hosts defined in LOCAL_NETWORK. SHORT_NETWORK_NAME should be a single
  33. # word that will be used when highlighting your choice of networks.
  34. # The LOCAL_NETWORK variable should consist of a space
  35. # delimited list of networks and hosts with netmasks between 0 and 32
  36. # in the format: <host or network address>[/<netmask>]
  37. # WARNING: None of these options are checked for input errors.  Please
  38. # enter information carefully.
  39.  
  40. LONG_NETWORK_NAME=""
  41. SHORT_NETWORK_NAME=""
  42. LOCAL_NETWORK=""
  43.  
  44. ###########################################################
  45. # -- Nothing below this point should need modification -- #
  46. ###########################################################
  47.  
  48. # Set version information.
  49.  
  50. GUI_VERSION="1.1"
  51. FW_VERSION="2.0rc9"
  52.  
  53. # Set PATH explicitly.
  54.  
  55. export PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"
  56.  
  57. # Set variables.
  58.  
  59. TMPFILE="/tmp/firewall.temp$$"
  60. FW_TMPFILE="/tmp/rc.firewall"
  61. FW_INSTALL="/etc/rc.d/rc.firewall"
  62. FW_PERM="750"
  63. permit_opt=""
  64. int_iface_opt=""
  65. dyn_iface_opt=""
  66. status="welcome"
  67.  
  68. if [ "$1" == "fast" ]; then
  69.   INIT="fast"
  70. else
  71.   INIT="start"
  72. fi
  73.  
  74. # Make sure we are root.
  75.  
  76. if [ "$EUID" != "0" ]; then
  77.   echo "You must have root privileges to run this utility!!!"
  78.   exit 1
  79. fi
  80.  
  81. # remove the TMPFILE ...
  82. rm -rf $TMPFILE > /dev/null 2>&1
  83.  
  84. # Define a default LONG_NETWORK_NAME if none exists.  This will be ignored if
  85. # there is no corresponding LOCAL_NETWORK.
  86.  
  87. if [ -z "$LONG_NETWORK_NAME" ]; then
  88.   LONG_NETWORK_NAME="predefined network"
  89. fi
  90.  
  91. # Do the same for SHORT_NETWORK_NAME.
  92.  
  93. if [ -z "$SHORT_NETWORK_NAME" ]; then
  94.   SHORT_NETWORK_NAME="local"
  95. fi
  96.  
  97. # Define exit subroutine.
  98.  
  99. goodbye()
  100. {
  101.   rm -f $TMPFILE > /dev/null 2>&1
  102.   clear
  103.   echo "Configuration terminated.  Goodbye."
  104.   exit
  105. }
  106.  
  107. # Convert a provided netmask of 255.255.252.0 to /24 notation if necessary.
  108.  
  109. make_mask()
  110. {
  111.   if [ "X$1" == "X" ]; then
  112.     echo -1
  113.     return
  114.   fi
  115.  
  116.   if [ "X`echo $1 | cut -s -f 1 -d '.'`" == "X" ]; then
  117.     if [ "$1" -ge "32" ]; then
  118.       echo -1
  119.     else
  120.       echo $1
  121.     fi
  122.     return
  123.   fi
  124.   MASK=$1
  125.  
  126.   LAST=1
  127.   for OCTET in 1 2 3 4; do
  128.     BINARY=`echo "$MASK" | cut -s -d . -f $OCTET`
  129.     if [ "X$BINARY" == "X" ]; then
  130.       echo -1
  131.       exit
  132.     fi
  133.     for SUBTRACT in 128 64 32 16 8 4 2 1; do
  134.       if [ "$((BINARY - SUBTRACT))" -ge "0" ]; then
  135.         BINARY=$((BINARY - SUBTRACT))
  136.         STROKE=$((STROKE + 1))
  137.         if [ "$LAST" != "1" ]; then
  138.           echo -1
  139.           exit
  140.         fi
  141.       else
  142.         LAST=0
  143.       fi
  144.     done
  145.   done
  146.   echo $STROKE
  147. }
  148.  
  149. # Given a servicename, return a string to add to the PERMIT option.
  150.  
  151. get_pstr()
  152. {
  153.   case "$1" in
  154.   '"ftp"')
  155.     echo "21/tcp"
  156.     ;;
  157.   '"ssh"')
  158.     echo "22/tcp"
  159.     ;;
  160.   '"smtp"')
  161.     echo "25/tcp"
  162.     ;;
  163.   '"dns"')
  164.     echo "53"
  165.     ;;
  166.   '"finger"')
  167.     echo "79/tcp"
  168.     ;;
  169.   '"http"')
  170.     echo "80/tcp"
  171.     ;;
  172.   '"pop3"')
  173.     echo "110/tcp"
  174.     ;;
  175.   '"auth"')
  176.     echo "113/tcp"
  177.     ;;
  178.   '"imap"')
  179.     echo "143/tcp"
  180.     ;;
  181.   '"https"')
  182.     echo "443/tcp"
  183.     ;;
  184.   '"syslog"')
  185.     echo "514/udp"
  186.     ;;
  187.   '"lpd"')
  188.     echo "515/tcp"
  189.     ;;
  190.   '"imaps"')
  191.     echo "993/tcp"
  192.     ;;
  193.   '"pop3s"')
  194.     echo "995/tcp"
  195.     ;;
  196.   *)
  197.     echo "other"
  198.   esac
  199. }
  200.  
  201. # Given a port from PERMIT, return a service name.
  202.  
  203. get_sstr()
  204. {
  205.   case "$1" in
  206.   '21/tcp')
  207.     echo "FTP [21/tcp]"
  208.     ;;
  209.   '22/tcp')
  210.     echo "SSH [22/tcp]"
  211.     ;;
  212.   '25/tcp')
  213.     echo "SMTP [25/tcp]"
  214.     ;;
  215.   '53')
  216.     echo "DNS [53/udp 53/tcp]"
  217.     ;;
  218.   '79/tcp')
  219.     echo "FINGER [79/tcp]"
  220.     ;;
  221.   '80/tcp')
  222.     echo "HTTP [80/tcp]"
  223.     ;;
  224.   '110/tcp')
  225.     echo "POP3 [110/tcp]"
  226.     ;;
  227.   '113/tcp')
  228.     echo "AUTH [113/tcp]"
  229.     ;;
  230.   '143/tcp')
  231.     echo "IMAP [143/tcp]"
  232.     ;;
  233.   '443/tcp')
  234.     echo "HTTPS [443/tcp]"
  235.     ;;
  236.   '514/udp')
  237.     echo "SYSLOG [514/udp]"
  238.     ;;
  239.   '515/tcp')
  240.     echo "LPD [515/tcp]"
  241.     ;;
  242.   '993/tcp')
  243.     echo "IMAPS [993/tcp]"
  244.     ;;
  245.   '995/tcp')
  246.     echo "POP3S [995/tcp]"
  247.     ;;
  248.   *)
  249.     echo "PORT $1" # other
  250.   esac
  251. }
  252.  
  253. # Check dialog version.
  254.  
  255. if (( `which dialog 2>&1 | grep -c "which: no dialog in"` )); then
  256.   echo "Required program 'dialog' not found."
  257.   exit 1
  258. fi
  259.  
  260. DIALOG_VERSION=`dialog --version 2>&1`
  261. if (( `echo "$DIALOG_VERSION" | grep -c "0.9b"` )); then
  262.   DEFAULT_NO="--defaultno"
  263.   NO_CANCEL="--nocancel"
  264.   CANCEL_BACK="--cancel-label Back"
  265.   CANCEL_QUIT="--cancel-label Quit"
  266. elif (( `echo "$DIALOG_VERSION" | grep -c "0.9a"` )); then
  267.   DEFAULT_NO="--defaultno"
  268.   NO_CANCEL="--nocancel"
  269.   CANCEL_BACK=""
  270.   CANCEL_QUIT=""
  271. else
  272.   DEFAULT_NO=""
  273.   NO_CANCEL=""
  274.   CANCEL_BACK=""
  275.   CANCEL_QUIT=""
  276. fi
  277.  
  278. # Begin installer.
  279.  
  280. while [ "$status" != "exit" ]; do
  281.  
  282.   case "$status" in
  283.  
  284.   'welcome')
  285.    dialog --title "Linux Firewall Configuration Utility" $CANCEL_QUIT \
  286.       --menu "Welcome to installer version $GUI_VERSION for Linux Firewall version $FW_VERSION.  You can abort this installation at any time by pressing the [ESC] key.  Please select your desired installation type below.  The default installation will close all ports so that no services will be available to remote hosts.  A custom installation will allow you to configure remote access and provide an opportunity to enable Internet connection sharing for hosts on an attached private network." 18 55 2 \
  287.       "default" "Default Installation" \
  288.       "custom" "Custom Installation" 2> $TMPFILE
  289.  
  290.     if [ $? != 0 ]; then goodbye; fi
  291.     if [ "`cat $TMPFILE`" == "default" ]; then
  292.       status="writefile"
  293.     else
  294.       status="portlist"
  295.     fi
  296.     ;;
  297.  
  298.   'portlist')
  299.   dialog --title "Open Ports" --checklist "Below is a list of common services available on Linux systems.  Using the space bar, select the services ** running on this machine ** you wish to make available to remote hosts.  In the next section you will be given a chance to specify who is allowed to connect to each service.  Afterwards you will be given an opportunity to specify hosts and networks allowed to bypass the firewall altogether." 25 55 10 \
  300.       "ftp" "File Transfer Protocol [21/tcp]" off \
  301.       "ssh" "Secure Shell [22/tcp]" on \
  302.       "smtp" "Incoming Email (sendmail) [25/tcp]" off \
  303.       "dns" "Domain Name Service [53/udp & 53/tcp]]" off \
  304.       "finger" "Finger Service [79/tcp]" off \
  305.       "http" "Web Server [80/tcp]" off \
  306.       "pop3" "POP3 mail server [110/tcp]" off \
  307.       "auth" "Ident Auth service [113/tcp]" off \
  308.       "imap" "IMAP mail server [143/tcp]" off \
  309.       "https" "Secure Web Server [443/tcp]" off \
  310.       "syslog" "Remote System Logging [514/udp]" off \
  311.       "lpd" "LPR Print Spooler [515/tcp]" off \
  312.       "imaps" "Secure IMAP mail server [993/tcp]" off \
  313.       "pop3s" "Secure POP3 mail server [995/tcp]" off \
  314.       "other" "other port(s) not listed" off 2> $TMPFILE
  315.  
  316.     status=$?
  317.  
  318.     if [ "$status" == "255" ]; then goodbye
  319.     elif [ "$status" == "0" ]; then
  320.       permit_opt=""
  321.       for option in `cat $TMPFILE` ; do
  322.         option=`get_pstr $option`
  323.         if [ "$option" == "other" ]; then
  324.           status="otherports"
  325.         else
  326.           permit_opt="$permit_opt $option"
  327.         fi
  328.       done
  329.  
  330.       if [ "$status" != "otherports" ]; then
  331.         status="openports"
  332.       fi
  333.     else
  334.       status="natquestion"
  335.     fi
  336.     ;;
  337.  
  338.   'otherports')
  339.     dialog $CANCEL_BACK --title "Specify Open Ports" --inputbox "Numerically list additional ports or port ranges available to other connecting hosts.  In the next section you will be given a chance to specify who is allowed to connect to each port or port range.  Protocols 'tcp' and 'udp' can optionally be specified here.  If no protocol is specified, then connections to either protocol will be accepted.  Format: <port or port-range>[/<protocol>]  Example: \"901/tcp 92 2400-2500/tcp\"  This will open up TCP port 901, port 92 for both TCP and UDP, and TCP ports 2400 through 2500." \
  340.     19 55 2> $TMPFILE
  341.  
  342.     status=$?
  343.     if [ "$status" == "255" ]; then goodbye
  344.     elif [ "$status" == "0" ]; then
  345.       status="openports"
  346.       permit_opt="$permit_opt `cat $TMPFILE`"
  347.     else
  348.       status="portlist"
  349.     fi
  350.     ;;
  351.  
  352.   'openports')
  353.     option=""
  354.     portnum=`echo $permit_opt | wc`
  355.     portnum=`echo $portnum | cut -f 2 -d ' '`
  356.     curport=0
  357.     for port in $permit_opt ; do
  358.       curport=`expr $curport + 1`
  359.       portstr=`get_sstr $port`
  360.       if [ -n "$LOCAL_NETWORK" ]; then
  361.  
  362.     dialog $NO_CANCEL --title "Port $curport of $portnum - $portstr" --menu "Who can access $portstr?" 10 55 3 \
  363.       "any" "Allow from anywhere" \
  364.       "$SHORT_NETWORK_NAME" "Allow from $LONG_NETWORK_NAME" \
  365.       "specify" "Specify Access" 2> $TMPFILE
  366.  
  367.       else
  368.  
  369.     dialog $NO_CANCEL --title "Port $curport of $portnum - $portstr" --menu "Who can access $portstr?" 9 55 2 \
  370.       "any" "Allow from anywhere" \
  371.       "specify" "Specify Access" 2> $TMPFILE
  372.  
  373.       fi
  374.       status=$?
  375.       if [ "$status" == "255" ]; then goodbye
  376.       elif [ "$status" == "0" ]; then
  377.         case "`cat $TMPFILE`" in
  378.         'any')
  379.           option="$option $port"
  380.           ;;
  381.         "$SHORT_NETWORK_NAME")
  382.           for net in $LOCAL_NETWORK ; do
  383.             option="$option $net:$port"
  384.           done
  385.           ;;
  386.         'specify')
  387.           status="loop"
  388.           while [ "$status" == "loop" ]; do
  389.             dialog $NO_CANCEL --title "Specify access to $portstr" --inputbox "Please specify which hosts and/or networks may connect to $portstr by entering a space-delimited list of hosts and/or networks.  Format: <host or network address>[/<netmask>]  Example: \"207.198.61.33 198.82.0.0/16\"" \
  390.             13 55 2> $TMPFILE
  391.  
  392.             status=$?
  393.             if [ "$status" == "255" ]; then goodbye
  394.             elif [ "$status" == "0" ]; then
  395.               for combo in `cat $TMPFILE` ; do
  396.                 if [ "X`echo $combo | cut -s -f 1 -d '/'`" == "X" ]; then
  397.                   option="$option $combo:$port"
  398.                   status="not a loop"
  399.                 else
  400.                   host=`echo $combo | cut -s -f 1 -d '/'`
  401.                   mask=`echo $combo | cut -s -f 2 -d '/'`
  402.                   newmask=`make_mask $mask`
  403.                   if [ "$newmask" == "-1" ]; then
  404.                     dialog --title "Invalid Bitmask" --msgbox "The host/netmask you specified (${host}/${mask}) was invalid.  Re-enter the full list of hosts and/or networks for port ${portstr}." \
  405.                     7 55
  406.                     status=$?
  407.                     if [ "$status" == "255" ]; then goodbye
  408.                     else
  409.                       status="loop"
  410.                     fi
  411.                   else
  412.                     option="$option ${host}/${newmask}:$port"
  413.                     status="not a loop"
  414.                   fi
  415.                 fi
  416.               done
  417.             fi
  418.           done
  419.           ;;
  420.         *)
  421.         esac
  422.       fi
  423.     done
  424.     permit_opt=`echo $option`
  425.     status="natquestion"
  426.     ;;
  427.  
  428.   'natquestion')
  429.     dialog --title "Internet Connection Sharing" $DEFAULT_NO --yesno "Do you wish to share your Internet connection with a private internal network?" \
  430.     6 55
  431.  
  432.     status=$?
  433.     if [ "$status" == "255" ]; then goodbye
  434.     elif [ "$status" == "0" ]; then
  435.       dialog $CANCEL_BACK --title "List Internal Interfaces" --inputbox "Enter one or more ethernet interfaces connected to private internal networks in a space delimited list. Example: \"eth1 eth2\"" \
  436.       9 55 2> $TMPFILE
  437.       status=$?
  438.  
  439.       if [ "$status" == "255" ]; then goodbye
  440.       elif [ "$status" == "0" ]; then
  441.         int_iface_opt=`cat $TMPFILE`
  442.  
  443.     if [ -n "$int_iface_opt" ]; then
  444.       dialog --title "Dial-up Information" $DEFAULT_NO --yesno "Does this system access the Internet through a telephone dial-up modem?  This information is required in order to configure Internet connection sharing and will not effect your Internet access in any way." \
  445.       9 55
  446.       
  447.       status=$?
  448.       if [ "$status" == "255" ]; then goodbye
  449.       elif [ "$status" == "0" ]; then
  450.         dyn_iface_opt="ppp0"
  451.       fi
  452.     fi
  453.         status="trustednet"
  454.       else
  455.         status="natquestion"
  456.       fi
  457.     else
  458.       status="trustednet"
  459.     fi
  460.     ;;
  461.  
  462.   'trustednet')
  463.     if [ "X$int_iface_opt" == "X" ]; then
  464.       xtratxt=""
  465.       height="14"
  466.     else
  467.       xtratxt=" (besides existing private internal networks)"
  468.       height="15"
  469.     fi
  470.     status="loop"
  471.     while [ "$status" == "loop" ]; do
  472.       dialog --title "Trusted Networks" --inputbox "If there are any hosts or networks${xtratxt} that should be able to bypass the firewall altogether and connect to any services running on this system, please list them here.  This might include hosts allowed to connect here for administrative purposes.  Format: <host or network address>[/<netmask>]  Example: \"207.198.61.33 128.173.0.0/16\"" \
  473.     $height 55 2> $TMPFILE
  474.  
  475.       status=$?
  476.       if [ "$status" == "255" ]; then goodbye
  477.       elif [ "$status" == "0" ]; then
  478.     for combo in `cat $TMPFILE` ; do
  479.       if [ "X`echo $combo | cut -s -f 1 -d '/'`" == "X" ]; then
  480.         option="$permit_opt $combo"
  481.         permit_opt=`echo $option`
  482.         status="not a loop"
  483.       else
  484.         host=`echo $combo | cut -s -f 1 -d '/'`
  485.         mask=`echo $combo | cut -s -f 2 -d '/'`
  486.         newmask=`make_mask $mask`
  487.         if [ "$newmask" == "-1" ]; then
  488.           dialog --title "Invalid Bitmask" --msgbox "The host/netmask you specified (${host}/${mask}) was invalid.  Re-enter the complete full-access list." \
  489.           7 55
  490.           status=$?
  491.           if [ "$status" == "255" ]; then goodbye
  492.         status="loop"
  493.           fi
  494.         else
  495.           option="$permit_opt ${host}/${newmask}"
  496.           permit_opt=`echo $option`
  497.           status="not a loop"
  498.         fi
  499.       fi
  500.     done
  501.       fi
  502.     done
  503.     status="writefile"
  504.     ;;
  505.  
  506.   'debug')
  507.     echo "PERMIT: $permit_opt"
  508.     echo "INTERNAL_INTERFACES: $int_iface_opt"
  509.     echo "DYNAMIC_INTERFACES: $dyn_iface_opt"
  510.     read junk
  511.     status="writefile"
  512.     ;;
  513.  
  514.   'test')
  515.   dialog --title "System Configuration Testing" --yesno "Your firewall is now ready to be installed.  Would you like to verify your system configuration first?  This is a recommended step if this is the first time you are installing a firewall on this host.  The testing procedure will not modify your current firewall configuration.  Note that this opperation may take some time depending on the speed of your computer and the complexity of your firewall configuration." \
  516.     13 55
  517.  
  518.     status=$?
  519.     if [ "$status" == "255" ]; then goodbye
  520.     elif [ "$status" == "0" ]; then
  521.       clear
  522.       echo "Running './rc.firewall check'.  Output will follow ..."
  523.       echo
  524.       #BK changed sh to bash...
  525.       bash $FW_TMPFILE check
  526.       status=$?
  527.  
  528.       if [ "$status" != "0" ]; then
  529.     echo
  530.     echo "Errors were detected in your system configuration."
  531.     echo "See the output above for specific details."
  532.     echo
  533.     echo "A copy of the Linux Firewall initialization script preconfigured by this"
  534.     echo "program is located in $FW_TMPFILE"
  535.     echo
  536.     rm -f $TMPFILE > /dev/null 2>&1
  537.     exit 1
  538.       fi
  539.  
  540.       echo
  541.       echo -n "Press any key to continue ... "
  542.       read -rsn1
  543.     fi
  544.     status="install"
  545.   ;;
  546.  
  547.   'install')
  548.   dialog --title "Firewall Installation" --yesno "The firewall is now ready to be enabled.  Your system configuration will also be modified so that the firewall will be started each time your computer is booted.  If you choose not to continue, a copy of the Linux Firewall initialization script, preconfigured by this program, can be found here: '$FW_TMPFILE'.  Would you like to continue?" \
  549.     12 55
  550.     
  551.     status=$?
  552.     if [ "$status" == "255" ]; then goodbye
  553.     elif [ "$status" == "0" ]; then
  554.       if [ -f $FW_INSTALL ]; then
  555.         mv $FW_INSTALL ${FW_INSTALL}.old
  556.       fi
  557.  
  558.       mv $FW_TMPFILE $FW_INSTALL
  559.       status=$?
  560.       if [ "$status" != "0" ]; then
  561.     clear
  562.     echo "INSTALLATION FAILED with the following message:"
  563.     echo
  564.     echo "\"Unable to write file to $FW_INSTALL.\""
  565.     echo "A copy of the Linux Firewall initialization script preconfigured by this"
  566.     echo "program is located in $FW_TMPFILE."
  567.     echo
  568.     rm -f $TMPFILE > /dev/null 2>&1
  569.     exit 1
  570.       fi
  571.  
  572.       if [ -f /etc/rc.d/rc.local ]; then
  573.         grep $FW_INSTALL /etc/rc.d/rc.local > /dev/null 2>&1 || cat << EOF >> /etc/rc.d/rc.local
  574.  
  575. if [ -x $FW_INSTALL ]; then
  576.   $FW_INSTALL $INIT
  577. fi
  578. EOF
  579.     clear
  580.     if [ "$INIT" == "fast" ]; then
  581.       echo "$FW_INSTALL save"
  582.       echo
  583.       $FW_INSTALL save
  584.       echo
  585.     fi
  586.     echo "$FW_INSTALL $INIT"
  587.     echo
  588.     $FW_INSTALL $INIT
  589.     echo
  590.     echo "                         *** Installation Complete ***"
  591.     echo
  592.     echo "The firewall is now running on your system.  The firewall initialization"
  593.     echo "script has been installed here: $FW_INSTALL"
  594.     echo "and will run each time you boot your system.  Advanced users can modify their"
  595.     echo "firewall configuration by configuring the above file with any text editor."
  596.     echo "After making changes you will need to run the rc.firewall script again for"
  597.     echo "changes to take effect."
  598.     echo
  599.     echo "For more information, please visit:"
  600.     echo
  601.     echo "   http://projectfiles.com/firewall/"
  602.     echo
  603.     rm -f $TMPFILE > /dev/null 2>&1
  604.     exit
  605.       else
  606.     clear
  607.     echo "INSTALLATION FAILED with the following message:"
  608.     echo
  609.     echo "\"Unable to write information to /etc/rc.d/rc.local.  If your distribution does"
  610.     echo "not have an /etc/rc.d/rc.local (e.i. debian) then bug us to add support for"
  611.     echo "your distribution.\""
  612.     echo
  613.     echo "A copy of the Linux Firewall initialization script preconfigured by this"
  614.     echo "program is located in $FW_TMPFILE."
  615.     echo
  616.     rm -f $TMPFILE > /dev/null 2>&1
  617.     exit 1
  618.       fi
  619.     fi
  620.     status="exit"
  621.   ;;
  622.  
  623.   'writefile')
  624.  
  625.     ### FOR INTERNAL USE.
  626.     ### Place the following AFTER the escaped firewall script ...
  627.      #FIREWALL_END_OF_FILE
  628.      #  
  629.      #  chmod $FW_PERM $FW_TMPFILE
  630.      #  status="test"
  631.      #  ;;
  632.      #
  633.      #  *)
  634.      #    goodbye
  635.      #  esac
  636.      #done
  637.      #
  638.      #goodbye
  639.     ### Add in the following variables in the config section:
  640.     ### permit_opt, int_iface_opt, and dyn_iface_opt
  641.  
  642.     cat << FIREWALL_END_OF_FILE > $FW_TMPFILE
  643. #!/bin/bash
  644. #
  645. # rc.firewall Linux Firewall version 2.0rc9 -- 05/02/03
  646. # http://projectfiles.com/firewall/                                
  647. #
  648. # Copyright (C) 2001-2003 Scott Bartlett <srb@mnsolutions.com>
  649. #
  650. # This program is free software; you can redistribute it and/or
  651. # modify it under the terms of the GNU General Public License as
  652. # published by the Free Software Foundation; either version 2 of
  653. # the License, or (at your option) any later version.          
  654. #
  655. # This program is distributed in the hope that it will be useful,
  656. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  657. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  658. # GNU General Public License for more details:
  659. # http://www.gnu.org/licenses/gpl.html
  660. #
  661. #####################################
  662. # -- Basic Configuration Options -- #
  663. #####################################
  664. #
  665. # NOTE: All lists are delimited by single spaces, eg "eth0 eth1 ppp0".
  666. #
  667. # The PERMIT option below allows remote access to this machine in the three
  668. # ways listed below.  Note that by default hosts in internal networks are
  669. # already allowed to connect to all services on the firewall.
  670. # 1.) Listed PORTS will be open to ANY connecting host.  Protocols 'tcp' and
  671. # 'udp' can optionally be specified.  If no protocol is specified, then
  672. # connections using either protocol will be accepted on the given port(s).
  673. # Format: <port or port-range>[/<protocol>]
  674. # Example: PERMIT="80/tcp 53 2400-2500/tcp"
  675. # 2.) Listed NETWORKS or HOSTS will be allowed to connect to ANY service
  676. # on the firewall itself.  This option should be used to specify machines
  677. # allowed to connect for administrative purposes.
  678. # Format: <host or network address>[/<netmask>]
  679. # Example: PERMIT="207.198.61.33 128.173.0.0/16"
  680. # NOTE (for advanced users):  These networks and hosts will also be allowed to
  681. # bypass DENY_OUTBOUND and ALLOW_INBOUND restrictions for Linux routers.
  682. # 3.) Connections can be allowed from specific networks to specific ports by
  683. # listing entries in the following format:
  684. # Format:<host or network address>[/<netmask>]:<port or port-range>[/<protocol>]
  685. # Example: PERMIT="198.82.0.0/16:80/tcp" -- (Allow web traffic from 198.82.*.*)
  686.  
  687. PERMIT="$permit_opt"
  688.  
  689. # List internal (private) interfaces here to allow this machine to act as a
  690. # router.  All interfaces NOT listed here are considered external (public) 
  691. # and will be automatically protected by the firewall.
  692. # Example: INTERNAL_INTERFACES="eth1 eth2 brg0"
  693.  
  694. INTERNAL_INTERFACES="$int_iface_opt"
  695.  
  696. # List dial-up and other interfaces without a static IP address here.
  697. # Interfaces configured to obtain an IP address automatically (DHCP) do not
  698. # need to be listed here unless for some reason your DHCP client does not
  699. # receive the same address each time it renews the lease.
  700. # Example: DYNAMIC_INTERFACES="ppp0"
  701.  
  702. DYNAMIC_INTERFACES="$dyn_iface_opt"
  703.  
  704. # Most users do not need to change anything below this point.
  705.  
  706. ########################################
  707. # -- Advanced Configuration Options -- #
  708. ########################################
  709.  
  710. # ** DO NOT ** modify anything below unless you know what you are doing!!
  711. # See online documentation at: http://projectfiles.com/firewall/config.html
  712.  
  713. DENY_OUTBOUND=""
  714. ALLOW_INBOUND=""
  715. BLACKLIST=""
  716. STATIC_INSIDE_OUTSIDE=""
  717. PORT_FORWARDS=""
  718. PORT_FWD_ALL="yes"
  719. PORT_FWD_ROUTED_NETWORKS="yes"
  720. ADDITIONAL_ROUTED_NETWORKS=""
  721. TRUST_ROUTED_NETWORKS="yes"
  722. SHARED_INTERNAL="yes"
  723. FIREWALL_IP=""
  724. TRUST_LOCAL_EXTERNAL_NETWORKS="no"
  725. DMZ_INTERFACES=""
  726. NAT_EXTERNAL="yes"
  727. ADDITIONAL_NAT_INTERFACES=""
  728. IGNORE_INTERFACES=""
  729. LOGGING="no"
  730. REQUIRE_EXTERNAL_CONFIG="no"
  731.  
  732. ############################################
  733. # -- Advanced Firewall Behavior Options -- #
  734. ############################################
  735.  
  736. # The default settings provide the suggested firewall configuration.
  737.  
  738. NO_RP_FILTER_INTERFACES=""
  739. INTERNAL_DHCP="yes"
  740. RFC_1122_COMPLIANT="yes"
  741. DROP_NEW_WITHOUT_SYN="no"
  742. DUMP_TCP_ON_INIT="no"
  743. TTL_STEALTH_ROUTER="no"
  744. LOG_LIMIT="1/minute"
  745. LOG_BURST="5"
  746. LOG_LEVEL="notice"
  747.  
  748. ###########################################################
  749. # -- Nothing below this point should need modification -- #
  750. ###########################################################
  751.  
  752. # Set version information.
  753.  
  754. VERSION="2.0rc9"
  755. COMPATIBLE_VERSIONS="2.0rc9"
  756.  
  757. # Welcome!
  758.  
  759. echo "-> Projectfiles.com Linux Firewall version \$VERSION running."
  760.  
  761. # Set PATH explicitly.
  762.  
  763. export PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"
  764.  
  765. # Tell everyone if we are loading data from an external configuration file.
  766.  
  767. if [ "\$1" == "update" ] || [ "\$1" == "load" ] || [ "\$1" == "fast" ] || \\
  768.    [ "\$1" == "save" ] || [ "\$REQUIRE_EXTERNAL_CONFIG" == "yes" ] || \\
  769.    ( [ "\$1" == "check" ] && [ -n "\$2" ] ); then
  770.   if [ -z "\$2" ]; then
  771.     CONFIG="/etc/firewall.conf"
  772.   else
  773.     CONFIG=\`echo \$2 | sed s#^\\./#\$PWD/#\`
  774.   fi
  775.   if [ "\$1" != "save" ]; then
  776.     echo "-> Loading configuration from \$CONFIG."
  777.   fi
  778. fi
  779.  
  780. # Define exit/failure function.
  781.  
  782. exit_failure() {
  783.   echo " [ FAILED ]"
  784.   echo "-> FATAL: \$FAILURE" 1>&2
  785.   if [ "\$1" != "check" ]; then
  786.     echo "-> Firewall configuration ** ABORTED **." 1>&2
  787.   fi
  788.   exit 1
  789. }
  790.  
  791. # Sanity checking section
  792.  
  793. echo -n "-> Performing sanity checks."
  794.  
  795. # Make sure we are running the script with root privileges.
  796.  
  797. #BK commented out...
  798. #if [ "\$EUID" != "0" ]; then
  799. #  FAILURE="You must have root privileges to configure the firewall."
  800. #  exit_failure \$1
  801. #fi
  802.  
  803. # Make sure we have iptables installed.
  804.  
  805. if (( \`iptables -V 2>&1 | grep -c "command not found"\` )); then
  806.   FAILURE="Cannot find 'iptables' command.  Did you forget to install iptables?"
  807.   exit_failure \$1
  808. fi
  809.  
  810. # Add SysV style initialization support. (start and restart are the same as running the script without any arguments)
  811.  
  812. if [ "\$1" == "stop" ] || [ "\$1" == "clear" ]; then
  813.   echo " [ PASSED ]" 
  814.   iptables -t filter -F > /dev/null 2>&1
  815.   iptables -t filter -X > /dev/null 2>&1
  816.   iptables -t nat -F > /dev/null 2>&1
  817.   iptables -t nat -X > /dev/null 2>&1
  818.   iptables -t mangle -F > /dev/null 2>&1
  819.   iptables -t mangle -X > /dev/null 2>&1
  820.   iptables -t filter -P INPUT ACCEPT > /dev/null 2>&1
  821.   iptables -t filter -P OUTPUT ACCEPT > /dev/null 2>&1
  822.   iptables -t filter -P FORWARD ACCEPT > /dev/null 2>&1
  823.   iptables -t nat -P PREROUTING ACCEPT > /dev/null 2>&1
  824.   iptables -t nat -P POSTROUTING ACCEPT > /dev/null 2>&1
  825.   iptables -t nat -P OUTPUT ACCEPT  > /dev/null 2>&1
  826.   iptables -t mangle -P POSTROUTING ACCEPT > /dev/null 2>&1
  827.   iptables -t mangle -P OUTPUT ACCEPT > /dev/null 2>&1
  828.   iptables -t mangle -P PREROUTING ACCEPT > /dev/null 2>&1
  829.   iptables -t mangle -P INPUT ACCEPT > /dev/null 2>&1
  830.   iptables -t mangle -P FORWARD ACCEPT > /dev/null 2>&1
  831.   if !(( \`which modprobe 2>&1 | grep -c "which: no modprobe in"\` )) && [ -a "/proc/modules" ]; then
  832.     for MODULE in ipt_TTL iptable_mangle ipt_mark ipt_MARK ipt_MASQUERADE \\
  833.                   ip_nat_irc ip_nat_ftp ipt_LOG ipt_limit ipt_REJECT \\
  834.           ip_conntrack_irc ip_conntrack_ftp ipt_state iptable_nat \\
  835.           iptable_filter ip_tables; do
  836.       if (( \`lsmod | grep -c "\$MODULE"\` )); then
  837.     rmmod \$MODULE > /dev/null 2>&1
  838.       fi
  839.     done
  840.   fi
  841.   echo "-> Firewall disabled."
  842.   exit
  843. fi
  844.  
  845. # Cleanup tcp session dump rules.  Note that ESTABLISHED TCP session can take up to 5 days to expire.
  846.  
  847. if [ "\$1" == "cleanup" ]; then
  848.   echo " [ PASSED ]" 
  849.   COUNT=\`iptables -nL INPUT | grep -c "tcp-reset"\`
  850.   TAB=\$COUNT
  851.   while [ "\$((COUNT--))" -gt "0" ]; do
  852.     iptables -D INPUT 1
  853.   done
  854.   COUNT=\`iptables -nL FORWARD | grep -c "tcp-reset"\`
  855.   while [ "\$((COUNT--))" -gt "0" ]; do
  856.     iptables -D FORWARD 1
  857.   done
  858.   echo "-> Old TCP session dump rules expunged ( \$TAB )...."
  859.   exit
  860. fi
  861.  
  862. # Check external configuration file.
  863.  
  864. if [ "\$1" == "update" ] || [ "\$1" == "load" ] || [ "\$1" == "fast" ] || \\
  865.  ( [ "\$REQUIRE_EXTERNAL_CONFIG" == "yes" ] && [ "\$1" != "save" ] ) || \\
  866.  ( [ "\$1" == "check" ] && [ -n "\$2" ] ); then
  867.   if [ -r "\$CONFIG" ]; then
  868.     if (( \`head -1 "\$CONFIG" | grep -c "# Linux Firewall configuration -- http://projectfiles.com/firewall/"\` )); then
  869.     CONFIG_VERSION='echo \`head -4 "\$CONFIG" | tail -1 | cut -d\\\\" -f2\`'
  870.       if [ "\$1" == "update" ] || (( \$(echo "\$COMPATIBLE_VERSIONS" | grep -c "\`eval \$CONFIG_VERSION\`" ) )); then
  871.     . \$CONFIG
  872.       else
  873.     if [ "\$CONFIG" == "/etc/firewall.conf" ]; then
  874.       CONFIG=""
  875.     else
  876.       CONFIG=" \$CONFIG"
  877.     fi
  878.     FAILURE="Configuration file outdated.  Please run '\$0 update\$CONFIG'."
  879.     exit_failure \$1
  880.       fi
  881.     else
  882.       FAILURE="The configuration file '\$CONFIG' does not appear to be associated with this program.  Refusing to load data."
  883.       exit_failure \$1
  884.     fi
  885.   else
  886.     FAILURE="Cannot read from file '\$CONFIG'.  Did you forget to save your configuration with './rc.firewall save' or has the file moved?"
  887.     exit_failure \$1
  888.   fi
  889. fi
  890.  
  891. # Make sure we have proc filesystem support.
  892.  
  893. if ! [ -a "/proc/version" ]; then
  894.   FAILURE="proc filesystem support required.  Please mount /proc or add proc filesystem support in your kernel."
  895.   exit_failure \$1
  896. fi
  897.  
  898. # Create DUMP_TCP_ON_INIT function
  899.  
  900. dump_tcp() {
  901.   echo -n "-> Dumping current TCP sessions...."
  902.   if [ "\$1" != "fast" ]; then
  903.    sleep 1    # Allow a few moments for that last message to be delivered before we reset remote connections.
  904.   fi
  905.   COUNT=10
  906.   TAB=0
  907.   NET=\`cat /proc/net/ip_conntrack | grep "^tcp" | grep ESTABLISHED | awk '{ gsub(/\\ /,"\\n"); print }'\`
  908.   for ADDRESS in \`echo "\$NET" | sed -n \$COUNT~20p | cut -d= -f2\`; do
  909.     if !(( \`echo \$INTERNAL_ADDRESSES \$EXTERNAL_ADDRESSES | grep -c "\$ADDRESS"\` )); then
  910.       DEST=\`echo "\$NET" | sed -n \$((COUNT+1))~20p | cut -d= -f2 | head -1\`
  911.       PORTS=\`echo "\$NET" | sed -n \$((COUNT+2))~20p | cut -d= -f2 | head -1\`
  912.       DPORTS=\`echo "\$NET" | sed -n \$((COUNT+3))~20p | cut -d= -f2 | head -1\`
  913.       iptables -I INPUT -s \$ADDRESS -d \$DEST -p tcp --sport \$PORTS --dport \$DPORTS -j REJECT --reject-with tcp-reset
  914.       if [ "\$IS_ROUTER" == "yes" ]; then
  915.     iptables -I FORWARD -s \$ADDRESS -d \$DEST -p tcp --sport \$PORTS --dport \$DPORTS -j REJECT --reject-with tcp-reset
  916.       fi
  917.       TAB=\$((TAB+1))
  918.     fi
  919.     COUNT=\$((COUNT+20))
  920.   done
  921.   echo "( \$TAB dumped )"
  922. }
  923.  
  924. # Handle 'fast' argument.
  925.  
  926. if [ "\$1" == "fast" ]; then
  927.   if (( \`which iptables-restore 2>&1 | grep -c "which: no iptables-restore in"\` )); then
  928.     FAILURE="Required program 'iptables-restore' not found."
  929.     exit_failure \$1
  930.   fi
  931.   echo " [ SKIPPED ]"
  932.   echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
  933.   for INTERFACE in \$NO_RP_FILTER_INTERFACES; do
  934.     echo "0" > /proc/sys/net/ipv4/conf/\$INTERFACE/rp_filter
  935.   done
  936.   cat \$CONFIG | sed -n 40~1p | iptables-restore
  937.   if [ -n "\$DYNAMIC_INTERFACES" ]; then
  938.     echo "1" > /proc/sys/net/ipv4/ip_dynaddr
  939.   else
  940.     echo "0" > /proc/sys/net/ipv4/ip_dynaddr
  941.   fi
  942.   if [ "\$LOGGING" == "yes" ]; then
  943.     echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
  944.   fi
  945.   if [ -n "\$INTERNAL_INTERFACES" ] || [ -n "\$PORT_FORWARDS" ]; then
  946.     echo "1" > /proc/sys/net/ipv4/ip_forward
  947.   else
  948.     echo "0" > /proc/sys/net/ipv4/ip_forward
  949.   fi
  950.   echo "-> Firewall configuration complete.  No sanity checking was performed."
  951.   if [ "\$DUMP_TCP_ON_INIT" == "yes" ]; then
  952.     dump_tcp fast
  953.   fi
  954.   exit
  955. fi
  956.  
  957. # Create a few sanity checking functions.
  958.  
  959. check_network() {    # Checks NET variable.
  960.   FAILURE=""
  961.   HOST=\`echo "\$NET/" | cut -d/ -f1\`
  962.   MASK=\`echo "\$NET/" | cut -d/ -f2\`    # Optional: Netfilter assumes /32 if not defined.
  963.   if (( \`echo "\$NET/" | cut -d/ -f3 | grep -c "."\` )); then
  964.     FAILURE="Syntax error"
  965.     return 1
  966.   fi
  967.   if [ -z "\$HOST" ]; then
  968.     FAILURE="Syntax error"
  969.     return 1
  970.   fi
  971.   for OCTET in 1 2 3 4; do
  972.     OCTET=\`echo "\$HOST." | cut -d. -f\$OCTET --output-delimiter=" "\`
  973.     if [ -z "\$OCTET" ] || (( \`echo "\$OCTET" | grep -c "[^[:digit:]]"\` )) || [ "\$OCTET" -lt "0" ] || [ "\$OCTET" -gt "255" ]; then
  974.       FAILURE="Network addresses must be in dotted decimal format"
  975.       return 1
  976.     fi
  977.   done
  978.   if (( \`echo "\$HOST." | cut -d. -f5 | grep -c "."\` )); then
  979.     FAILURE="Network address must be in dotted decimal format"
  980.     return 1
  981.   fi
  982.   if [ -n "\$MASK" ]; then
  983.     if (( \`echo "\$MASK" | grep -c "[^[:digit:]]"\` )) || [ "\$MASK" -lt "0" ] || [ "\$MASK" -gt "32" ]; then
  984.       FAILURE="Network mask must be between '/0' (0.0.0.0) and '/32' (255.255.255.255) inclusive"
  985.       return 1
  986.     fi
  987.   else
  988.     if (( \`echo "\$NET" | grep -c "/"\` )); then
  989.       FAILURE="Mask expected but not found"
  990.       return 1
  991.     fi
  992.   fi
  993. }
  994.  
  995. check_ports() {        # Checks PORTS variable.
  996.   FAILURE=""
  997.   RANGE=\`echo "\$PORTS/" | cut -d/ -f1\`
  998.   PROTOCOL=\`echo "\$PORTS/" | cut -d/ -f2\`
  999.   if (( \`echo "\$PORTS/" | cut -d/ -f3 | grep -c "."\` )); then
  1000.     FAILURE="Syntax error"
  1001.     return 1
  1002.   fi
  1003.   if [ -z "\$RANGE" ]; then
  1004.     FAILURE="Syntax error"
  1005.     return 1
  1006.   fi
  1007.   if (( \`echo "\$RANGE" | grep -c "[^[:digit:]]"\` )) || [ "\$RANGE" -lt "1" ] || [ "\$RANGE" -gt "65535" ]; then
  1008.     for PORT in \`echo "\$RANGE-" | cut -d- -f1,2 --output-delimiter=" "\`; do
  1009.       if (( \`echo "\$PORT" | grep -c "[^[:digit:]]"\` )) || [ "\$PORT" -lt "1" ] || [ "\$PORT" -gt "65535" ]; then
  1010.     FAILURE="Valid port numbers must be between 1 and 65535"
  1011.     return 1
  1012.       fi
  1013.     done
  1014.     if (( \`echo "\$RANGE-" | cut -d- -f3 | grep -c "."\` )); then
  1015.       FAILURE="Syntax error"
  1016.       return 1
  1017.     fi
  1018.   fi
  1019.   if [ -n "\$PROTOCOL" ]; then
  1020.     if ! ( [ "\$PROTOCOL" == "tcp" ] || [ "\$PROTOCOL" == "udp" ] ); then
  1021.       FAILURE="Invalid protocol"
  1022.       return 1
  1023.     fi
  1024.   else
  1025.     if (( \`echo "\$PORTS" | grep -c "/"\` )); then
  1026.       FAILURE="Protocol expected but not found"
  1027.       return 1
  1028.     fi
  1029.   fi
  1030. }
  1031.  
  1032. xbits() {       # Set XBITS to the number of network bits that two addresses NET and NET1 are the same.
  1033.   XBITS=0
  1034.   for NUM in 1 2 3 4; do
  1035.     OCTET=\`echo "\$NET./" | cut -d/ -f1 | cut -d. -f\$NUM\`
  1036.     OCTET1=\`echo "\$NET1./" | cut -d/ -f1 | cut -d. -f\$NUM\`
  1037.     if [ "\$OCTET" == "\$OCTET1" ]; then
  1038.       XBITS=\$((XBITS + 8))
  1039.       continue
  1040.     fi
  1041.     for SUBTRACT in 128 64 32 16 8 4 2 1; do
  1042.       if [ "\$((OCTET - SUBTRACT))" -ge "0" ] && [ "\$((OCTET1 - SUBTRACT))" -ge "0" ]; then
  1043.         XBITS=\$((XBITS + 1))
  1044.         OCTET=\$((OCTET - SUBTRACT))
  1045.         OCTET1=\$((OCTET1 - SUBTRACT))
  1046.       elif [ "\$((OCTET - SUBTRACT))" -lt "0" ] && [ "\$((OCTET1 - SUBTRACT))" -lt "0" ]; then
  1047.         XBITS=\$((XBITS + 1))
  1048.       else
  1049.         return
  1050.       fi
  1051.     done
  1052.   done
  1053. }
  1054.  
  1055. # Save selected variable settings if we are going to back up our configuration.
  1056.  
  1057. if [ "\$1" == "save" ] || [ "\$1" == "update" ]; then
  1058.   if (( \`which iptables-save 2>&1 | grep -c "which: no iptables-save in"\` )); then
  1059.     FAILURE="iptables-save not found; required for '\$1' argument."
  1060.     exit_failure \$1
  1061.   fi
  1062.   if [ "\$1" == "update" ]; then
  1063.     PERMIT=\`echo \$PERMIT \$TRUSTED_NETWORKS \$OPEN_PORTS\`
  1064.     OPEN_PORTS=""
  1065.   fi
  1066.   ORIG_PERMIT="\$PERMIT"
  1067.   ORIG_INTERNAL_INTERFACES="\$INTERNAL_INTERFACES"
  1068.   ORIG_PORT_FORWARDS="\$PORT_FORWARDS"
  1069.   ORIG_ALLOW_INBOUND="\$ALLOW_INBOUND"
  1070.   ORIG_DENY_OUTBOUND="\$DENY_OUTBOUND"
  1071.   ORIG_DYNAMIC_INTERFACES="\$DYNAMIC_INTERFACES"
  1072.   ORIG_STATIC_INSIDE_OUTSIDE="\$STATIC_INSIDE_OUTSIDE"
  1073. fi
  1074.  
  1075. # Add DMZ interfaces to list of internal interfaces.
  1076.  
  1077. if [ -n "\$DMZ_INTERFACES" ]; then
  1078.   INTERNAL_INTERFACES="\$INTERNAL_INTERFACES \$DMZ_INTERFACES"
  1079. fi
  1080.   
  1081. # Remove duplicate internal interfaces.
  1082.  
  1083. if [ -n "\$INTERNAL_INTERFACES" ]; then
  1084.   for INTERFACE in \$INTERNAL_INTERFACES; do
  1085.     if !(( \`echo "\$MOD_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1086.       MOD_INTERFACES="\$MOD_INTERFACES \$INTERFACE"
  1087.     fi
  1088.   done
  1089.   INTERNAL_INTERFACES=\`echo \$MOD_INTERFACES\`
  1090. fi
  1091.  
  1092. # Determine if we are a router.
  1093.  
  1094. if [ -n "\$INTERNAL_INTERFACES" ] || [ -n "\$PORT_FORWARDS" ]; then
  1095.   IS_ROUTER="yes"
  1096. fi
  1097.  
  1098. # Sanity check PERMIT and BLACKLIST.
  1099.  
  1100. for PARAM in PERMIT BLACKLIST; do
  1101.   if [ "\$PARAM" == "PERMIT" ]; then
  1102.     ITEM="\$PERMIT"
  1103.   else
  1104.     ITEM="\$BLACKLIST"
  1105.   fi
  1106.   for NETWORK in \$ITEM; do
  1107.     NET=\`echo "\$NETWORK:" | cut -d: -f1\`
  1108.     PORTS=\`echo "\$NETWORK:" | cut -d: -f2\`
  1109.     if (( \`echo "\$NETWORK:" | cut -d: -f3 | grep -c "."\` )); then
  1110.       FAILURE="Syntax error in \$PARAM."
  1111.       exit_failure \$1
  1112.     fi
  1113.     if ! check_network; then
  1114.       PORTS="\$NET"
  1115.       FAIL="\$FAILURE in \$PARAM."
  1116.       if ! check_ports; then
  1117.     FAILURE="\$FAIL"
  1118.     exit_failure \$1
  1119.       fi
  1120.     fi
  1121.     if [ -n "\$PORTS" ]; then
  1122.       if ! check_ports; then
  1123.     FAILURE="\$FAILURE in \$PARAM."
  1124.     exit_failure \$1
  1125.       fi
  1126.     fi
  1127.   done
  1128. done
  1129.  
  1130. echo -n "."
  1131.  
  1132. # Remove entries with ports and put them in their own variable.
  1133.  
  1134. if [ -n "\$PERMIT" ]; then
  1135.   for NETWORK in \$PERMIT; do
  1136.     NET=\`echo "\$NETWORK:" | cut -d: -f1\`
  1137.     PORTS=\`echo "\$NETWORK:" | cut -d: -f2\`
  1138.     if [ -z "\$PORTS" ]; then
  1139.       if ! check_network; then
  1140.         OPEN_PORTS="\$OPEN_PORTS \$NET"
  1141.       else
  1142.         TEMP_PERMIT="\$TEMP_PERMIT \$NET"
  1143.       fi
  1144.     else
  1145.       PROTOCOL=\`echo "\$PORTS/" | cut -d/ -f2\`
  1146.       if [ "\$PROTOCOL" == "tcp" ] || [ "\$PROTOCOL" == "udp" ]; then
  1147.         TRUSTED_PORTS="\$TRUSTED_PORTS \$NET:\$PORTS/\$PROTOCOL"
  1148.       else
  1149.         TRUSTED_PORTS="\$TRUSTED_PORTS \$NET:\$PORTS/tcp"
  1150.         TRUSTED_PORTS="\$TRUSTED_PORTS \$NET:\$PORTS/udp"
  1151.       fi
  1152.     fi
  1153.   done
  1154.   PERMIT=\`echo \$TEMP_PERMIT\`
  1155.   TRUSTED_PORTS=\`echo \$TRUSTED_PORTS\`
  1156.   OPEN_PORTS=\`echo \$OPEN_PORTS\`
  1157. fi
  1158.  
  1159. # Sanity check additional routed networks.
  1160.  
  1161. if [ -n "\$INTERNAL_INTERFACES" ]; then
  1162.   for NET in \$ADDITIONAL_ROUTED_NETWORKS; do
  1163.     if ! check_network; then
  1164.       FAILURE="\$FAILURE in ADDITIONAL_ROUTED_NETWORKS."
  1165.       exit_failure \$1
  1166.     fi
  1167.   done
  1168. fi
  1169.  
  1170. # Sanity check port forwarding definitions.  Protocol and destination ports are optional.
  1171.  
  1172. if [ -n "\$PORT_FORWARDS" ]; then
  1173.   for FORWARD in \$PORT_FORWARDS; do
  1174.     if (( \`echo "\$FORWARD:" | cut -d: -f5 | grep -c "."\` )); then
  1175.       FAILURE="Syntax error in PORT_FORWARDS."
  1176.       exit_failure \$1
  1177.     fi
  1178.     PROTOCOL=\`echo "\$FORWARD:" | cut -d: -f1\`
  1179.     if [ "\$PROTOCOL" != "tcp" ] && [ "\$PROTOCOL" != "udp" ]; then
  1180.       COUNT="1"
  1181.       MOD_FORWARDS="\$MOD_FORWARDS tcp:\$FORWARD udp:\$FORWARD"
  1182.       PROT=""
  1183.     else
  1184.       COUNT="0"
  1185.       MOD_FORWARDS="\$MOD_FORWARDS \$FORWARD"
  1186.       PROT="/\$PROTOCOL"
  1187.     fi
  1188.     PORTS=\`echo "\$FORWARD:" | cut -d: -f\$((2-COUNT))\`
  1189.     FAILURE="Invalid syntax "
  1190.     if ! check_ports || [ -n "\$PROTOCOL" ]; then
  1191.       FAILURE="\$FAILURE in PORT_FORWARDS."
  1192.       exit_failure \$1
  1193.     fi
  1194.     if [ "\$PORT_FWD_ALL" == "yes" ]; then
  1195.       for TAB in NULL; do
  1196.     for PORT in \$OPEN_PORTS; do
  1197.       if [ "\$PORT" == "\${PORTS}\$PROT" ]; then
  1198.         break 2
  1199.       fi
  1200.     done
  1201.     OPEN_PORTS="\$OPEN_PORTS \${PORTS}\$PROT"
  1202.       done
  1203.     fi
  1204.     NET=\`echo "\$FORWARD:" | cut -d: -f\$((3-COUNT))\`
  1205.     FAILURE="Destination must be a single host"
  1206.     if ! check_network || [ -n "\$MASK" ]; then
  1207.       FAILURE="\$FAILURE in PORT_FORWARDS."
  1208.       exit_failure \$1
  1209.     fi
  1210.     PORTS=\`echo "\$FORWARD:" | cut -d: -f\$((4-COUNT))\`
  1211.     if [ -n "\$PORTS" ]; then
  1212.       FAILURE="Invalid syntax"
  1213.       if ! check_ports || [ -n "\$PROTOCOL" ]; then
  1214.     FAILURE="\$FAILURE in PORT_FORWARDS."
  1215.     exit_failure \$1
  1216.       fi
  1217.     fi
  1218.   done
  1219.   PORT_FORWARDS=\`echo \$MOD_FORWARDS\`
  1220.   OPEN_PORTS=\`echo \$OPEN_PORTS\`
  1221. fi
  1222.  
  1223. # Sanity check open ports.  Expand undefined protocols into tcp and udp.
  1224.  
  1225. if [ -n "\$OPEN_PORTS" ]; then
  1226.   for PORTS in \$OPEN_PORTS; do
  1227.     if ! check_ports; then
  1228.       FAILURE="\$FAILURE in OPEN_PORTS."
  1229.       exit_failure \$1
  1230.     fi
  1231.     if [ "\$PROTOCOL" == "tcp" ] || [ "\$PROTOCOL" == "udp" ]; then
  1232.       MOD_PORTS="\$MOD_PORTS \$PORTS"
  1233.     else
  1234.       MOD_PORTS="\$MOD_PORTS \$PORTS/tcp \$PORTS/udp"
  1235.     fi
  1236.   done
  1237.   OPEN_PORTS=\`echo \$MOD_PORTS\`
  1238. fi
  1239.  
  1240. # Sanity check static inside,outside translations.
  1241.  
  1242. if [ -n "\$STATIC_INSIDE_OUTSIDE" ]; then
  1243.   MOD_STATIC=""
  1244.   for FORWARD in \$STATIC_INSIDE_OUTSIDE; do
  1245.     if (( \`echo "\$FORWARD:" | cut -d: -f3 | grep -c "."\` )); then
  1246.       FAILURE="Syntax error in STATIC_INSIDE_OUTSIDE."
  1247.       exit_failure \$1
  1248.     fi
  1249.     NET=\`echo "\$FORWARD:" | cut -d: -f1\`
  1250.     if ! check_network; then
  1251.       FAILURE="\$FAILURE in STATIC_INSIDE_OUTSIDE."
  1252.       exit_failure \$1
  1253.     fi
  1254.     NET1=\`echo \$NET | cut -d\\/ -f1\`
  1255.     STROKE="\$MASK"
  1256.     NET=\`echo "\$FORWARD:" | cut -d: -f2\`
  1257.     if ! check_network; then
  1258.       FAILURE="\$FAILURE in STATIC_INSIDE_OUTSIDE."
  1259.       exit_failure \$1
  1260.     fi
  1261.     if [ -n "\$MASK" ]; then
  1262.       if [ "\$STROKE" != "\$MASK" ]; then
  1263.     FAILURE="If outside address in STATIC_INSIDE_OUTSIDE has a netmask, it must be the same as the inside address."
  1264.     exit_failure \$1
  1265.       fi
  1266.       if [ "\$MASK" -lt "24" ]; then
  1267.     FAILURE="Networks larger than class C (254 hosts) are not supported on the OUTSIDE address of STATIC_INSIDE_OUTSIDE."
  1268.     exit_failure \$1
  1269.       fi
  1270.       TAB="1"
  1271.       NET=\`echo \$NET | cut -d\\/ -f1\`
  1272.       COUNT=\`echo \$NET | cut -d. -f4\`
  1273.       if [ "\$COUNT" -ne "\`echo \$NET1 | cut -d. -f4\`" ]; then
  1274.     FAILURE="When using a subnet mask on the OUTSIDE address in STATIC_INSIDE_OUTSIDE, last octet of both inside and outside addresses must be the same."
  1275.     exit_failure \$1
  1276.       fi
  1277.       NET1=\`echo \$NET1 | cut -d. -f1,2,3\`
  1278.       NET=\`echo \$NET | cut -d. -f1,2,3\`
  1279.       while [ "\$MASK" -lt "32" ]; do
  1280.     TAB=\$((TAB * 2))
  1281.     MASK=\$((MASK+1))
  1282.       done
  1283.       STROKE="\$TAB"
  1284.       while [ "\$TAB" -gt "0" ]; do
  1285.     TAB=\$((TAB-1))
  1286.     OCTET=\$((COUNT-(COUNT%STROKE)+TAB))
  1287.     if [ "\$OCTET" != "0" ] && [ "\$OCTET" != "255" ]; then
  1288.       MOD_STATIC="\$MOD_STATIC \$NET1.\$OCTET:\$NET.\$OCTET"
  1289.     fi
  1290.       done
  1291.     else
  1292.       MOD_STATIC="\$MOD_STATIC \$FORWARD"
  1293.     fi
  1294.   done
  1295.   STATIC_INSIDE_OUTSIDE=\`echo \$MOD_STATIC\`
  1296. fi
  1297.  
  1298. # Sanity check FIREWALL_IP.
  1299.  
  1300. for ADDRESS in \$FIREWALL_IP; do
  1301.   if (( \`echo "\$ADDRESS:" | cut -d: -f3 | grep -c "."\` )); then
  1302.     FAILURE="Syntax error in FIREWALL_IP."
  1303.     exit_failure \$1
  1304.   fi
  1305.   NET=\`echo "\$ADDRESS:" | cut -d: -f1\`
  1306.   if ! check_network; then
  1307.     FAILURE="\$FAILURE in FIREWALL_IP."
  1308.     exit_failure \$1
  1309.   fi
  1310.   if [ -n "\$MASK" ]; then
  1311.     FAILURE="FIREWALL_IP may not contain network masks."
  1312.     exit_failure \$1
  1313.   fi
  1314.   NET=\`echo "\$ADDRESS:" | cut -d: -f2\`
  1315.   if ! check_network; then
  1316.     FAILURE="\$FAILURE in FIREWALL_IP."
  1317.     exit_failure \$1
  1318.   fi
  1319.   if [ -n "\$MASK" ]; then
  1320.     FAILURE="FIREWALL_IP may not contain network masks."
  1321.     exit_failure \$1
  1322.   fi
  1323. done
  1324.  
  1325. # Make sure dynamic, nat, and rp_filter interface definitions do not use IP aliases.
  1326.  
  1327. if (( \`echo "\$INTERNAL_INTERFACES \$DYNAMIC_INTERFACES \$NO_RP_FILTER_INTERFACES \$ADDITIONAL_NAT_INTERFACES" | grep -c ":"\` )); then
  1328.   FAILURE="Definitions cannot contain IP aliases."
  1329.   exit_failure \$1
  1330. fi
  1331.   
  1332. # Obtain list of external interfaces.
  1333.  
  1334. EXTERNAL_INTERFACES=\`ifconfig | grep "^[[:alpha:]]" | cut -d\\  -f1 | sed s/^lo.*//\`
  1335. PARAM=\`echo \$EXTERNAL_INTERFACES\`
  1336. for INTERFACE in \$INTERNAL_INTERFACES; do
  1337.   EXTERNAL_INTERFACES=\`echo "\$EXTERNAL_INTERFACES" | sed s/^\$INTERFACE//\`
  1338. done
  1339. for INTERFACE in \$PARAM; do
  1340.   if !(( \`echo "\$EXTERNAL_INTERFACES \$INTERNAL_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1341.     INTERNAL_INTERFACES="\$INTERNAL_INTERFACES \$INTERFACE"
  1342.   fi
  1343. done
  1344. EXTERNAL_INTERFACES=\`echo \$EXTERNAL_INTERFACES | sed 's/[^0-9]\\:[0-9]\\+//g'\`    # Cleanup.
  1345. for INTERFACE in \$IGNORE_INTERFACES; do
  1346.   if !(( \`echo "\$EXTERNAL_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1347.     FAILURE="Interface specified to IGNORE was not found.  Check the configuration."
  1348.     exit_failure \$1
  1349.   else
  1350.     EXTERNAL_INTERFACES=\`echo \$EXTERNAL_INTERFACES | sed s#\$INTERFACE##g\`
  1351.   fi
  1352. done
  1353. EXTERNAL_INTERFACES=\`echo \$EXTERNAL_INTERFACES\`    # Remove whitespace.
  1354.  
  1355. echo -n "."
  1356.  
  1357. # Divide internal and external interfaces into static and dynamic groups.
  1358.  
  1359. for INTERFACE in \$INTERNAL_INTERFACES; do
  1360.   if (( \`echo "\$DYNAMIC_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1361.     if [ -n "\$DMZ_INTERFACES" ]; then
  1362.       FAILURE="Cannot have dynamic internal interfaces with a DMZ."
  1363.       exit_failure \$1
  1364.     fi
  1365.     DYNAMIC_INTERNAL_INTERFACES="\$DYNAMIC_INTERNAL_INTERFACES \$INTERFACE"
  1366.   else
  1367.     STATIC_INTERNAL_INTERFACES="\$STATIC_INTERNAL_INTERFACES \$INTERFACE"
  1368.   fi
  1369. done
  1370. for INTERFACE in \$EXTERNAL_INTERFACES; do
  1371.   if (( \`echo "\$DYNAMIC_INTERFACES" | grep -c "\$(echo \$INTERFACE | cut -d: -f1)"\` )); then
  1372.     if !(( \`echo "\$INTERFACE" | grep -c ":"\` )); then
  1373.       DYNAMIC_EXTERNAL_INTERFACES="\$DYNAMIC_EXTERNAL_INTERFACES \$INTERFACE"
  1374.     fi
  1375.   else
  1376.     STATIC_EXTERNAL_INTERFACES="\$STATIC_EXTERNAL_INTERFACES \$INTERFACE"
  1377.   fi
  1378. done
  1379. for INTERFACE in \$DYNAMIC_INTERFACES; do
  1380.   if !(( \`echo "\$INTERNAL_INTERFACES \$EXTERNAL_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1381.     DYNAMIC_EXTERNAL_INTERFACES="\$DYNAMIC_EXTERNAL_INTERFACES \$INTERFACE"
  1382.   fi
  1383. done
  1384. DYNAMIC_INTERNAL_INTERFACES=\`echo \$DYNAMIC_INTERNAL_INTERFACES\`
  1385. DYNAMIC_EXTERNAL_INTERFACES=\`echo \$DYNAMIC_EXTERNAL_INTERFACES\`
  1386. STATIC_INTERNAL_INTERFACES=\`echo \$STATIC_INTERNAL_INTERFACES\`
  1387. STATIC_EXTERNAL_INTERFACES=\`echo \$STATIC_EXTERNAL_INTERFACES\`
  1388.  
  1389. # If we are configured to be a router, then make sure we have somewhere to route traffic.
  1390.  
  1391. if [ -n "\$INTERNAL_INTERFACES" ] && ( [ -z "\$STATIC_EXTERNAL_INTERFACES" ] && [ -z "\$DYNAMIC_EXTERNAL_INTERFACES" ] ); then
  1392.   if (( \`echo "\$INTERNAL_INTERFACES" | wc -w | grep -c "1"\` )); then
  1393.     FAILURE="Routing enabled, with no place to route traffic!  Did you forget to ifconfig an interface, or list DYNAMIC_INTERFACES?"
  1394.     exit_failure \$1
  1395.   fi
  1396. fi
  1397.  
  1398. # Obtain list of interfaces to NAT outbound connections
  1399.  
  1400. if [ "\$IS_ROUTER" == "yes" ]; then
  1401.   if [ "\$NAT_EXTERNAL" == "yes" ]; then
  1402.     for INTERFACE in \$STATIC_EXTERNAL_INTERFACES; do
  1403.       if !(( \`echo "\$INTERFACE" | grep -c ":"\` )); then
  1404.     STATIC_NAT_INTERFACES="\$STATIC_NAT_INTERFACES \$INTERFACE"
  1405.       fi
  1406.     done
  1407.     for INTERFACE in \$DYNAMIC_EXTERNAL_INTERFACES; do
  1408.       if !(( \`echo "\$INTERFACE" | grep -c ":"\` )); then
  1409.     DYNAMIC_NAT_INTERFACES="\$DYNAMIC_NAT_INTERFACES \$INTERFACE"
  1410.       fi
  1411.     done
  1412.   fi
  1413.   for INTERFACE in \$ADDITIONAL_NAT_INTERFACES; do
  1414.     if (( \`echo "\$DYNAMIC_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1415.       DYNAMIC_NAT_INTERFACES="\$DYNAMIC_NAT_INTERFACES \$INTERFACE"
  1416.     else
  1417.       STATIC_NAT_INTERFACES="\$STATIC_NAT_INTERFACES \$INTERFACE"
  1418.     fi
  1419.   done
  1420. fi
  1421.  
  1422. # If we are a router, check that all static internal interfaces are up.
  1423.  
  1424. for INTERFACE in \$STATIC_INTERNAL_INTERFACES; do
  1425.   if !(( \`ifconfig | grep -c "^\$INTERFACE\\ "\` )); then
  1426.     FAILURE="A static internal interface is down.  Did you forgot to configure interfaces before running the firewall?"
  1427.     exit_failure \$1
  1428.   fi
  1429. done
  1430.  
  1431. # Obtain list of NAT addresses if we are a router doing nat.
  1432.  
  1433. if [ -n "\$STATIC_NAT_INTERFACES" ]; then
  1434.   for INTERFACE in \$STATIC_NAT_INTERFACES; do
  1435.     ADDRESS=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "inet" | cut -d: -f2 | cut -d\\  -f1 | head -1\`
  1436.     if [ -z "\$ADDRESS" ]; then
  1437.       echo " [ WAIT ]"
  1438.       echo -n "-> \$INTERFACE has no IP address.  Waiting for DHCP"
  1439.       for COUNT in 1 2 3 4 5 6 7 8 9 10; do
  1440.     sleep 1
  1441.     echo -n "."
  1442.     ADDRESS=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "inet" | cut -d: -f2 | cut -d\\  -f1 | head -1\`
  1443.     if [ -n "\$ADDRESS" ]; then
  1444.       echo " [ FOUND ]"
  1445.       break
  1446.     else
  1447.       if [ "\$COUNT" == "10" ]; then
  1448.         echo " [ MISSING ]"
  1449.         echo "-> WARNING: IP address for \$INTERFACE not found.  Coverting to dynamic interface."
  1450.         DYNAMIC_EXTERNAL_INTERFACES="\$DYNAMIC_EXTERNAL_INTERFACES \$INTERFACE"
  1451.         DYNAMIC_INTERFACES="\$DYNAMIC_INTERFACES \$INTERFACE"
  1452.         if [ "\$NAT_EXTERNAL" == "yes" ]; then
  1453.           DYNAMIC_NAT_INTERFACES="\$DYNAMIC_NAT_INTERFACES \$INTERFACE"
  1454.         fi
  1455.         for INT in \$STATIC_EXTERNAL_INTERFACES; do
  1456.           if [ "\$INTERFACE" != "\$INT" ]; then
  1457.         MOD_STATIC_EXTERNAL_INTERFACES="\$MOD_STATIC_EXTERNAL_INTERFACES \$INTERFACE"
  1458.           fi
  1459.         done
  1460.         STATIC_EXTERNAL_INTERFACES=\`echo \$MOD_STATIC_EXTERNAL_INTERFACES\`
  1461.       fi
  1462.     fi
  1463.       done
  1464.       echo -n "-> Continuing sanity checks.."
  1465.     else
  1466.       MOD_STATIC_NAT_INTERFACES="\$MOD_STATIC_NAT_INTERFACES \$INTERFACE"
  1467.       if [ -n "\$FIREWALL_IP" ]; then
  1468.     for FORWARD in \$FIREWALL_IP; do
  1469.       if [ \`echo "\$FORWARD" | cut -d: -f1\` == "\$ADDRESS" ]; then
  1470.         ADDRESS=\`echo "\$FORWARD" | cut -d: -f2\`
  1471.       fi
  1472.     done
  1473.       fi
  1474.       NAT_ADDRESSES="\$NAT_ADDRESSES \$ADDRESS"
  1475.     fi
  1476.   done
  1477.   STATIC_NAT_INTERFACES=\`echo \$MOD_STATIC_NAT_INTERFACES\`
  1478.   NAT_ADDRESSES=\`echo \$NAT_ADDRESSES\`
  1479. fi
  1480.  
  1481. echo -n "."
  1482.  
  1483. # Determine if this is a modular kernel, if so modprobe the required modules.
  1484.  
  1485. if !(( \`which modprobe 2>&1 | grep -c "which: no modprobe in"\` )) && [ -a "/proc/modules" ]; then
  1486.   if (( \`lsmod | grep -c "ipchains"\` )); then
  1487.     rmmod ipchains > /dev/null 2>&1
  1488.   fi
  1489.   REQUIRED_MODULES="ip_tables ip_conntrack ipt_state iptable_filter ip_conntrack_irc ip_conntrack_ftp"
  1490.   if [ "\$RFC_1122_COMPLIANT" == "yes" ]; then
  1491.     REQUIRED_MODULES="\$REQUIRED_MODULES ipt_REJECT"
  1492.   fi
  1493.   if [ "\$LOGGING" == "yes" ]; then
  1494.     REQUIRED_MODULES="\$REQUIRED_MODULES ipt_LOG ipt_limit"
  1495.   fi
  1496.   if [ "\$IS_ROUTER" == "yes" ]; then
  1497.     if [ -n "\$STATIC_NAT_INTERFACES" ] || [ -n "\$DYNAMIC_NAT_INTERFACES" ] || \\
  1498.        [ -n "\$PORT_FORWARDS" ] || [ -n "\$STATIC_INSIDE_OUTSIDE" ]; then
  1499.       REQUIRED_MODULES="\$REQUIRED_MODULES iptable_nat ip_nat_irc ip_nat_ftp"
  1500.       if [ -n "\$DYNAMIC_NAT_INTERFACES" ] || \\
  1501.      ( [ -n "\$DYNAMIC_INTERFACES" ] && ( [ -n "\$PORT_FORWARDS" ] || [ -n "\$STATIC_INSIDE_OUTSIDE" ] ) ); then
  1502.     REQUIRED_MODULES="\$REQUIRED_MODULES ipt_MASQUERADE"
  1503.       fi
  1504.     fi
  1505.     if [ -n "\$PORT_FORWARDS" ] || [ "\$TTL_STEALTH_ROUTER" == "yes" ]; then
  1506.       REQUIRED_MODULES="\$REQUIRED_MODULES iptable_mangle"
  1507.     fi
  1508.     if [ -n "\$PORT_FORWARDS" ]; then
  1509.       REQUIRED_MODULES="\$REQUIRED_MODULES ipt_mark ipt_MARK"
  1510.     fi
  1511.     if [ "\$TTL_STEALTH_ROUTER" == "yes" ]; then
  1512.       REQUIRED_MODULES="\$REQUIRED_MODULES ipt_TTL"
  1513.     fi
  1514.   fi
  1515.   for MODULE in \$REQUIRED_MODULES; do
  1516.     if (( \`modprobe -l | grep -c "\$MODULE"\` )); then
  1517.       modprobe \$MODULE > /dev/null 2>&1
  1518.     fi
  1519.   done
  1520. fi
  1521.  
  1522. # Obtain list of internal networks with subnet masks corresponding to internal interfaces.
  1523.  
  1524. if [ -n "\$STATIC_INTERNAL_INTERFACES" ]; then
  1525.   for INTERFACE in \$STATIC_INTERNAL_INTERFACES; do
  1526.     STROKE="0"
  1527.     MASK=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "Mask" | cut -d: -f4 | head -1\`
  1528.     for OCTET in 1 2 3 4; do
  1529.       BINARY=\`echo "\$MASK" | cut -d. -f\$OCTET\`
  1530.       for SUBTRACT in 128 64 32 16 8 4 2 1; do
  1531.     if [ "\$((BINARY - SUBTRACT))" -ge "0" ]; then
  1532.       BINARY=\$((BINARY - SUBTRACT))
  1533.       STROKE=\$((STROKE + 1))
  1534.     fi
  1535.      done
  1536.     done
  1537.     ADDRESS=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "inet" | cut -d: -f2 | cut -d\\  -f1 | head -1\`
  1538.     INTERNAL_ADDRESSES="\$INTERNAL_ADDRESSES \$ADDRESS"
  1539.     INTERNAL_NETWORKS="\$INTERNAL_NETWORKS \$ADDRESS/\$STROKE"
  1540.     if [ -z "\$DMZ_INTERFACES" ] || !(( \`echo "\$DMZ_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1541.       NAT_NETWORKS="\$NAT_NETWORKS \$ADDRESS/\$STROKE"
  1542.     fi
  1543.   done
  1544.   INTERNAL_ADDRESSES=\`echo \$INTERNAL_ADDRESSES\`
  1545.   INTERNAL_NETWORKS=\`echo \$INTERNAL_NETWORKS\`
  1546.   NAT_NETWORKS=\`echo \$NAT_NETWORKS\`
  1547. fi
  1548.  
  1549. # Obtain a list of external addresses.
  1550.  
  1551. if [ -n "\$STATIC_EXTERNAL_INTERFACES" ]; then
  1552.   for INTERFACE in \$STATIC_EXTERNAL_INTERFACES; do
  1553.     STROKE="0"
  1554.     MASK=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "Mask" | cut -d: -f4 | head -1\`
  1555.     for OCTET in 1 2 3 4; do
  1556.       BINARY=\`echo "\$MASK" | cut -d. -f\$OCTET\`
  1557.       for SUBTRACT in 128 64 32 16 8 4 2 1; do
  1558.     if [ "\$((BINARY - SUBTRACT))" -ge "0" ]; then
  1559.       BINARY=\$((BINARY - SUBTRACT))
  1560.       STROKE=\$((STROKE + 1))
  1561.     fi
  1562.      done
  1563.     done
  1564.     ADDRESS=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "inet" | cut -d: -f2 | cut -d\\  -f1 | head -1\`
  1565.     EXTERNAL_ADDRESSES="\$EXTERNAL_ADDRESSES \$ADDRESS"
  1566.     EXTERNAL_NETWORKS="\$EXTERNAL_NETWORKS \$ADDRESS/\$STROKE"
  1567.   done
  1568.   EXTERNAL_ADDRESSES=\`echo \$EXTERNAL_ADDRESSES\`
  1569.   EXTERNAL_NETWORKS=\`echo \$EXTERNAL_NETWORKS\`
  1570. fi
  1571.  
  1572. # Make a table of interfaces for marking packets based on their incoming interface for port forwarding.
  1573.  
  1574. if [ -n "\$PORT_FORWARDS" ]; then
  1575.   COUNT="0"
  1576.   TAB="1"
  1577.   for INTERFACE in \$STATIC_INTERNAL_INTERFACES \$STATIC_EXTERNAL_INTERFACES; do
  1578.     COUNT=\$((COUNT + 1))
  1579.     ADDRESS=\`echo \$INTERNAL_ADDRESSES \$EXTERNAL_ADDRESSES | cut -d\\  -f\$COUNT\`
  1580.     # Do not forward packets destined for an address in STATIC_INSIDE_OUTSIDE.
  1581.     if !(( \`echo "\$STATIC_INSIDE_OUTSIDE" | awk '{ gsub(/\\ /,"\\n"); print }' | \\
  1582.             cut -d: -f2 | grep -c "\$ADDRESS"\` )); then
  1583.       if [ -n "\$FIREWALL_IP" ]; then
  1584.     # Nobody will ever use the address of the private network between us and our gateway for port forwarding.
  1585.     if (( \`echo "\$FIREWALL_IP" | awk '{ gsub(/\\ /,"\\n"); print }' | \\
  1586.            cut -d: -f2 | grep -c "\$ADDRESS"\` )); then
  1587.       continue
  1588.     fi
  1589.     if (( \`echo "\$FIREWALL_IP" | awk '{ gsub(/\\ /,"\\n"); print }' | \\
  1590.            cut -d: -f1 | grep -c "\$ADDRESS"\` )); then
  1591.       ADDRESS=\`echo "\$FIREWALL_IP" | awk '{ gsub(/\\ /,"\\n"); print }' | \\
  1592.                grep "\$ADDRESS" | cut -d: -f2\`
  1593.     fi
  1594.       fi
  1595.       INTERFACE=\`echo "\$INTERFACE" | cut -d: -f1\`
  1596.       INTERFACE_TAB[\$TAB]="\$INTERFACE"
  1597.       ADDRESS_TAB[\$TAB]="\$ADDRESS"
  1598.       PORT_FORWARD_ADDRESSES="\$PORT_FORWARD_ADDRESSES \$ADDRESS"
  1599.       if [ "\$PORT_FWD_ROUTED_NETWORKS" == "yes" ]; then
  1600.     if (( \`echo "\$STATIC_INTERNAL_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  1601.       NETWORK_TAB[\$TAB]="\$ADDITIONAL_ROUTED_NETWORKS \`echo "\$INTERNAL_NETWORKS" | cut -d\\  -f\$COUNT\`"
  1602.     fi
  1603.       fi
  1604.       TAB=\$((TAB + 1))
  1605.     fi
  1606.   done
  1607.   for INTERFACE in \$DYNAMIC_INTERNAL_INTERFACES \$DYNAMIC_EXTERNAL_INTERFACES; do
  1608.     INTERFACE_TAB[\$TAB]="\$INTERFACE"
  1609.     TAB=\$((TAB + 1))
  1610.   done
  1611.   PORT_FORWARD_ADDRESSES=\`echo \$PORT_FORWARD_ADDRESSES\`
  1612. fi
  1613.  
  1614. # Obtain broadcast list if we are doing logging (so that we will not log them).
  1615. # We have to do this before we hax0r STATIC_INTERNAL_INTERFACES.
  1616.  
  1617. if [ "\$LOGGING" == "yes" ]; then
  1618.   BCAST_LIST="255.255.255.255"
  1619.   for INTERFACE in \$STATIC_INTERNAL_INTERFACES \$STATIC_EXTERNAL_INTERFACES; do 
  1620.     BROADCAST=\`ifconfig | grep "^\$INTERFACE\\ " -A1 | grep "Bcast" | cut -d: -f3 | cut -d\\  -f1 | head -1\`
  1621.     if !(( \`echo "\$BCAST_LIST" | grep -c "\$BROADCAST"\` )); then
  1622.       BCAST_LIST="\$BCAST_LIST \$BROADCAST"
  1623.     fi
  1624.   done
  1625. fi
  1626.  
  1627. # Remove redundant networks from INTERNAL_INTERFACES, STATIC_INTERNAL_INTERFACES, and INTERNAL_NETWORKS.
  1628.  
  1629. if [ -n "\$INTERNAL_NETWORKS" ]; then
  1630.   CHANGE=1
  1631.   until [ "\$CHANGE" == "0" ]; do
  1632.     COUNT=0
  1633.     CHANGE=0
  1634.     for NET in \$INTERNAL_NETWORKS; do
  1635.       TAB=0
  1636.       COUNT=\$((COUNT + 1))
  1637.       INTERFACE=\`echo "\$STATIC_INTERNAL_INTERFACES" | cut -d\\  -f\$COUNT\`
  1638.       STROKE=\`echo "\$NET" | cut -d/ -f2\`
  1639.       for NET1 in \$INTERNAL_NETWORKS; do
  1640.     TAB=\$((TAB + 1))
  1641.     INTERFACE1=\`echo "\$STATIC_INTERNAL_INTERFACES" | cut -d\\  -f\$TAB\`
  1642.     if [ "\$INTERFACE" == "\$INTERFACE1" ]; then
  1643.       continue    # Obviously we don't want to compare a network to itself.
  1644.     fi
  1645.     PARAM=\`echo "\$INTERFACE1" | cut -d: -f1\`
  1646.     if !(( \`echo "\$INTERFACE" | cut -d: -f1 | grep -c "\$PARAM"\` )); then
  1647.       continue    # We only want to compare networks attached to the same interface.
  1648.     fi
  1649.     MASK=\`echo "\$NET1/" | cut -d/ -f2\`
  1650.     xbits
  1651.     if [ "\$STROKE" -le "\$MASK" ]; then    # Then NET defines a larger network than NET1.
  1652.       if [ "\$XBITS" -ge "\$STROKE" ]; then    # Then delete the second one if they are the same up to STROKE.
  1653.         INTERNAL_NETWORKS=\`echo "\$INTERNAL_NETWORKS" | sed s#\$NET1##\`
  1654.         INTERNAL_NETWORKS=\`echo \$INTERNAL_NETWORKS\`
  1655.         STATIC_INTERNAL_INTERFACES=\`echo "\$STATIC_INTERNAL_INTERFACES" | sed s#\$INTERFACE1##\`
  1656.         STATIC_INTERNAL_INTERFACES=\`echo \$STATIC_INTERNAL_INTERFACES\`
  1657.         if [ -z "\$DMZ_INTERFACES" ] || !(( \`echo "\$DMZ_INTERFACES" | grep -c "\$PARAM"\` )); then
  1658.           NAT_NETWORKS=\`echo "\$NAT_NETWORKS" | sed s#\$NET1##\`
  1659.           NAT_NETWORKS=\`echo \$NAT_NETWORKS\`
  1660.         fi
  1661.         CHANGE=1
  1662.         continue 3
  1663.       fi
  1664.     elif [ "\$XBITS" -ge "\$MASK" ]; then    # Else delete the first one (provided it is still the same interface).
  1665.       INTERNAL_NETWORKS=\`echo "\$INTERNAL_NETWORKS" | sed s#\$NET##\`
  1666.       INTERNAL_NETWORKS=\`echo \$INTERNAL_NETWORKS\`
  1667.       STATIC_INTERNAL_INTERFACES=\`echo "\$STATIC_INTERNAL_INTERFACES" | sed s#\$INTERFACE##\`
  1668.       STATIC_INTERNAL_INTERFACES=\`echo \$STATIC_INTERNAL_INTERFACES\`
  1669.       if [ -z "\$DMZ_INTERFACES" ] || !(( \`echo "\$DMZ_INTERFACES" | grep -c "\$PARAM"\` )); then
  1670.         NAT_NETWORKS=\`echo "\$NAT_NETWORKS" | sed s#\$NET##\`
  1671.         NAT_NETWORKS=\`echo \$NAT_NETWORKS\`
  1672.       fi
  1673.       CHANGE=1
  1674.       continue 3
  1675.     fi
  1676.       done
  1677.     done
  1678.   done
  1679. fi
  1680.  
  1681. echo -n "."
  1682.  
  1683. # Sanity check ALLOW_INBOUND and DENY_OUTBOUND and compare against INTERNAL_NETWORKS.
  1684.  
  1685. if [ -n "\$ALLOW_INBOUND" ] || [ -n "\$DENY_OUTBOUND" ]; then
  1686.   for PARAM in DENY_OUTBOUND ALLOW_INBOUND;  do
  1687.     if [ "\$PARAM" == "DENY_OUTBOUND" ]; then
  1688.       LIST="\$DENY_OUTBOUND"
  1689.     else
  1690.       LIST="\$ALLOW_INBOUND"
  1691.     fi
  1692.     for FORWARD in \$LIST; do
  1693.       for TEMP in NULL; do    # You'll see why.
  1694.     if (( \`echo "\$FORWARD:" | cut -d: -f4 | grep -c "."\` )); then
  1695.       FAILURE="Too many parameters in \$PARAM."
  1696.       exit_failure \$1
  1697.     fi
  1698.     NET=\`echo "\$FORWARD:" | cut -d: -f1\`
  1699.     if [ -n "\$NET" ] && ! check_network; then
  1700.       PORTS="\$NET"
  1701.       if ! check_ports; then
  1702.         FAILURE="Syntax error in \$PARAM."
  1703.         exit_failure \$1
  1704.       else
  1705.         eval TEMP_\$PARAM="any:any:\$PORTS"
  1706.         break
  1707.       fi
  1708.     elif [ -z "\$NET" ]; then
  1709.       NET="any"
  1710.     else
  1711.       if [ "\$PARAM" == "DENY_OUTBOUND" ]; then
  1712.         STROKE=\`echo "\$NET/" | cut -d/ -f2\`
  1713.         if [ -z "\$STROKE" ]; then
  1714.           STROKE=32
  1715.         fi
  1716.         for TAB in NULL; do
  1717.           for NET1 in \$INTERNAL_NETWORKS \$ADDITIONAL_ROUTED_NETWORKS; do
  1718.         MASK=\`echo "\$NET1/" | cut -d/ -f2\`
  1719.         if [ -z "\$MASK" ]; then
  1720.           MASK=32
  1721.         fi
  1722.         xbits
  1723.         # Is this host/network from one of our internal networks?
  1724.         if [ "\$STROKE" -lt "\$MASK" ]; then
  1725.           continue    # Can't tell
  1726.         elif [ "\$XBITS" -ge "\$MASK" ]; then
  1727.           break 2        # Yes!
  1728.         fi        # Can't tell
  1729.           done
  1730.           FAILURE="Source host from DENY_OUTBOUND not found in an internal network."
  1731.           exit_failure \$1
  1732.         done
  1733.       fi
  1734.     fi
  1735.     NET2="\$NET"
  1736.     NET=\`echo "\$FORWARD:" | cut -d: -f2\`
  1737.     if [ -n "\$NET" ] && ! check_network; then
  1738.       PORTS="\$NET"
  1739.       if ! check_ports; then
  1740.         FAILURE="Syntax error in \$PARAM."
  1741.         exit_failure \$1
  1742.       else
  1743.         eval TEMP_\$PARAM="\$NET2:any:\$PORTS"
  1744.         break
  1745.       fi
  1746.     elif [ -z "\$NET" ]; then
  1747.       eval TEMP_\$PARAM="\$NET2:any:any"
  1748.       break
  1749.     fi
  1750.     if [ "\$PARAM" == "ALLOW_INBOUND" ]; then
  1751.       STROKE=\`echo "\$NET/" | cut -d/ -f2\`
  1752.       if [ -z "\$STROKE" ]; then
  1753.         STROKE=32
  1754.       fi
  1755.       for TAB in NULL; do
  1756.         for NET1 in \$INTERNAL_NETWORKS \$ADDITIONAL_ROUTED_NETWORKS; do
  1757.           MASK=\`echo "\$NET1/" | cut -d/ -f2\`
  1758.           if [ -z "\$MASK" ]; then
  1759.         MASK=32
  1760.           fi
  1761.           xbits
  1762.           # Is this host/network from one of our internal networks?
  1763.           if [ "\$STROKE" -lt "\$MASK" ]; then
  1764.         continue        # Can't tell on this network
  1765.           elif [ "\$XBITS" -ge "\$MASK" ]; then
  1766.         break 2        # Yes!
  1767.           fi            # Can't tell
  1768.         done
  1769.         FAILURE="Destination host in ALLOW_INBOUND not found in an internal network."
  1770.         exit_failure \$1
  1771.       done
  1772.     fi
  1773.     PORTS=\`echo "\$FORWARD:" | cut -d: -f3\`
  1774.     if [ -z "\$PORTS" ]; then
  1775.       eval TEMP_\$PARAM="\$NET2:\$NET:any"
  1776.       break
  1777.     else
  1778.       if ! check_ports; then
  1779.         FAILURE="\$FAILURE in \$PARAM."
  1780.         exit_failure \$1
  1781.       else
  1782.         eval TEMP_\$PARAM="\$NET2:\$NET:\$PORTS"
  1783.         break
  1784.       fi
  1785.     fi
  1786.       done
  1787.       if [ "\$PARAM" == "ALLOW_INBOUND" ]; then
  1788.     MOD_ALLOW_INBOUND="\$MOD_ALLOW_INBOUND \$TEMP_ALLOW_INBOUND"
  1789.       else
  1790.     MOD_DENY_OUTBOUND="\$MOD_DENY_OUTBOUND \$TEMP_DENY_OUTBOUND"
  1791.       fi
  1792.     done
  1793.   done
  1794.   ALLOW_INBOUND=\`echo \$MOD_ALLOW_INBOUND\`
  1795.   DENY_OUTBOUND=\`echo \$MOD_DENY_OUTBOUND\`
  1796. fi
  1797.  
  1798. # Remove duplicate external addresses, for example those created when using channel bonding.
  1799.  
  1800. if [ -n "\$EXTERNAL_ADDRESSES" ]; then
  1801.   MOD_ADDRESSES=""
  1802.   for ADDRESS in \$EXTERNAL_ADDRESSES; do
  1803.     if !(( \`echo "\$MOD_ADDRESSES" | grep -c "\$ADDRESS"\` )); then
  1804.       MOD_ADDRESSES="\$MOD_ADDRESSES \$ADDRESS"
  1805.     fi
  1806.   done
  1807.   EXTERNAL_ADDRESSES=\`echo \$MOD_ADDRESSES\`
  1808. fi
  1809.  
  1810. # Make sure we own the addresses that we are staticly mapping through the firewall, and verify internal hosts are actually from internal networks.
  1811.  
  1812. if [ -n "\$STATIC_INSIDE_OUTSIDE" ]; then
  1813.   for FORWARD in \$STATIC_INSIDE_OUTSIDE; do
  1814.     NET1=\`echo "\$FORWARD:" | cut -d: -f1\` 
  1815.     OUTSIDE=\`echo "\$FORWARD:" | cut -d: -f2\` 
  1816.     for TAB in NULL; do
  1817.       for ADDRESS in \$EXTERNAL_ADDRESSES \$INTERNAL_ADDRESSES; do
  1818.     if [ "\$ADDRESS" == "\$OUTSIDE" ]; then
  1819.       break 2
  1820.     fi
  1821.       done
  1822.       FAILURE="Could not find an interface with address given in STATIC_INSIDE_OUTSIDE."
  1823.       exit_failure \$1
  1824.     done
  1825.     STROKE=\`echo "\$NET1/" | cut -d/ -f2\`
  1826.     if [ -z "\$STROKE" ]; then
  1827.       STROKE=32
  1828.     fi
  1829.     for TAB in NULL; do
  1830.       for NET in \$INTERNAL_NETWORKS \$ADDITIONAL_ROUTED_NETWORKS; do
  1831.     MASK=\`echo "\$NET/" | cut -d/ -f2\`
  1832.     if [ -z "\$MASK" ]; then
  1833.       MASK=32
  1834.     fi
  1835.     xbits
  1836.     # Is this host/network from one of our internal networks?
  1837.     if [ "\$STROKE" -lt "\$MASK" ]; then
  1838.       continue    # Can't tell
  1839.     elif [ "\$XBITS" -ge "\$MASK" ]; then
  1840.       break 2    # Yes!
  1841.     fi        # Can't tell
  1842.       done
  1843.       FAILURE="Internal host from STATIC_INSIDE_OUTSIDE not found in an internal network."
  1844.       exit_failure \$1
  1845.     done
  1846.   done
  1847. fi
  1848.  
  1849. # For FIREWALL_IP, make sure that our source address is on an external interface and our destination address is on an internal interface.
  1850.  
  1851. for ADDRESS in \$FIREWALL_IP; do
  1852.     OUTSIDE=\`echo "\$ADDRESS:" | cut -d: -f1\` 
  1853.     INSIDE=\`echo "\$ADDRESS:" | cut -d: -f2\` 
  1854.   for TAB in NULL; do
  1855.     for ADDRESS in \$EXTERNAL_ADDRESSES; do
  1856.       if [ "\$ADDRESS" == "\$OUTSIDE" ]; then
  1857.     break 2
  1858.       fi
  1859.     done
  1860.     FAILURE="Source address given in FIREWALL_IP must be configured on an *external* interface."
  1861.     exit_failure \$1
  1862.   done
  1863.   for TAB in NULL; do
  1864.     for ADDRESS in \$INTERNAL_ADDRESSES; do
  1865.       if [ "\$ADDRESS" == "\$INSIDE" ]; then
  1866.     break 2
  1867.       fi
  1868.     done
  1869.     FAILURE="Destination address given in FIREWALL_IP must be configured on an *internal* interface."
  1870.     exit_failure \$1
  1871.   done
  1872. done
  1873.  
  1874. # If we do not trust routed networks then add internal interfaces as "secured" addresses in the exit message.
  1875.  
  1876. if [ -n "\$STATIC_INTERNAL_INTERFACES" ] && [ "\$TRUST_ROUTED_NETWORKS" != "yes" ]; then
  1877.   EXTERNAL_ADDRESSES="\$EXTERNAL_ADDRESSES \$INTERNAL_ADDRESSES"
  1878. fi
  1879.  
  1880. echo -n "."
  1881.  
  1882. # Check that rp_filter interfaces are valid.
  1883.  
  1884. for INTERFACE in \$NO_RP_FILTER_INTERFACES; do
  1885.   if ! [ -w "/proc/sys/net/ipv4/conf/\$INTERFACE/rp_filter" ]; then
  1886.     FAILURE="Cannot write to /proc/sys/net/ipv4/conf/\$INTERFACE/rp_filter.  Is the interface definition valid?"
  1887.     exit_failure \$1
  1888.   fi
  1889. done
  1890.  
  1891. # Check for Local Loopback interface.
  1892.  
  1893. if !(( \`ifconfig | grep -A1 "^lo" | grep "127\\." | grep -c "255\\.0\\.0\\.0"\` )); then
  1894.   FAILURE="Local Loopback interface (lo) required but not found."
  1895.   exit_failure \$1
  1896. fi
  1897.  
  1898. # Make sure the filter table exists.
  1899.  
  1900. if (( \`iptables -t filter -nL 2>&1 | grep -c "Table does not exist"\` )) || (( \`iptables -t filter -nL 2>&1 | grep -c "can't initialize iptables table"\` )); then
  1901.   FAILURE="Could not find 'filter' table.  Did you compile support for all necessary modules?"
  1902.   exit_failure \$1
  1903. fi
  1904.  
  1905. # Check for the REJECT target if RFC 1122 compliance is enabled.
  1906.  
  1907. if [ "\$RFC_1122_COMPLIANT" == "yes" ]; then
  1908.   if ((\`iptables -t filter -i lo -o lo -I FORWARD -j REJECT 2>&1 | grep -c "No chain/target/match by that name"\`)); then
  1909.     FAILURE="Could not find 'REJECT' target.  Did you compile support for all necessary modules?"
  1910.     exit_failure \$1
  1911.   else
  1912.     iptables -t filter -D FORWARD 1
  1913.   fi
  1914. fi
  1915.  
  1916. # If logging is enabled check for LOG and limit targets.
  1917.  
  1918. if [ "\$LOGGING" == "yes" ]; then
  1919.   if (( \`iptables -t filter -i lo -o lo -I FORWARD -m limit 2>&1 | \\
  1920.      grep -c "No chain/target/match by that name"\` )); then
  1921.     FAILURE="Could not find 'limit' target.  Did you compile support for all necessary modules?"
  1922.     exit_failure \$1
  1923.   else
  1924.     iptables -t filter -D FORWARD 1
  1925.   fi
  1926.   if (( \`iptables -t filter -i lo -o lo -I FORWARD -j LOG 2>&1 | grep -c "No chain/target/match by that name"\` )); then
  1927.     FAILURE="Could not find 'LOG' target.  Did you compile support for all necessary modules?"
  1928.     exit_failure \$1
  1929.   else
  1930.     iptables -t filter -D FORWARD 1
  1931.   fi
  1932. fi
  1933.  
  1934. # Check for the nat table if we need it.
  1935.  
  1936. if [ -n "\$STATIC_NAT_INTERFACES" ] || [ -n "\$DYNAMIC_NAT_INTERFACES" ] || [ -n "\$PORT_FORWARDS" ]; then
  1937.   if (( \`iptables -t nat -nL 2>&1 | grep -c "Table does not exist"\` )) || (( \`iptables -t nat -nL 2>&1 | grep -c "can't initialize iptables table"\` )); then
  1938.     FAILURE="Could not find 'nat' table.  Did you compile support for all necessary modules?"
  1939.     exit_failure \$1
  1940.   fi
  1941. fi
  1942.  
  1943. # Determine if we need the MASQUERADE target.
  1944.  
  1945. if [ -n "\$DYNAMIC_NAT_INTERFACES" ] || ( [ -n "\$DYNAMIC_INTERFACES" ] && [ -n "\$PORT_FORWARDS" ] ); then
  1946.   if ((\`iptables -t nat -I POSTROUTING -o lo -j MASQUERADE 2>&1 | grep -c "No chain/target/match by that name"\`)); then
  1947.     FAILURE="Could not find 'MASQUERADE' target.  Did you compile support for all necessary modules?"
  1948.     exit_failure \$1
  1949.   else
  1950.     iptables -t nat -D POSTROUTING 1
  1951.   fi
  1952. fi
  1953.  
  1954. # Check for state match module.
  1955.  
  1956. if (( \`iptables -t filter -I OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 2>&1 | \\
  1957.        grep -c "No chain/target/match by that name"\` )); then
  1958.   FAILURE="Failed to load state match module.  Did you compile support for all necessary modules?"
  1959.   exit_failure \$1
  1960. else
  1961.   iptables -t filter -D OUTPUT 1
  1962. fi
  1963.  
  1964. # Check for various port forwarding and ttl_stealth_router requirements.
  1965.  
  1966. if [ -n "\$PORT_FORWARDS" ] || [ "\$TTL_STEALTH_ROUTER" == "yes" ]; then
  1967.   if (( \`iptables -t mangle -nL 2>&1 | grep -c "Table does not exist"\` )) || (( \`iptables -t mangle -nL 2>&1 | grep -c "can't initialize iptables table"\` )); then
  1968.     FAILURE="Could not find 'mangle' table, required for port forwarding and TTL stealth router mode.  Did you compile support for all necessary modules?"
  1969.     exit_failure \$1
  1970.   fi
  1971.   if [ -n "\$PORT_FORWARDS" ]; then
  1972.     if (( \`iptables -t mangle -I OUTPUT -j MARK --set-mark "1" 2>&1 | grep -c "No chain/target/match by that name"\` )); then
  1973.       FAILURE="Failed to load MARK target, required for port forwarding.  Did you compile support for all necessary modules?"
  1974.       exit_failure \$1
  1975.     else
  1976.       iptables -t mangle -D OUTPUT 1
  1977.     fi
  1978.     if (( \`iptables -t mangle -I OUTPUT -m mark --mark "1" -j ACCEPT 2>&1 | grep -c "No chain/target/match by that name"\` )); then
  1979.       FAILURE="Failed to netfilter MARK match module, required for port forwarding.  Did you compile support for all necessary modules?"
  1980.       exit_failure \$1
  1981.     else
  1982.       iptables -t mangle -D OUTPUT 1
  1983.     fi
  1984.   fi
  1985.   if [ "\$TTL_STEALTH_ROUTER" == "yes" ]; then
  1986.     if (( \`iptables -t mangle -I FORWARD -j ACCEPT 2>&1 | grep -c "No chain/target/match by that name"\` )); then
  1987.       FAILURE="Linux kernel 2.4.18 or newer required for TTL_STEALTH_ROUTER mode."
  1988.       exit_failure \$1
  1989.     else
  1990.       iptables -t mangle -D FORWARD 1
  1991.     fi
  1992.   fi
  1993. fi
  1994.  
  1995. # Test for ipt_TTL support.
  1996.  
  1997. if [ "\$TTL_STEALTH_ROUTER" == "yes" ]; then
  1998.   if (( \`iptables -t mangle -I FORWARD -j TTL --ttl-inc "1" 2>&1 | grep -c "No chain/target/match by that name"\` )); then
  1999.     FAILURE="TTL_STEALTH_ROUTER mode requires a patched kernel.  See http://projectfiles.com/firewall/ for details."
  2000.     exit_failure \$1
  2001.   else
  2002.     iptables -t mangle -D FORWARD 1
  2003.   fi
  2004. fi
  2005.  
  2006. # System and configuration approved.
  2007.  
  2008. echo " [ PASSED ]"
  2009.  
  2010. # Exit if we only want to do sanity checking.
  2011.  
  2012. if [ "\$1" == "check" ]; then
  2013.   exit
  2014. fi
  2015.  
  2016. ##########################
  2017. # -- Firewall Section -- #
  2018. ##########################
  2019.  
  2020. echo -n "-> Building firewall."
  2021.  
  2022. # Let no packets slip by while we are configuring the firewall.
  2023.  
  2024. echo "0" > /proc/sys/net/ipv4/ip_forward
  2025.  
  2026. # Enable kernel level reverse path filtering.
  2027.  
  2028. echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
  2029. for INTERFACE in \$NO_RP_FILTER_INTERFACES; do
  2030.   echo "0" > /proc/sys/net/ipv4/conf/\$INTERFACE/rp_filter
  2031. done
  2032.  
  2033. # Enable kernel level dynamic address handling.
  2034.  
  2035. if [ -n "\$DYNAMIC_INTERFACES" ]; then
  2036.   echo "1" > /proc/sys/net/ipv4/ip_dynaddr
  2037. else
  2038.   echo "0" > /proc/sys/net/ipv4/ip_dynaddr
  2039. fi
  2040.  
  2041. # Set default policies.
  2042.  
  2043. iptables -t filter -F
  2044. iptables -t filter -X
  2045. iptables -t filter -P INPUT DROP
  2046. iptables -t filter -P FORWARD DROP
  2047. iptables -t filter -P OUTPUT ACCEPT
  2048.  
  2049. if !(( \`iptables -t nat -F 2>&1 | grep -c "Table does not exist"\` )); then
  2050.   iptables -t nat -X
  2051.   iptables -t nat -P PREROUTING ACCEPT
  2052.   iptables -t nat -P POSTROUTING ACCEPT
  2053.   iptables -t nat -P OUTPUT ACCEPT
  2054. fi
  2055.  
  2056. if !(( \`iptables -t mangle -F 2>&1 | grep -c "Table does not exist"\` )); then
  2057.   iptables -t mangle -F
  2058.   iptables -t mangle -X
  2059.   iptables -t mangle -P PREROUTING ACCEPT
  2060.   iptables -t mangle -P OUTPUT ACCEPT
  2061.   iptables -t mangle -P POSTROUTING ACCEPT > /dev/null 2>&1    # New 2.4.18 builtin mangle chains
  2062.   iptables -t mangle -P INPUT ACCEPT > /dev/null 2>&1
  2063.   iptables -t mangle -P FORWARD ACCEPT > /dev/null 2>&1
  2064. fi
  2065.  
  2066. # Drop traffic to and from blacklisted networks.
  2067.  
  2068. for NETWORK in \$BLACKLIST; do
  2069.   NET=\`echo "\$NETWORK:" | cut -d: -f1\`
  2070.   if ! check_network; then
  2071.     PORTS="\$NET"
  2072.     NET="0.0.0.0/0"
  2073.   else
  2074.     PORTS=\`echo "\$NETWORK:" | cut -d: -f2\`
  2075.   fi
  2076.   if [ -n "\$PORTS" ]; then
  2077.     PROTOCOL=\`echo "\$PORTS/" | cut -d/ -f2\`
  2078.     PORT="--dport \`echo "\$PORTS/" | cut -d/ -f1 | cut -d- -f1,2 --output-delimiter=":"\`"
  2079.     if [ "\$PROTOCOL" == "tcp" ] || [ -z "\$PROTOCOL" ]; then
  2080.       if [ "\$IS_ROUTER" == "yes" ]; then
  2081.     iptables -t filter -I FORWARD -s \$NET -p tcp \$PORT -j DROP
  2082.     iptables -t filter -I FORWARD -d \$NET -p tcp \$PORT -j DROP
  2083.       fi
  2084.       iptables -t filter -I INPUT -s \$NET -p tcp \$PORT -j DROP
  2085.       iptables -t filter -I INPUT -d \$NET -p tcp \$PORT -j DROP
  2086.       iptables -t filter -I OUTPUT -s \$NET -p tcp \$PORT -j DROP
  2087.       iptables -t filter -I OUTPUT -d \$NET -p tcp \$PORT -j DROP
  2088.     fi
  2089.     if [ "\$PROTOCOL" == "udp" ] || [ -z "\$PROTOCOL" ]; then
  2090.       if [ "\$IS_ROUTER" == "yes" ]; then
  2091.     iptables -t filter -I FORWARD -s \$NET -p udp \$PORT -j DROP
  2092.     iptables -t filter -I FORWARD -d \$NET -p udp \$PORT -j DROP
  2093.       fi
  2094.       iptables -t filter -I INPUT -s \$NET -p udp \$PORT -j DROP
  2095.       iptables -t filter -I INPUT -d \$NET -p udp \$PORT -j DROP
  2096.       iptables -t filter -I OUTPUT -s \$NET -p udp \$PORT -j DROP
  2097.       iptables -t filter -I OUTPUT -d \$NET -p udp \$PORT -j DROP
  2098.     fi
  2099.   else
  2100.     if [ "\$IS_ROUTER" == "yes" ]; then
  2101.       iptables -t filter -I FORWARD -s \$NET -j DROP
  2102.       iptables -t filter -I FORWARD -d \$NET -j DROP
  2103.     fi
  2104.     iptables -t filter -I INPUT -s \$NET -j DROP
  2105.     iptables -t filter -I INPUT -d \$NET -j DROP
  2106.     iptables -t filter -I OUTPUT -s \$NET -j DROP
  2107.     iptables -t filter -I OUTPUT -d \$NET -j DROP
  2108.   fi
  2109. done
  2110.  
  2111. # Initialize trusted chain
  2112.  
  2113. iptables -t filter -N TRUSTED
  2114. if [ "\$RFC_1122_COMPLIANT" == "yes" ]; then
  2115.   iptables -t filter -A TRUSTED -p icmp -j DROP    # ICMP will be permitted elsewhere.
  2116.   iptables -t filter -A TRUSTED -j REJECT
  2117. else
  2118.   iptables -t filter -A TRUSTED -j DROP
  2119. fi
  2120.  
  2121. # Reject state NEW without SYN flag set.  (paranoia setting)
  2122.  
  2123. if [ "\$DROP_NEW_WITHOUT_SYN" == "yes" ]; then
  2124.   if [ "\$LOGGING" == "yes" ]; then
  2125.       iptables -A INPUT -p tcp ! --syn -m state --state NEW -m limit --limit \$LOG_LIMIT \\
  2126.                --limit-burst \$LOG_BURST -j LOG --log-level \$LOG_LEVEL --log-prefix "firewall: "
  2127.   fi
  2128.   iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
  2129.   if [ "\$IS_ROUTER" == "yes" ]; then
  2130.     if [ "\$LOGGING" == "yes" ]; then
  2131.       iptables -A FORWARD -p tcp ! --syn -m state --state NEW -m limit --limit \$LOG_LIMIT \\
  2132.                --limit-burst \$LOG_BURST -j LOG --log-level \$LOG_LEVEL --log-prefix "firewall: "
  2133.     fi
  2134.     iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
  2135.   fi
  2136. fi
  2137.  
  2138. # Set logging preferences.  Do not log broadcasts.
  2139.  
  2140. if [ "\$LOGGING" == "yes" ]; then
  2141.   echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
  2142.   iptables -t filter -N LOGME
  2143.   iptables -t filter -I TRUSTED -j LOGME
  2144.   for BROADCAST in \$BCAST_LIST; do
  2145.     iptables -t filter -I LOGME -d \$BROADCAST -j RETURN
  2146.   done
  2147.   iptables -t filter -A LOGME -p icmp -m limit --limit \$LOG_LIMIT --limit-burst \$LOG_BURST -j LOG --log-level \$LOG_LEVEL \\
  2148.          --log-prefix "firewall: "
  2149.   iptables -t filter -A LOGME -p tcp -m limit --limit \$LOG_LIMIT --limit-burst \$LOG_BURST -j LOG --log-level \$LOG_LEVEL \\
  2150.            --log-prefix "firewall: "
  2151.   iptables -t filter -A LOGME -p udp -m limit --limit \$LOG_LIMIT --limit-burst \$LOG_BURST -j LOG --log-level \$LOG_LEVEL \\
  2152.            --log-prefix "firewall: "
  2153. fi
  2154.  
  2155. echo -n "."
  2156.  
  2157. # Accept icmp-echo-request packets if RFC-1122 compliance option is enabled.  Limit logging of icmp packets.
  2158.  
  2159. if [ "\$RFC_1122_COMPLIANT" == "yes" ]; then
  2160.   if [ "\$LOGGING" == "yes" ]; then
  2161.     for ADDRESS in \$INTERNAL_ADDRESSES \$EXTERNAL_ADDRESSES; do
  2162.       iptables -t filter -I TRUSTED 2 -d \$ADDRESS -p icmp --icmp-type echo-request -j ACCEPT
  2163.     done
  2164.     for FORWARD in \$STATIC_INSIDE_OUTSIDE; do
  2165.       ADDRESS=\`echo "\$FORWARD:" | cut -d: -f1\` 
  2166.       iptables -t filter -I TRUSTED 2 -d \$ADDRESS -p icmp --icmp-type echo-request -j ACCEPT
  2167.     done
  2168.     for ADDRESS in \$INTERNAL_ADDRESSES \$EXTERNAL_ADDRESSES; do
  2169.       iptables -t filter -I TRUSTED -d \$ADDRESS -p icmp --icmp-type echo-request -m limit --limit 2/second --limit-burst 10 -j ACCEPT
  2170.     done
  2171.     for FORWARD in \$STATIC_INSIDE_OUTSIDE; do
  2172.       ADDRESS=\`echo "\$FORWARD:" | cut -d: -f1\` 
  2173.       iptables -t filter -I TRUSTED -d \$ADDRESS -p icmp --icmp-type echo-request -m limit --limit 2/second --limit-burst 10 -j ACCEPT
  2174.     done
  2175.     if [ "\$IS_ROUTER" != "yes" ] && [ -z "\$EXTERNAL_ADDRESSES" ]; then
  2176.       iptables -t filter -I TRUSTED 2 -p icmp --icmp-type echo-request -j ACCEPT
  2177.       iptables -t filter -I TRUSTED -p icmp --icmp-type echo-request -m limit --limit 2/second --limit-burst 10 -j ACCEPT
  2178.     elif [ -n "\$DMZ_INTERFACES" ]; then
  2179.       for INTERFACE in \$DMZ_INTERFACES; do
  2180.     iptables -t filter -I TRUSTED 2 -o \$INTERFACE -p icmp --icmp-type echo-request -j ACCEPT
  2181.     iptables -t filter -I TRUSTED -o \$INTERFACE -p icmp --icmp-type echo-request -m limit --limit 2/second --limit-burst 10 -j ACCEPT
  2182.       done
  2183.     fi
  2184.   else
  2185.     for ADDRESS in \$INTERNAL_ADDRESSES \$EXTERNAL_ADDRESSES; do
  2186.       iptables -t filter -I TRUSTED -d \$ADDRESS -p icmp --icmp-type echo-request -j ACCEPT
  2187.     done
  2188.     for FORWARD in \$STATIC_INSIDE_OUTSIDE; do
  2189.       ADDRESS=\`echo "\$FORWARD:" | cut -d: -f1\` 
  2190.       iptables -t filter -I TRUSTED -d \$ADDRESS -p icmp --icmp-type echo-request -j ACCEPT
  2191.     done
  2192.     if [ "\$IS_ROUTER" != "yes" ] && [ -z "\$EXTERNAL_ADDRESSES" ]; then
  2193.       iptables -t filter -I TRUSTED -p icmp --icmp-type echo-request -j ACCEPT
  2194.     elif [ -n "\$DMZ_INTERFACES" ]; then
  2195.       for INTERFACE in \$DMZ_INTERFACES; do
  2196.     iptables -t filter -I TRUSTED -o \$INTERFACE -p icmp --icmp-type echo-request -j ACCEPT
  2197.       done
  2198.     fi
  2199.   fi
  2200. fi
  2201.  
  2202. # Insert trusted networks into trusted chain before everything else.
  2203.  
  2204. for NETWORK in \$PERMIT ; do
  2205.   iptables -t filter -I TRUSTED -s \$NETWORK -j ACCEPT
  2206. done
  2207.  
  2208. # Insert local external networks into the trusted chain if option is enabled.
  2209.  
  2210. if [ "\$TRUST_LOCAL_EXTERNAL_NETWORKS" == "yes" ]; then
  2211.   for NETWORK in \$EXTERNAL_NETWORKS; do
  2212.     iptables -t filter -I TRUSTED -s \$NETWORK -j ACCEPT
  2213.   done
  2214. fi
  2215.  
  2216. # Set default policy for ESTABLISHED and RELATED connections to ACCEPT on FORWARD chains.
  2217.  
  2218. iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  2219. if [ "\$IS_ROUTER" == "yes" ]; then
  2220.   iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  2221. fi
  2222.  
  2223. # Configure ALLOW_INBOUND and DENY_OUTBOUND.
  2224.  
  2225. if [ -n "\$INTERNAL_INTERFACES" ]; then
  2226.   for PARAM in ACCEPT TRUSTED; do
  2227.     if [ "\$PARAM" == "TRUSTED" ]; then
  2228.       LIST="\$DENY_OUTBOUND"
  2229.     else
  2230.       LIST="\$ALLOW_INBOUND"
  2231.     fi
  2232.     for ITEM in \$LIST; do
  2233.       NET="-s \`echo "\$ITEM:" | cut -d: -f1\`"
  2234.       if [ "\$NET" == "-s any" ]; then
  2235.     NET=""
  2236.       fi
  2237.       DEST="-d \`echo "\$ITEM:" | cut -d: -f2\`"
  2238.       if [ "\$DEST" == "-d any" ]; then
  2239.     DEST=""
  2240.       fi
  2241.       PORTS=\`echo "\$ITEM:" | cut -d: -f3\`
  2242.       PROTOCOL=\`echo "\$PORTS/" | cut -d/ -f2\`
  2243.       PORT="--dport \`echo "\$PORTS/" | cut -d/ -f1 | cut -d- -f1,2 --output-delimiter=":"\`"
  2244.       if [ -z "\$DEST" ] || [ -z "\$NET" ]; then
  2245.     if [ "\$PARAM" == "ACCEPT" ]; then
  2246.       TAB="-o"    # (just to reuse the variable)  For ALLOW_INBOUND 
  2247.     else        # classify packets sent out on internal interfaces and
  2248.       TAB="-i"    # for DENY_OUTBOUND, received by internal interfaces,
  2249.     fi        # unless both source and destination addresses are available.
  2250.     for INTERFACE in \$INTERNAL_INTERFACES; do
  2251.       if !(( \`echo "\$INTERFACE" | grep -c ":"\` )); then
  2252.         if [ "\$PORTS" == "any" ]; then
  2253.           iptables -t filter -A FORWARD -m state --state NEW \$TAB \$INTERFACE \$NET \$DEST -j \$PARAM
  2254.         else
  2255.           if [ "\$PROTOCOL" == "tcp" ] || [ -z "\$PROTOCOL" ]; then
  2256.         iptables -t filter -A FORWARD -m state --state NEW \$TAB \$INTERFACE \$NET \$DEST -p tcp \$PORT -j \$PARAM
  2257.           fi
  2258.           if [ "\$PROTOCOL" == "udp" ] || [ -z "\$PROTOCOL" ]; then
  2259.         iptables -t filter -A FORWARD -m state --state NEW \$TAB \$INTERFACE \$NET \$DEST -p udp \$PORT -j \$PARAM
  2260.           fi
  2261.         fi
  2262.       fi
  2263.     done
  2264.       else    # The exception where we have both source and destination addresses
  2265.     if [ "\$PORTS" == "any" ]; then
  2266.       iptables -t filter -A FORWARD -m state --state NEW \$NET \$DEST -j \$PARAM
  2267.     else
  2268.       if [ "\$PROTOCOL" == "tcp" ] || [ -z "\$PROTOCOL" ]; then
  2269.         iptables -t filter -A FORWARD -m state --state NEW \$NET \$DEST -p tcp \$PORT -j \$PARAM
  2270.       fi
  2271.       if [ "\$PROTOCOL" == "udp" ] || [ -z "\$PROTOCOL" ]; then
  2272.         iptables -t filter -A FORWARD -m state --state NEW \$NET \$DEST -p udp \$PORT -j \$PARAM
  2273.       fi
  2274.     fi
  2275.       fi
  2276.     done
  2277.   done
  2278. fi
  2279.  
  2280. # For servers, only allow NEW connections to specified INPUT ports.  For port forwarding, allow on FORWARD chain.
  2281.  
  2282. for ITEM in \$OPEN_PORTS \$TRUSTED_PORTS; do
  2283.   NET=""
  2284.   if (( \`echo "\$ITEM:" | cut -d: -f2 | grep -c "."\` )); then
  2285.     NET="-s \`echo "\$ITEM:" | cut -d: -f1\`"
  2286.     ITEM=\`echo "\$ITEM:" | cut -d: -f2\`
  2287.   fi
  2288.   PORTS=\`echo "\$ITEM" | cut -d/ -f1\`
  2289.   PORTS=\`echo "\$PORTS" | cut -d- -f1,2 --output-delimiter=":"\`
  2290.   PROTOCOL=\`echo "\$ITEM" | cut -d/ -f2\`
  2291.   COUNT="0"
  2292.   for FORWARD in \$PORT_FORWARDS; do
  2293.     IN_PORTS=\`echo "\$FORWARD" | cut -d: -f2 | cut -d- -f1,2 --output-delimiter=":"\`
  2294.     if [ "\`echo "\$FORWARD" | cut -d: -f1\`" == "\$PROTOCOL" ] && [ "\$PORTS" == "\$IN_PORTS" ]; then
  2295.       DEST=\`echo "\$FORWARD" | cut -d: -f3\`
  2296.       DPORTS=\`echo "\$FORWARD" | cut -d: -f4 | cut -d- -f1,2 --output-delimiter=":"\`
  2297.       if [ -z "\$DPORTS" ]; then
  2298.     DPORTS="\$IN_PORTS"
  2299.       fi
  2300.       iptables -t filter -A FORWARD -m state --state NEW \$NET -d \$DEST -p \$PROTOCOL --dport \$DPORTS -j ACCEPT
  2301.       COUNT="1"
  2302.       if [ -z "\$NET" ]; then
  2303.     continue 2    # i.e. This port forward is open to everyone.
  2304.       fi
  2305.     fi
  2306.   done
  2307.   if [ "\$COUNT" == "0" ]; then
  2308.     iptables -t filter -A INPUT -m state --state NEW \$NET -p \$PROTOCOL --dport \$PORTS -j ACCEPT
  2309.   fi
  2310. done
  2311.  
  2312. echo -n "."
  2313.  
  2314. # For routers, allow routing of internal and routed networks on internal interfaces.  Fix traceroutes under DNAT info-leak-bug.
  2315.  
  2316. if [ "\$IS_ROUTER" == "yes" ]; then
  2317.   COUNT="0"
  2318.   TAB=""
  2319.   for INTERFACE in \$STATIC_INTERNAL_INTERFACES; do
  2320.     COUNT=\$((COUNT + 1))
  2321.     NETWORK=\`echo "\$INTERNAL_NETWORKS" | cut -d\\  -f\$COUNT\`
  2322.     INTERFACE=\`echo "\$INTERFACE" | cut -d: -f1\`
  2323.     iptables -t filter -A OUTPUT -o \$INTERFACE -d \$NETWORK -p icmp -j ACCEPT
  2324.     if [ -z "\$DMZ_INTERFACES" ] || !(( \`echo "\$DMZ_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  2325.       if [ "\$SHARED_INTERNAL" == "yes" ]; then
  2326.     iptables -t filter -A FORWARD -m state --state NEW -i \$INTERFACE -s \$NETWORK -j ACCEPT
  2327.       else
  2328.     for DEST in \$EXTERNAL_INTERFACES \$DMZ_INTERFACES; do
  2329.       if !(( \`echo "\$DEST" | grep -c ":"\` )); then
  2330.         iptables -t filter -A FORWARD -m state --state NEW -i \$INTERFACE -s \$NETWORK -o \$DEST -j ACCEPT
  2331.       fi
  2332.     done
  2333.       fi
  2334.     else
  2335.       for DEST in \$EXTERNAL_INTERFACES; do
  2336.     if !(( \`echo "\$DEST" | grep -c ":"\` )); then
  2337.       iptables -t filter -A FORWARD -m state --state NEW -i \$INTERFACE -s \$NETWORK -o \$DEST -j ACCEPT
  2338.     fi
  2339.       done
  2340.     fi
  2341.     if [ "\$TRUST_ROUTED_NETWORKS" == "yes" ] && ( [ -z "\$DMZ_INTERFACES" ] || \\
  2342.        !(( \`echo "\$DMZ_INTERFACES" | grep -c "\$INTERFACE"\` )) ); then
  2343.       iptables -t filter -A INPUT -m state --state NEW -i \$INTERFACE -s \$NETWORK -j ACCEPT
  2344.     fi
  2345.     if [ "\$INTERNAL_DHCP" == "yes" ]; then
  2346.       if !(( \`echo "\$TAB" | grep -c "\$INTERFACE"\` )); then
  2347.     iptables -t filter -A INPUT -m state --state NEW -i \$INTERFACE -p udp --dport 67 -j ACCEPT
  2348.       fi
  2349.       TAB="\$TAB \$INTERFACE"
  2350.     fi
  2351.     if [ -z "\$DMZ_INTERFACES" ] || !(( \`echo "\$DMZ_INTERFACES" | grep -c "\$INTERFACE"\` )); then
  2352.       for NETWORK in \$ADDITIONAL_ROUTED_NETWORKS; do
  2353.     iptables -t filter -A OUTPUT -o \$INTERFACE -d \$NETWORK -p icmp -j ACCEPT
  2354.     if [ "\$SHARED_INTERNAL" == "yes" ]; then
  2355.       iptables -t filter -A FORWARD -m state --state NEW -i \$INTERFACE -s \$NETWORK -j ACCEPT
  2356.     else
  2357.       for DEST in \$EXTERNAL_INTERFACES \$DMZ_INTERFACES; do
  2358.         if !(( \`echo "\$DEST" | grep -c ":"\` )); then
  2359.           iptables -t filter -A FORWARD -m state --state NEW -i \$INTERFACE -s \$NETWORK -o \$DEST -j ACCEPT
  2360.         fi
  2361.       done
  2362.     fi
  2363.     if [ "\$TRUST_ROUTED_NETWORKS" == "yes" ]; then
  2364.       iptables -t filter -A INPUT -m state --state NEW -i \$INTERFACE -s \$NETWORK -j ACCEPT
  2365.     fi
  2366.       done
  2367.     fi
  2368.   done
  2369.   for INTERFACE in \$DYNAMIC_INTERNAL_INTERFACES; do
  2370.     iptables -t filter -A OUTPUT -o \$INTERFACE -p icmp -j ACCEPT
  2371.     iptables -t filter -A FORWARD -m state --state NEW -i \$INTERFACE -j ACCEPT
  2372.     if [ "\$TRUST_ROUTED_NETWORKS" == "yes" ]; then
  2373.       iptables -t filter -A INPUT -m state --state NEW -i \$INTERFACE -j ACCEPT
  2374.     fi
  2375.   done
  2376. fi
  2377.  
  2378. # ICMP DNAT information leak workaround.
  2379.  
  2380. iptables -t filter -A OUTPUT -p icmp -m state --state INVALID -j DROP
  2381.  
  2382. # Set up static address translations.
  2383.  
  2384. if [ "\$IS_ROUTER" == "yes" ]; then
  2385.   for FORWARD in \$STATIC_INSIDE_OUTSIDE; do
  2386.     INSIDE=\`echo "\$FORWARD:" | cut -d: -f1\` 
  2387.     OUTSIDE=\`echo "\$FORWARD:" | cut -d: -f2\` 
  2388.     iptables -t nat -A POSTROUTING -s \$INSIDE -j SNAT --to-source \$OUTSIDE
  2389.     if !(( \`echo "\$INSIDE" | grep -c "/"\` )); then
  2390.       for ITEM in \$ALLOW_INBOUND; do
  2391.     NETWORK="-s \`echo "\$ITEM" | cut -d: -f1\`"    # Source
  2392.     if [ "\$NETWORK" == "-s any" ]; then
  2393.       NETWORK=""
  2394.     fi
  2395.     NET=\`echo "\$ITEM" | cut -d: -f2\`        # Destination
  2396.     PORTS=\`echo "\$ITEM" | cut -d: -f3\`
  2397.     if [ -n "\$PORTS" ]; then
  2398.       PORT="--dport \`echo "\$PORTS/" | cut -d/ -f1 | cut -d- -f1,2 --output-delimiter=":"\`"
  2399.       PROTOCOL=\`echo "\$PORTS/" | cut -d/ -f2\`
  2400.     fi
  2401.     if [ "\$NET" != "any" ]; then    # If there is a specific destination --
  2402.       NET1="\$INSIDE"        # Determine if this is part of it.
  2403.       xbits
  2404.       MASK=\`echo "\$NET/" | cut -d/ -f2\`
  2405.       if [ -z "\$MASK" ]; then
  2406.         MASK=32
  2407.       fi
  2408.     fi
  2409.     if [ "\$NET" == "any" ] || [ "\$XBITS" -ge "\$MASK" ]; then
  2410.       if [ "\$RFC_1122_COMPLIANT" == "yes" ]; then
  2411.         iptables -t nat -A PREROUTING \$NETWORK -d \$OUTSIDE \\
  2412.         -p icmp --icmp-type echo-request -j DNAT --to-destination \$INSIDE
  2413.       fi
  2414.       if [ "\$PORTS" == "any" ]; then
  2415.         iptables -t nat -A PREROUTING \$NETWORK -d \$OUTSIDE -p tcp -j DNAT --to-destination \$INSIDE
  2416.         iptables -t nat -A PREROUTING \$NETWORK -d \$OUTSIDE -p udp -j DNAT --to-destination \$INSIDE
  2417.       else
  2418.         if [ "\$PROTOCOL" == "tcp" ] || [ "\$PROTOCOL" == "udp" ]; then
  2419.           iptables -t nat -A PREROUTING \$NETWORK -d \$OUTSIDE -p \$PROTOCOL \$PORT -j DNAT --to-destination \$INSIDE
  2420.         else
  2421.           iptables -t nat -A PREROUTING \$NETWORK -d \$OUTSIDE -p tcp \$PORT -j DNAT --to-destination \$INSIDE
  2422.           iptables -t nat -A PREROUTING \$NETWORK -d \$OUTSIDE -p udp \$PORT -j DNAT --to-destination \$INSIDE
  2423.         fi
  2424.       fi
  2425.     fi
  2426.       done
  2427.       for NETWORK in \$PERMIT; do
  2428.     iptables -t nat -A PREROUTING -s \$NETWORK -d \$OUTSIDE -j DNAT --to-destination \$INSIDE
  2429.       done
  2430.       COUNT="0"
  2431.       NET1="\$INSIDE"
  2432.       for INTERFACE in \$STATIC_INTERNAL_INTERFACES; do
  2433.     COUNT=\$((COUNT + 1))
  2434.     NET=\`echo \$INTERNAL_NETWORKS | cut -d\\  -f\$COUNT\`
  2435.     INTERFACE=\`echo \$INTERFACE | cut -d: -f1\`
  2436.     iptables -t nat -A PREROUTING -s \$NET -d \$OUTSIDE -j DNAT --to-destination \$INSIDE
  2437.     xbits
  2438.     MASK=\`echo "\$NET/" | cut -d/ -f2\`
  2439.     if [ -z "\$MASK" ]; then
  2440.       MASK=32
  2441.     fi
  2442.     ADDRESS=\`echo \$INTERNAL_ADDRESSES | cut -d\\  -f\$COUNT\`
  2443.     if [ "\$XBITS" -ge "\$MASK" ]; then
  2444.       iptables -t nat -A POSTROUTING -s \$NET -o \$INTERFACE -d \$INSIDE -j SNAT --to-source \$ADDRESS
  2445.     fi
  2446.     for NET in \$ADDITIONAL_ROUTED_NETWORKS; do
  2447.       xbits
  2448.       if [ "\$XBITS" -ge "\$MASK" ]; then
  2449.         iptables -t nat -A POSTROUTING -s \$NET -o \$INTERFACE -d \$INSIDE -j SNAT --to-source \$ADDRESS
  2450.       fi
  2451.       iptables -t nat -A PREROUTING -s \$NET -d \$OUTSIDE -j DNAT --to-destination \$INSIDE
  2452.     done
  2453.       done
  2454.       for INTERFACE in \$DYNAMIC_INTERNAL_INTERFACES; do
  2455.     iptables -t nat -A PREROUTING -s \$NETWORK -d \$OUTSIDE -j DNAT --to-destination \$INSIDE
  2456.       done
  2457.     fi
  2458.     # Lets not have people mistaking the router for the internal host.
  2459.     iptables -t filter -I INPUT -d \$OUTSIDE -j DROP
  2460.   done
  2461. fi
  2462.  
  2463. # Configure NAT.
  2464.  
  2465. if [ "\$IS_ROUTER" == "yes" ]; then
  2466.   COUNT="0"
  2467.   for INTERFACE in \$STATIC_NAT_INTERFACES; do
  2468.     COUNT=\$((COUNT + 1))
  2469.     ADDRESS=\`echo "\$NAT_ADDRESSES" | cut -d\\  -f\$COUNT\`
  2470.     if [ -n "\$DYNAMIC_INTERNAL_INTERFACES" ]; then
  2471.       iptables -t nat -A POSTROUTING -o \$INTERFACE -j SNAT --to-source \$ADDRESS
  2472.     else
  2473.       for NETWORK in \$NAT_NETWORKS \$ADDITIONAL_ROUTED_NETWORKS; do
  2474.     iptables -t nat -A POSTROUTING -s \$NETWORK -o \$INTERFACE -j SNAT --to-source \$ADDRESS
  2475.       done
  2476.     fi
  2477.   done
  2478.   for INTERFACE in \$DYNAMIC_NAT_INTERFACES; do
  2479.     if [ -n "\$DYNAMIC_INTERNAL_INTERFACES" ]; then
  2480.       iptables -t nat -I POSTROUTING -o \$INTERFACE -j MASQUERADE
  2481.     else
  2482.       for NETWORK in \$NAT_NETWORKS \$ADDITIONAL_ROUTED_NETWORKS; do
  2483.     iptables -t nat -I POSTROUTING -s \$NETWORK -o \$INTERFACE -j MASQUERADE
  2484.       done
  2485.     fi
  2486.   done
  2487. fi
  2488.  
  2489. echo -n "."
  2490.  
  2491. # Configure port forwarding.
  2492.  
  2493. for FORWARD in \$PORT_FORWARDS; do
  2494.   PROTOCOL=\`echo "\$FORWARD" | cut -d: -f1\`
  2495.   IN_PORTS=\`echo "\$FORWARD" | cut -d: -f2 | cut -d- -f1,2 --output-delimiter=":"\`
  2496.   DEST=\`echo "\$FORWARD" | cut -d: -f3\`
  2497.   PORTS=\`echo "\$FORWARD" | cut -d: -f4\`
  2498.   if [ -z "\$PORTS" ]; then
  2499.     PORTS="\$IN_PORTS"
  2500.   fi
  2501.   DPORTS=\`echo "\$PORTS" | cut -d- -f1,2 --output-delimiter=":"\`
  2502.   # Support DNAT for locally generated connections, new in iptables 1.2.6a and kernel 2.4.19 
  2503.   iptables -t nat -A OUTPUT -o lo -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS > /dev/null 2>&1
  2504.   COUNT="0"
  2505.   while (( \`echo "\${INTERFACE_TAB[\$((COUNT + 1))]}" | grep -c "."\` )); do
  2506.     COUNT=\$((COUNT + 1))
  2507.     if (( \`echo "\$DYNAMIC_INTERFACES" | grep -c "\${INTERFACE_TAB[\$COUNT]}"\` )); then
  2508.       iptables -t nat -I POSTROUTING -m mark --mark "\$COUNT" -o \${INTERFACE_TAB[\$COUNT]} -d \$DEST \\
  2509.            -p \$PROTOCOL --dport \$DPORTS -j MASQUERADE
  2510.     else
  2511.       iptables -t nat -I POSTROUTING -m mark --mark "\$COUNT" -o \${INTERFACE_TAB[\$COUNT]} -d \$DEST \\
  2512.            -p \$PROTOCOL --dport \$DPORTS -j SNAT --to-source \${ADDRESS_TAB[\$COUNT]}
  2513.     fi
  2514.     if (( \`echo "\$DYNAMIC_INTERNAL_INTERFACES" | grep -c "\${INTERFACE_TAB[\$COUNT]}"\` )) && \\
  2515.        [ "\$PORT_FWD_ROUTED_NETWORKS" == "yes" ]; then
  2516.       iptables -t nat -A PREROUTING -i \${INTERFACE_TAB[\$COUNT]} \\
  2517.            -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2518.       iptables -t mangle -A PREROUTING -i \${INTERFACE_TAB[\$COUNT]} \\
  2519.            -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2520.       continue    # We will accept anything on this interface.
  2521.     fi
  2522.     for ADDRESS in \$PORT_FORWARD_ADDRESSES; do
  2523.       for ITEM in \$OPEN_PORTS \$TRUSTED_PORTS; do
  2524.     if (( \`echo "\$ITEM:" | cut -d: -f2 | grep -c "."\` )); then
  2525.       NET="-s \`echo "\$ITEM:" | cut -d: -f1\`"
  2526.       ITEM=\`echo "\$ITEM:" | cut -d: -f2\`
  2527.     else
  2528.       NET=""
  2529.     fi
  2530.     PORT=\`echo "\$ITEM/" | cut -d/ -f1\`
  2531.     PORT=\`echo "\$PORT" | cut -d- -f1,2 --output-delimiter=":"\`
  2532.     if [ "\$PROTOCOL" == "\`echo "\$ITEM/" | cut -d/ -f2\`" ] && [ "\$PORT" == "\$IN_PORTS" ]; then
  2533.       if (( \`echo "\$DYNAMIC_NAT_INTERFACES" | grep -c "\${INTERFACE_TAB[\$COUNT]}"\` )); then
  2534.         iptables -t nat -A PREROUTING \$NET -i \${INTERFACE_TAB[\$COUNT]} \\
  2535.              -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2536.         iptables -t mangle -A PREROUTING \$NET -i \${INTERFACE_TAB[\$COUNT]} \\
  2537.              -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2538.       else
  2539.         iptables -t nat -A PREROUTING \$NET -d \$ADDRESS -i \${INTERFACE_TAB[\$COUNT]} \\
  2540.              -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2541.         iptables -t mangle -A PREROUTING \$NET -d \$ADDRESS -i \${INTERFACE_TAB[\$COUNT]} \\
  2542.              -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2543.       fi
  2544.       if [ -z "\$NET" ]; then
  2545.         continue 2    # This port forward is open to everyone.
  2546.       fi
  2547.     fi
  2548.       done
  2549.       for NETWORK in \${NETWORK_TAB[\$COUNT]}; do
  2550.     if (( \`echo "\$DYNAMIC_NAT_INTERFACES" | grep -c "\${INTERFACE_TAB[\$COUNT]}"\` )); then
  2551.       iptables -t nat -A PREROUTING -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2552.             -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2553.       iptables -t mangle -A PREROUTING -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2554.            -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2555.     else
  2556.       iptables -t nat -A PREROUTING -d \$ADDRESS -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2557.             -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2558.       iptables -t mangle -A PREROUTING -d \$ADDRESS -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2559.            -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2560.     fi
  2561.       done
  2562.       for NETWORK in \$PERMIT; do
  2563.     if (( \`echo "\$DYNAMIC_NAT_INTERFACES" | grep -c "\${INTERFACE_TAB[\$COUNT]}"\` )); then
  2564.       iptables -t nat -A PREROUTING -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2565.            -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2566.       iptables -t mangle -A PREROUTING -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2567.            -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2568.     else
  2569.       iptables -t nat -A PREROUTING -d \$ADDRESS -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2570.            -p \$PROTOCOL --dport \$IN_PORTS -j DNAT --to-destination \$DEST:\$PORTS
  2571.       iptables -t mangle -A PREROUTING -d \$ADDRESS -i \${INTERFACE_TAB[\$COUNT]} -s \$NETWORK \\
  2572.            -p \$PROTOCOL --dport \$IN_PORTS -j MARK --set-mark "\$COUNT"
  2573.     fi
  2574.       done    # Done with sources
  2575.       if (( \`echo "\$DYNAMIC_NAT_INTERFACES" | grep -c "\${INTERFACE_TAB[\$COUNT]}"\` )); then
  2576.     break
  2577.       fi
  2578.     done    # Done with destination addresses
  2579.   done        # Done with interfaces
  2580. done        # Done with forwards
  2581.  
  2582. # Source nat outbound connections generated by the local machine to address defined in FIREWALL_IP.
  2583.  
  2584. for ADDRESS in \$FIREWALL_IP; do
  2585.   OUTSIDE=\`echo "\$ADDRESS:" | cut -d: -f1\` 
  2586.   INSIDE=\`echo "\$ADDRESS:" | cut -d: -f2\` 
  2587.   iptables -t nat -A POSTROUTING -s \$OUTSIDE -j SNAT --to-source \$INSIDE
  2588. done
  2589.  
  2590. # Accept new connections from the loopback interface (localhost).
  2591.  
  2592. iptables -t filter -A INPUT -i lo -m state --state NEW -j ACCEPT
  2593.  
  2594. # Jump to the trusted chain if this packet establishes a NEW connection.
  2595.  
  2596. iptables -t filter -A INPUT -m state --state NEW -j TRUSTED
  2597. if [ "\$IS_ROUTER" == "yes" ]; then
  2598.   iptables -t filter -A FORWARD -m state --state NEW -j TRUSTED
  2599. fi
  2600.  
  2601. # Enable TTL stealth router mode.
  2602.  
  2603. if [ "\$TTL_STEALTH_ROUTER" == "yes" ]; then
  2604.   iptables -t mangle -I FORWARD -j TTL --ttl-inc "1"
  2605. fi
  2606.  
  2607. # Now that everything is configured we can enable ip_forward for routers.
  2608.  
  2609. if [ "\$IS_ROUTER" == "yes" ]; then
  2610.   echo "1" > /proc/sys/net/ipv4/ip_forward 
  2611. fi
  2612.  
  2613. # Print exit message.
  2614.  
  2615. echo " [ DONE ]"
  2616. if [ -n "\$EXTERNAL_ADDRESSES" ]; then
  2617.   echo "-> Successfully secured the following addresses: \`echo \$EXTERNAL_ADDRESSES | sed s/\\ /,\\ /g\`."
  2618. fi
  2619. if [ "\$IS_ROUTER" == "yes" ]; then
  2620.   if [ -n "\$DYNAMIC_EXTERNAL_INTERFACES" ]; then
  2621.     echo "-> Successfully secured the following external interfaces: \`echo \$DYNAMIC_EXTERNAL_INTERFACES | sed s/\\ /,\\ /g\`."
  2622.   fi
  2623.   if [ -n "\$INTERNAL_NETWORKS" ] || [ -n "\$ADDITIONAL_ROUTED_NETWORKS" ]; then
  2624.     echo "-> Routing is enabled for the following networks: \`echo \$INTERNAL_NETWORKS \$ADDITIONAL_ROUTED_NETWORKS | \\
  2625.     sed s/\\ /,\\ /g\`."
  2626.   fi
  2627.   if [ -n "\$DYNAMIC_INTERNAL_INTERFACES" ]; then
  2628.     echo "-> Alert!  Routing is enabled for ALL connections through: \`echo \$DYNAMIC_INTERNAL_INTERFACES \\
  2629.     | sed s/\\ /,\\ /g\`."
  2630.   fi
  2631. fi
  2632.  
  2633. # Write a configuration file if passed appropriate arguments.
  2634.  
  2635. if [ "\$1" == "save" ] || [ "\$1" == "update" ]; then
  2636.   if [ -a "\$CONFIG" ]; then
  2637.     if !(( \`head -1 "\$CONFIG" | grep -c "# Linux Firewall configuration -- http://projectfiles.com/firewall/"\` )); then
  2638.       echo "-> WARNING: The file \$CONFIG is associated with another program!"
  2639.       echo "->          Press any key to overwrite, or CTRL-C to abort."
  2640.       read -rsn1
  2641.     fi
  2642.   fi
  2643. cat << EOF > \$CONFIG
  2644. # Linux Firewall configuration -- http://projectfiles.com/firewall/
  2645. # Generated by '\`echo \$0 | sed s#^\\./#\$PWD/#\` \$1 \`echo \$2 | sed s#^\\./#\$PWD/#\`'
  2646. # on \`date\`.
  2647. # Generated with version: "\$VERSION".
  2648.  
  2649. PERMIT="\$ORIG_PERMIT"
  2650. INTERNAL_INTERFACES="\$ORIG_INTERNAL_INTERFACES"
  2651. DYNAMIC_INTERFACES="\$ORIG_DYNAMIC_INTERFACES"
  2652. DENY_OUTBOUND="\$ORIG_DENY_OUTBOUND"
  2653. ALLOW_INBOUND="\$ORIG_ALLOW_INBOUND"
  2654. BLACKLIST="\$BLACKLIST"
  2655. STATIC_INSIDE_OUTSIDE="\$ORIG_STATIC_INSIDE_OUTSIDE"
  2656. PORT_FORWARDS="\$ORIG_PORT_FORWARDS"
  2657. PORT_FWD_ALL="\$PORT_FWD_ALL"
  2658. PORT_FWD_ROUTED_NETWORKS="\$PORT_FWD_ROUTED_NETWORKS"
  2659. ADDITIONAL_ROUTED_NETWORKS="\$ADDITIONAL_ROUTED_NETWORKS"
  2660. TRUST_ROUTED_NETWORKS="\$TRUST_ROUTED_NETWORKS"
  2661. SHARED_INTERNAL="\$SHARED_INTERNAL"
  2662. FIREWALL_IP="\$FIREWALL_IP"
  2663. TRUST_LOCAL_EXTERNAL_NETWORKS="\$TRUST_LOCAL_EXTERNAL_NETWORKS"
  2664. DMZ_INTERFACES="\$DMZ_INTERFACES"
  2665. NAT_EXTERNAL="\$NAT_EXTERNAL"
  2666. ADDITIONAL_NAT_INTERFACES="\$ADDITIONAL_NAT_INTERFACES"
  2667. IGNORE_INTERFACES="\$IGNORE_INTERFACES"
  2668. LOGGING="\$LOGGING"
  2669. NO_RP_FILTER_INTERFACES="\$NO_RP_FILTER_INTERFACES"
  2670. INTERNAL_DHCP="\$INTERNAL_DHCP"
  2671. RFC_1122_COMPLIANT="\$RFC_1122_COMPLIANT"
  2672. DROP_NEW_WITHOUT_SYN="\$DROP_NEW_WITHOUT_SYN"
  2673. DUMP_TCP_ON_INIT="\$DUMP_TCP_ON_INIT"
  2674. TTL_STEALTH_ROUTER="\$TTL_STEALTH_ROUTER"
  2675. LOG_LIMIT="\$LOG_LIMIT"
  2676. LOG_BURST="\$LOG_BURST"
  2677. LOG_LEVEL="\$LOG_LEVEL"
  2678.  
  2679. return
  2680.  
  2681.  
  2682.  
  2683. EOF
  2684.   iptables-save >> \$CONFIG
  2685.   chown root:root \$CONFIG
  2686.   chmod 600 \$CONFIG
  2687.   echo "-> Firewall configuration saved to \$CONFIG"
  2688. fi
  2689.  
  2690. # Dump current TCP sessions if requested.
  2691.  
  2692. if [ "\$DUMP_TCP_ON_INIT" == "yes" ]; then
  2693.   dump_tcp
  2694. fi
  2695.  
  2696. # Done!
  2697. FIREWALL_END_OF_FILE
  2698.   
  2699.   chmod $FW_PERM $FW_TMPFILE
  2700.   status="test"
  2701.   ;;
  2702.  
  2703.   *)
  2704.     goodbye
  2705.   esac
  2706. done
  2707.  
  2708. goodbye
  2709.