home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / IPCHAINS-HOWTO < prev    next >
Text File  |  1999-06-05  |  113KB  |  3,631 lines

  1.   Linux IPCHAINS-HOWTO
  2.   Paul Russell, ipchains@rustcorp.com
  3.   v1.0.7, 12 March 1999
  4.  
  5.   This document aims to describe how to obtain, install and configure
  6.   the enhanced IP firewalling chains software for Linux, and some ideas
  7.   on how you might use them.
  8.   ______________________________________________________________________
  9.  
  10.   Table of Contents
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.   1. Introduction
  68.  
  69.      1.1 What?
  70.      1.2 Why?
  71.      1.3 How?
  72.      1.4 Where?
  73.  
  74.   2. Packet Filtering Basics
  75.  
  76.      2.1 What?
  77.      2.2 Why?
  78.      2.3 How?
  79.         2.3.1 A Kernel With Packet Filtering
  80.         2.3.2 ipchains
  81.         2.3.3 Making Rules Permanent
  82.  
  83.   3. I'm confused!  Routing, masquerading, portforwarding, ipautofw...
  84.  
  85.      3.1 Rusty's Three-Line Guide To Masquerading
  86.      3.2 Gratuitous Promotion: WatchGuard Rules
  87.      3.3 Common Firewall-like Setups
  88.         3.3.1 Private Network: Traditional Proxies
  89.         3.3.2 Private Network: Transparent Proxies
  90.         3.3.3 Private Network: Masquerading
  91.         3.3.4 Public Network
  92.         3.3.5 Limited Internal Services
  93.      3.4 More Information on Masquerading David Ranch has written an excellent new HOWTO on Masquerading, which has a large amount of overlap with this HOWTO.  You can currently find that HOWTO at
  94.  
  95.   4. IP Firewalling Chains
  96.  
  97.      4.1 How Packets Traverse The Filters
  98.         4.1.1 Using ipchains
  99.         4.1.2 Operations on a Single Rule
  100.         4.1.3 Filtering Specifications
  101.            4.1.3.1 Specifying Source and Destination IP Addresses
  102.            4.1.3.2 Specifying Inversion
  103.            4.1.3.3 Specifying Protocol
  104.               4.1.3.3.1 Specifying UDP and TCP Ports
  105.               4.1.3.3.2 Specifying ICMP Type and Code
  106.            4.1.3.4 Specifying an Interface
  107.            4.1.3.5 Specifying TCP SYN Packets Only
  108.            4.1.3.6 Handling Fragments
  109.         4.1.4 Filtering Side Effects
  110.            4.1.4.1 Specifying a Target
  111.            4.1.4.2 Logging Packets
  112.            4.1.4.3 Manipulating the Type Of Service
  113.            4.1.4.4 Marking a Packet
  114.            4.1.4.5 Operations on an Entire Chain
  115.            4.1.4.6 Creating a New Chain
  116.            4.1.4.7 Deleting a Chain
  117.            4.1.4.8 Flushing a Chain
  118.            4.1.4.9 Listing a Chain
  119.            4.1.4.10 Resetting (Zeroing) Counters
  120.            4.1.4.11 Setting Policy
  121.         4.1.5 Operations on Masquerading
  122.         4.1.6 Checking a Packet
  123.         4.1.7 Multiple Rules at Once and Watching What Happens
  124.      4.2 Useful Examples
  125.         4.2.1 Using ipchains-save
  126.         4.2.2 Using ipchains-restore
  127.  
  128.   5. Miscellaneous.
  129.  
  130.      5.1 How to Organize Your Firewall Rules
  131.      5.2 What Not To Filter Out
  132.         5.2.1 ICMP packets
  133.         5.2.2 TCP Connections to DNS (nameservers)
  134.         5.2.3 FTP Nightmares
  135.      5.3 Filtering out Ping of Death
  136.      5.4 Filtering out Teardrop and Bonk
  137.      5.5 Filtering out Fragment Bombs
  138.      5.6 Changing Firewall Rules
  139.      5.7 How Do I Set Up IP Spoof Protection?
  140.      5.8 Advanced Projects
  141.         5.8.1 SPF: Stateful Packet Filtering
  142.         5.8.2 Michael Hasenstein's ftp-data hack
  143.      5.9 Future Enhancements
  144.  
  145.   6. Common Problems
  146.  
  147.      6.1 ipchains -L Freezes!
  148.      6.2 Masquerading/Forwarding Doesn't Work!
  149.      6.3 -j REDIR doesn't work!
  150.      6.4 Wildcard Interfaces Don't Work!
  151.      6.5 TOS Doesn't Work!
  152.      6.6 ipautofw and ipportfw Don't Work!
  153.      6.7 xosview is Broken!
  154.      6.8 Segmentation Fault With `-j REDIRECT'!
  155.      6.9 I Can't Set Masquerading Timeouts!
  156.      6.10 I Want to Firewall IPX!
  157.  
  158.   7. A Serious Example.
  159.  
  160.      7.1 The Arrangement
  161.      7.2 Goals
  162.      7.3 Before Packet Filtering
  163.      7.4 Packet Filtering for Through Packets
  164.         7.4.1 Set Up Jumps From forward Chain
  165.         7.4.2 Define the icmp-acc Chain
  166.         7.4.3 Good (Internal) to DMZ (Servers)
  167.         7.4.4 Bad (external) to DMZ (servers).
  168.         7.4.5 Good (internal) to Bad (external).
  169.         7.4.6 DMZ to Good (internal).
  170.         7.4.7 DMZ to bad (external).
  171.         7.4.8 Bad (external) to Good (internal).
  172.         7.4.9 Packet Filtering for the Linux Box Itself
  173.            7.4.9.1 Bad (external) interface.
  174.            7.4.9.2 DMZ interface.
  175.            7.4.9.3 Good (internal) interface.
  176.      7.5 Finally
  177.  
  178.   8. Appendix: Differences between ipchains and ipfwadm.
  179.  
  180.      8.1 Quick-Reference table.
  181.      8.2 Examples of translated ipfwadm commands
  182.  
  183.   9. Appendix: Using the ipfwadm-wrapper script.
  184.  
  185.   10. Appendix: Thanks.
  186.  
  187.  
  188.  
  189.   ______________________________________________________________________
  190.  
  191.   1.  Introduction
  192.  
  193.   This is the Linux IPCHAINS-HOWTO; see ``Where?''  for the master site,
  194.   which contains the latest copy.  You should read the Linux NET-3-HOWTO
  195.   as well.  The IP-Masquerading HOWTO, the PPP-HOWTO, the Ethernet-HOWTO
  196.   and the Firewall HOWTO might make interesting reading.  (Then again,
  197.   so might the alt.fan.bigfoot FAQ).
  198.  
  199.   If packet filtering is passe to you, read Section ``Why?'', Section
  200.   ``How?'', and scan through the titles in Section ``IP Firewalling
  201.   Chains''.
  202.  
  203.  
  204.   If you are converting from ipfwadm, read Section ``Introduction'',
  205.   Section ``How?'', and Appendices in section ``Differences between
  206.   ipchains and ipfwadm'' and section ``Using the `ipfwadm-wrapper'
  207.   script''.
  208.  
  209.  
  210.   1.1.  What?
  211.  
  212.   Linux ipchains is a rewrite of the Linux IPv4 firewalling code (which
  213.   was mainly stolen from BSD) and a rewrite of ipfwadm, which was a
  214.   rewrite of BSD's ipfw, I believe.  It is required to administer the IP
  215.   packet filters in Linux kernel versions 2.1.102 and above.
  216.  
  217.  
  218.   1.2.  Why?
  219.  
  220.   The older Linux firewalling code doesn't deal with fragments, has
  221.   32-bit counters (on Intel at least), doesn't allow specification of
  222.   protocols other than TCP, UDP or ICMP, can't make large changes
  223.   atomically, can't specify inverse rules, has some quirks, and can be
  224.   tough to manage (making it prone to user error).
  225.  
  226.  
  227.   1.3.  How?
  228.  
  229.   Currently the code is in the mainstream kernel from 2.1.102.  For the
  230.   2.0 kernel series, you will need to download a kernel patch from the
  231.   web page.  If your 2.0 kernel is more recent than the supplied patch,
  232.   the older patch should be OK; this part of the 2.0 kernels is fairly
  233.   stable (eg. the 2.0.34 kernel patch works just fine on the 2.0.35
  234.   kernel).  Since the 2.0 patch is incompatible with the ipportfw and
  235.   ipautofw patches, I don't recommend applying it unless you really need
  236.   some functionality that ipchains offers.
  237.  
  238.  
  239.   1.4.  Where?
  240.  
  241.   The official page is The Linux IP Firewall Chains Page
  242.   <http://www.rustcorp.com/linux/ipchains>
  243.  
  244.  
  245.   There is a mailing list for bug reports, discussion, development and
  246.   usage.  Join the mailing list by sending a message containing the word
  247.   ``subscribe'' to ipchains-request at rustcorp.com.  To mail to the
  248.   list use `ipchains' instead of `ipchains-request'.
  249.  
  250.  
  251.   2.  Packet Filtering Basics
  252.  
  253.   2.1.  What?
  254.  
  255.   All traffic through a network is sent in the form of packets.  For
  256.   example, downloading this package (say it's 50k long) might cause you
  257.   to receive 36 or so packets of 1460 bytes each, (to pull numbers at
  258.   random).
  259.  
  260.  
  261.   The start of each packet says where it's going, where it came from,
  262.   the type of the packet, and other administrative details.  This start
  263.   of the packet is called the header.  The rest of the packet,
  264.   containing the actual data being transmitted, is usually called the
  265.   body.
  266.  
  267.  
  268.   Some protocols, such TCP, which is used for web traffic, mail, and
  269.   remote logins, use the concept of a `connection' -- before any packets
  270.   with actual data are sent, various setup packets (with special
  271.   headers) are exchanged saying `I want to connect', `OK' and `Thanks'.
  272.   Then normal packets are exchanged.
  273.  
  274.  
  275.   A packet filter is a piece of software which looks at the header of
  276.   packets as they pass through, and decides the fate of the entire
  277.   packet.  It might decide to deny the packet (ie. discard the packet as
  278.   if it had never received it), accept the packet (ie. let the packet go
  279.   through), or reject the packet (like deny, but tell the source of the
  280.   packet that it has done so).
  281.  
  282.  
  283.   Under Linux, packet filtering is built into the kernel, and there are
  284.   a few trickier things we can do with packets, but the general
  285.   principle of looking at the headers and deciding the fate of the
  286.   packet is still there.
  287.  
  288.  
  289.   2.2.  Why?
  290.  
  291.   Control.  Security.  Watchfulness.
  292.  
  293.  
  294.  
  295.      Control:
  296.         when you are using a Linux box to connect your internal network
  297.         to another network (say, the Internet) you have an opportunity
  298.         to allow certain types of traffic, and disallow others.  For
  299.         example, the header of a packet contains the destination address
  300.         of the packet, so you can prevent packets going to a certain
  301.         part of the outside network.  As another example, I use Netscape
  302.         to access the Dilbert archives.  There are advertisements from
  303.         doubleclick.net on the page, and Netscape wastes my time by
  304.         cheerfully downloading them.  Telling the packet filter not to
  305.         allow any packets to or from the addresses owned by
  306.         doubleclick.net solves that problem (there are better ways of
  307.         doing this though).
  308.  
  309.  
  310.      Security:
  311.         when your Linux box is the only thing between the chaos of the
  312.         Internet and your nice, orderly network, it's nice to know you
  313.         can restrict what comes tromping in your door.  For example, you
  314.         might allow anything to go out from your network, but you might
  315.         be worried about the well-known `Ping of Death' coming in from
  316.         malicious outsiders.  As another example, you might not want
  317.         outsiders telnetting to your Linux box, even though all your
  318.         accounts have passwords; maybe you want (like most people) to be
  319.         an observer on the Internet, and not a server (willing or
  320.         otherwise) -- simply don't let anyone connect in, by having the
  321.         packet filter reject incoming packets used to set up
  322.         connections.
  323.  
  324.  
  325.      Watchfulness:
  326.         sometimes a badly configured machine on the local network will
  327.         decide to spew packets to the outside world.  It's nice to tell
  328.         the packet filter to let you know if anything abnormal occurs;
  329.         maybe you can do something about it, or maybe you're just
  330.         curious by nature.
  331.   2.3.  How?
  332.  
  333.   2.3.1.  A Kernel With Packet Filtering
  334.  
  335.   You need a kernel which has the new IP firewall chains in it.  You can
  336.   tell if the kernel you are running right now has this installed by
  337.   looking for the file `/proc/net/ip_fwchains'.  If it exists, you're
  338.   in.
  339.  
  340.  
  341.   If not, you need to make a kernel that has IP firewall chains.  First,
  342.   download the source to the kernel you want.  If you have a kernel
  343.   numbered 2.1.102 or higher, you won't need to patch it (it's in the
  344.   mainstream kernel now).  Otherwise, apply the patch from the web page
  345.   listed above, and set the configuration as detailed below.  If you
  346.   don't know how to do this, don't panic -- read the Kernel-HOWTO.
  347.  
  348.  
  349.  
  350.   The configuration options you will need to set for the 2.0-series
  351.   kernel are:
  352.  
  353.  
  354.   ______________________________________________________________________
  355.           CONFIG_EXPERIMENTAL=y
  356.           CONFIG_FIREWALL=y
  357.           CONFIG_IP_FIREWALL=y
  358.           CONFIG_IP_FIREWALL_CHAINS=y
  359.   ______________________________________________________________________
  360.  
  361.  
  362.  
  363.   For the 2.1 or 2.2 series kernels:
  364.  
  365.   ______________________________________________________________________
  366.           CONFIG_FIREWALL=y
  367.           CONFIG_IP_FIREWALL=y
  368.   ______________________________________________________________________
  369.  
  370.  
  371.  
  372.  
  373.   The tool ipchains talks to the kernel and tells it what packets to
  374.   filter.  Unless you are a programmer, or overly curious, this is how
  375.   you will control the packet filtering.
  376.  
  377.  
  378.   2.3.2.  ipchains
  379.  
  380.   The ipchains tool inserts and deletes rules from the kernel's packet
  381.   filtering section.  This means that whatever you set up, it will be
  382.   lost upon reboot; see ``Making Rules Permanent'' for how to make sure
  383.   they are restored the next time Linux is booted.
  384.  
  385.  
  386.   ipchains replaces ipfwadm, which was used for the old IP Firewall
  387.   code.  There is a set of useful scripts available from the ipchains
  388.   ftp site:
  389.  
  390.   ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz
  391.   <ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz>
  392.  
  393.  
  394.   This contains a shell script called ipfwadm-wrapper which allows you
  395.   to do packet filtering as it was done before.  You probably shouldn't
  396.   use this script unless you want a quick way of upgrading a system
  397.   which uses ipfwadm (it's slower, and doesn't check arguments, etc).
  398.   In that case, you don't need this HOWTO much either.
  399.  
  400.   See Appendix ``Differences between ipchains and ipfwadm'' and Appendix
  401.   ``Using the `ipfwadm-wrapper' script'' for more details on ipfwadm
  402.   issues.
  403.  
  404.  
  405.   2.3.3.  Making Rules Permanent
  406.  
  407.   Your current firewall setup is stored in the kernel, and thus will be
  408.   lost on reboot.  I recommend using the `ipchains-save' and `ipchains-
  409.   restore' scripts to make your rules permanent.  To do this, set up
  410.   your rules, then run (as root):
  411.  
  412.  
  413.  
  414.        # ipchains-save > /etc/ipchains.rules
  415.        #
  416.  
  417.  
  418.  
  419.  
  420.   Create a script like the following:
  421.  
  422.  
  423.  
  424.        #! /bin/sh
  425.        # Script to control packet filtering.
  426.  
  427.        # If no rules, do nothing.
  428.        [ -f /etc/ipchains.rules ] || exit 0
  429.  
  430.        case "$1" in
  431.            start)
  432.                echo -n "Turning on packet filtering:"
  433.                /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
  434.                echo 1 > /proc/sys/net/ipv4/ip_forward
  435.                echo "."
  436.                ;;
  437.            stop)
  438.                echo -n "Turning off packet filtering:"
  439.                echo 0 > /proc/sys/net/ipv4/ip_forward
  440.                /sbin/ipchains -X
  441.                /sbin/ipchains -F
  442.                /sbin/ipchains -P input ACCEPT
  443.                /sbin/ipchains -P output ACCEPT
  444.                /sbin/ipchains -P forward ACCEPT
  445.                echo "."
  446.                ;;
  447.            *)
  448.                echo "Usage: /etc/init.d/packetfilter {start|stop}"
  449.                exit 1
  450.                ;;
  451.        esac
  452.  
  453.        exit 0
  454.  
  455.  
  456.  
  457.  
  458.   Make sure this is run early in the bootup procedure.  In my case
  459.   (Debian 2.1), I make a symbolic link called `S39packetfilter' in the
  460.   `/etc/rcS.d' directory (this will be run before S40network).
  461.  
  462.  
  463.   3.  I'm confused!  Routing, masquerading, portforwarding, ipautofw...
  464.  
  465.   This HOWTO is about packet filtering.  This means deciding whether a
  466.   packet should be allowed to pass or not.  However, Linux being the
  467.   hacker's playground that it is, you probably want to do more than
  468.   that.
  469.  
  470.  
  471.   One problem is that the same tool (``ipchains'') is used to control
  472.   both masquerading and transparent proxying, although these are
  473.   notionally separate from packet filtering (the current Linux
  474.   implementation blurs these together unnaturally, leaving the
  475.   impression that they are closely related).
  476.  
  477.  
  478.   Masquerading and proxying are covered by separate HOWTOs, and the auto
  479.   forwarding and port forwarding features are controlled by separate
  480.   tools, but since so many people keep asking me about it, I'll include
  481.   a set of common scenarios and indicate when each one should be
  482.   applied.  The security merits of each setup will not be discussed
  483.   here.
  484.  
  485.  
  486.   3.1.  Rusty's Three-Line Guide To Masquerading
  487.  
  488.   This assumes that your external interface is called `ppp0'.  Use
  489.   ifconfig to find out, and adjust to taste.
  490.  
  491.  
  492.  
  493.        # ipchains -P forward DENY
  494.        # ipchains -A forward -i ppp0 -j MASQ
  495.        # echo 1 > /proc/sys/net/ipv4/ip_forward
  496.  
  497.  
  498.  
  499.  
  500.  
  501.   3.2.  Gratuitous Promotion: WatchGuard Rules
  502.  
  503.   You can buy off-the-shelf firewalls.  An excellent one is WatchGuard's
  504.   FireBox.  It's excellent because I like it, it's secure, it's Linux-
  505.   based, and because they are funding the maintenance of ipchains as
  506.   well as the new firewalling code (aimed for 2.3).  In short,
  507.   WatchGuard are paying for me to eat while I work for you.  So please
  508.   consider their stuff.
  509.  
  510.   http://www.watchguard.com <http://www.watchguard.com>
  511.  
  512.  
  513.   3.3.  Common Firewall-like Setups
  514.  
  515.   You run littlecorp.com.  You have an internal network, and a single
  516.   dialup (PPP) connection to the Internet (firewall.littlecorp.com which
  517.   is 1.2.3.4).  You run Ethernet on your local network, and your
  518.   personal machine is called "myhost".
  519.  
  520.  
  521.   This section will illustrate the different arrangement which are
  522.   common.  Read carefully, because they are each subtly different.
  523.  
  524.  
  525.   3.3.1.  Private Network: Traditional Proxies
  526.  
  527.   In this scenario, packets from the private network never traverse the
  528.   Internet, and vice versa.  The IP addresses of the private network
  529.   should be assigned from the RFC1597 Private Network Allocations (ie.
  530.   10.*.*.*, 172.16.*.* or 192.168.*.*).
  531.  
  532.  
  533.   The only way things ever connect to the Internet is by connecting to
  534.   the firewall, which is the only machine on both networks which
  535.   connects onwards.  You run a program (on the firewall) called a proxy
  536.   to do this (there are proxies for FTP, web access, telnet, RealAudio,
  537.   Usenet News and other services).  See the Firewall HOWTO.
  538.  
  539.  
  540.   Any services you wish the Internet to access must be on the firewall.
  541.   (But see ``Limited Internal Services'' below).
  542.  
  543.  
  544.   Example: Allowing web access from private network to the Internet.
  545.  
  546.   1. The private network is assigned 192.168.1.* addresses, with myhost
  547.      being 192.168.1.100, and the firewall's Ethernet interface being
  548.      assigned 192.168.1.1.
  549.  
  550.   2. A web proxy (eg. "squid") is installed and configured on the
  551.      firewall, say running on port 8080.
  552.  
  553.   3. Netscape on the private network is configured to use the firewall
  554.      port 8080 as a proxy.
  555.  
  556.   4. DNS does not need to be configured on the private network.
  557.  
  558.   5. DNS does need to be configured on the firewall.
  559.  
  560.   6. No default route (aka gateway) needs to be configured on the
  561.      private network.
  562.  
  563.  
  564.   Netscape on myhost reads http://slashdot.org.
  565.  
  566.   1. Netscape connects to the firewall port 8080, using port 1050 on
  567.      myhost.  It asks for the web page of "http://slashdot.org".
  568.  
  569.   2. The proxy looks up the name "slashdot.org", and gets
  570.      207.218.152.131.  It then opens a connection to that IP address
  571.      (using port 1025 on the firewall's external interface), and asks
  572.      the web server (port 80) for the web page.
  573.  
  574.   3. As it receives the web page from its connection to the web server,
  575.      it copies the data to the connection from Netscape.
  576.  
  577.   4. Netscape renders the page.
  578.  
  579.   ie.  From slashdot.org's point of view, the connection is made from
  580.   1.2.3.4 (firewall's PPP interface) port 1025 to 207.218.152.131
  581.   (slashdot.org) port 80.  From myhost's point of view, the connection
  582.   is made from 192.168.1.100 (myhost) port 1050, to 192.168.1.1
  583.   (firewall's Ethernet interface) port 8080.
  584.  
  585.  
  586.  
  587.   3.3.2.  Private Network: Transparent Proxies
  588.  
  589.   In this scenario, packets from the private network never traverse the
  590.   Internet, and vice versa.  The IP addresses of the private network
  591.   should be assigned from the RFC1597 Private Network Allocations (ie.
  592.   10.*.*.*, 172.16.*.* or 192.168.*.*).
  593.  
  594.  
  595.   The only way things ever connect to the Internet is by connecting to
  596.   the firewall, which is the only machine on both networks, which
  597.   connects onwards.  You run a program (on the firewall) called a
  598.   transparent proxy to do this; the kernel sends outgoing packets to the
  599.   transparent proxy instead of sending them onwards (ie. it bastardizes
  600.   routing).
  601.  
  602.  
  603.   Transparent proxying means that the clients don't need to know there
  604.   is a proxy involved.
  605.  
  606.  
  607.   Any services you wish the Internet to access must be on the firewall.
  608.   (But see ``Limited Internal Services'' below).
  609.  
  610.  
  611.   Example: Allowing web access from private network to the Internet.
  612.  
  613.   1. The private network is assigned 192.168.1.* addresses, with myhost
  614.      being 192.168.1.100, and the firewall's Ethernet interface being
  615.      assigned 192.168.1.1.
  616.  
  617.   2. A transparent web proxy (I believe there are patches for squid to
  618.      allow it to operate in this manner, or try "transproxy") is
  619.      installed and configured on the firewall, say running on port 8080.
  620.  
  621.   3. The kernel is told to redirect connections to port 80 to the proxy,
  622.      using ipchains.
  623.  
  624.   4. Netscape on the private network is configured to connect directly.
  625.  
  626.   5. DNS needs to be configured on the private network (ie. you need to
  627.      run a DNS server as a proxy on the firewall).
  628.  
  629.   6. The default route (aka gateway) needs to be configured on the
  630.      private network, to send packets to the firewall.
  631.  
  632.  
  633.   Netscape on myhost reads http://slashdot.org.
  634.  
  635.   1. Netscape looks up the name "slashdot.org", and gets
  636.      207.218.152.131.  It then opens a connection to that IP address,
  637.      using local port 1050, and asks the web server (port 80) for the
  638.      web page.
  639.  
  640.   2. As the packets from myhost (port 1050) to slashdot.org (port 80)
  641.      pass through the firewall, they are redirected to the waiting
  642.      transparent proxy on port 8080.  The transparent proxy opens a
  643.      connection (using local port 1025) to 207.218.152.131 port 80
  644.      (which is where the original packets were going).
  645.  
  646.   3. As the proxy receives the web page from its connection to the web
  647.      server, it copies the data to the connection from Netscape.
  648.  
  649.   4. Netscape renders the page.
  650.  
  651.   ie.  From slashdot.org's point of view, the connection is made from
  652.   1.2.3.4 (firewall's PPP interface) port 1025 to 207.218.152.131
  653.   (slashdot.org) port 80.  From myhost's point of view, the connection
  654.   is made from 192.168.1.100 (myhost) port 1050, to 207.218.152.131
  655.   (slashdot.org) port 80, but it's actually talking to the transparent
  656.   proxy.
  657.  
  658.  
  659.  
  660.  
  661.   3.3.3.  Private Network: Masquerading
  662.  
  663.   In this scenario, packets from the private network never traverse the
  664.   Internet without special treatment, and vice versa.  The IP addresses
  665.   of the private network should be assigned from the RFC1597 Private
  666.   Network Allocations (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).
  667.  
  668.  
  669.   Instead of using a proxy, we use a special kernel facility called
  670.   "masquerading".  Masquerading rewrites packets as they pass through
  671.   the firewall, so that they always seem to come from the firewall
  672.   itself.  It then rewrites the responses so that they look like they
  673.   are going to the original recipient.
  674.  
  675.  
  676.   Masquerading has separate modules to handle "tricky" protocols, such
  677.   as FTP, RealAudio, Quake, etc.  For really hard-to-handle protocols,
  678.   the "auto forwarding" facility can handle some of them by
  679.   automatically setting up port forwarding for related sets of ports:
  680.   look for ``ipportfw'' (2.0 kernels) or ``ipmasqadm'' (2.1 kernels).
  681.  
  682.  
  683.   Any services you wish the Internet to access must be on the firewall.
  684.   (But see ``Limited Internal Services'' below).
  685.  
  686.  
  687.   Example: Allowing web access from private network to the Internet.
  688.  
  689.   1. The private network is assigned 192.168.1.* addresses, with myhost
  690.      being 192.168.1.100, and the firewall's Ethernet interface being
  691.      assigned 192.168.1.1.
  692.  
  693.   2. The firewall is set up to masquerade any packets coming from the
  694.      private network and going to port 80 on an Internet host.
  695.  
  696.   3. Netscape is configured to connect directly.
  697.  
  698.   4. DNS must be configured correctly on the private network.
  699.  
  700.   5. The firewall should be the default route (aka gateway) for the
  701.      private network.
  702.  
  703.   Netscape on myhost reads http://slashdot.org.
  704.  
  705.   1. Netscape looks up the name "slashdot.org", and gets
  706.      207.218.152.131.  It then opens a connection to that IP address,
  707.      using local port 1050, and asks the web server (port 80) for the
  708.      web page.
  709.  
  710.   2. As the packets from myhost (port 1050) to slashdot.org (port 80)
  711.      pass through the firewall, they are rewritten to come from the PPP
  712.      interface of the firewall, port 65000.  The firewall has a valid
  713.      Internet address (1.2.3.4) so reply packets from www.linuxhq.com
  714.      get routed back OK.
  715.  
  716.   3. As packets from slashdot.org (port 80) to firewall.littlecorp.com
  717.      (port 65000) come in, they are rewritten to go to myhost, port
  718.      1050.  This is the real magic of masquerading: it remembers when it
  719.      rewrites outgoing packets to it can write them back as replies come
  720.      in.
  721.  
  722.   4. Netscape renders the page.
  723.  
  724.   ie.  From the slashdot.org's point of view, the connection is made
  725.   from 1.2.3.4 (firewall's PPP interface) port 65000 to 207.218.152.131
  726.   (slashdot.org) port 80.  From the myhost's point of view, the
  727.   connection is made from 192.168.1.100 (myhost) port 1050, to
  728.   207.218.152.131 (slashdot.org) port 80.
  729.  
  730.  
  731.  
  732.   3.3.4.  Public Network
  733.  
  734.   In this scenario, your personal network is a part of the Internet:
  735.   packets can flow without change across both networks.  The IP
  736.   addresses of the internal network must be assigned by applying for a
  737.   block of IP addresses, so the rest of the network will know how to get
  738.   packets to you.  This implies a permanent connection.
  739.  
  740.  
  741.   In this role, packet filtering is used to restrict which packets can
  742.   be forwarded between your network and the rest of the Internet, eg. to
  743.   restrict the rest of the Internet to only accessing your internal web
  744.   servers.
  745.  
  746.  
  747.   Example: Allowing web access from private network to the Internet.
  748.  
  749.   1. Your internal network is assigned according to the IP address block
  750.      you have registered, (say 1.2.3.*).
  751.  
  752.   2. The firewall is set up to allow all traffic.
  753.  
  754.   3. Netscape is configured to connect directly.
  755.  
  756.   4. DNS must be configured correctly on your network.
  757.  
  758.   5. The firewall should be the default route (aka gateway) for the
  759.      private network.
  760.  
  761.   Netscape on myhost reads http://slashdot.org.
  762.  
  763.   1. Netscape looks up the name "slashdot.org", and gets
  764.      207.218.152.131.  It then opens a connection to that IP address,
  765.      using local port 1050, and asks the web server (port 80) for the
  766.      web page.
  767.  
  768.   2. Packets pass through your firewall, just as they pass through
  769.      several other routers between you and slashdot.org.
  770.  
  771.   3. Netscape renders the page.
  772.  
  773.   ie.  There is only one connection: from 1.2.3.100 (myhost) port 1050,
  774.   to 207.218.152.131 (slashdot.org) port 80.
  775.  
  776.  
  777.   3.3.5.  Limited Internal Services
  778.  
  779.   There are a few tricks you can pull to allow the Internet to access
  780.   your internal services, rather than running the services on the
  781.   firewall.  These will work with either a proxy or masquerading based
  782.   approach for external connections.
  783.  
  784.  
  785.   The simplest approach is to run a "redirector", which is a poor-man's
  786.   proxy which waits for a connection on a given port, and then open a
  787.   connection a fixed internal host and port, and copies data between the
  788.   two connections.  An example of this is the "redir" program.  From the
  789.   Internet point of view, the connection is made to your firewall.  From
  790.   your internal server's point of view, the connection is made from the
  791.   internal interface of the firewall to the server.
  792.  
  793.   Another approach (which requires a 2.0 kernel patched for ipportfw, or
  794.   a 2.1 or later kernel) is to use port forwarding in the kernel.  This
  795.   does the same job as "redir" in a different way: the kernel rewrites
  796.   packets as they pass through, changing their destination address and
  797.   ports to point them at an internal host and port.  From the Internet's
  798.   point of view, the connection is made to your firewall.  From your
  799.   internal server's point of view, a direct connection is made from the
  800.   Internet host to the server.
  801.  
  802.  
  803.   3.4.  David Ranch has written an excellent new HOWTO on Masquerading,
  804.   which has a large amount of overlap with this HOWTO.  You can cur¡
  805.   rently find that HOWTO at
  806.   http://www.ecst.csuchico.edu/~dranch/LINUX/index-LINUX.html#ipmasq
  807.   More Information on Masquerading
  808.  
  809.   Soon I would expect it to be found under the auspices of the Linux
  810.   Documentation Project, at http://www.metalab.unc.edu/LDP
  811.   <http://www.metalab.unc.edu/LDP>
  812.  
  813.  
  814.   The official Masquerading home page is at
  815.  
  816.   http://ipmasq.cjb.net <http://ipmasq.cjb.net>
  817.  
  818.  
  819.  
  820.   4.  IP Firewalling Chains
  821.  
  822.   This section describes all you really need to know to build a packet
  823.   filter that meets your needs.
  824.  
  825.  
  826.   4.1.  How Packets Traverse The Filters
  827.  
  828.   The kernel starts with three lists of rules; these lists are called
  829.   firewall chains or just chains.  The three chains are called input,
  830.   output and forward.  When a packet comes in (say, through the Ethernet
  831.   card) the kernel uses the input chain to decide its fate.  If it
  832.   survives that step, then the kernel decides where to send the packet
  833.   next (this is called routing).  If it is destined for another machine,
  834.   it consults the forward chain.  Finally, just before a packet is to go
  835.   out, the kernel consults the output chain.
  836.  
  837.  
  838.   A chain is a checklist of rules.  Each rule says `if the packet header
  839.   looks like this, then here's what to do with the packet'.  If the rule
  840.   doesn't match the packet, then the next rule in the chain is
  841.   consulted.  Finally, if there are no more rules to consult, then the
  842.   kernel looks at the chain policy to decide what to do.  In a security-
  843.   conscious system, this policy usually tells the kernel to reject or
  844.   deny the packet.
  845.  
  846.  
  847.   For ASCII-art fans, this shown the complete path of a packet coming
  848.   into a machine.
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.           ----------------------------------------------------------------
  860.           |            ACCEPT/                              lo interface |
  861.           v           REDIRECT                  _______                  |
  862.   --> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
  863.       h     a    |input |    e    {Routing }   |Chain  |     |output |ACCEPT
  864.       e     n    |Chain |    m    {Decision}   |_______| --->|Chain  |
  865.       c     i    |______|    a     ~~~~~~~~        |     | ->|_______|
  866.       k     t       |        s       |             |     | |     |
  867.       s     y       |        q       |             v     | |     |
  868.       u     |       v        e       v            DENY/  | |     v
  869.       m     |     DENY/      r   Local Process   REJECT  | |   DENY/
  870.       |     v    REJECT      a       |                   | |  REJECT
  871.       |   DENY               d       --------------------- |
  872.       v                      e -----------------------------
  873.      DENY
  874.  
  875.  
  876.   Here is a blow-by-blow description of each stage:
  877.  
  878.  
  879.      Checksum:
  880.         This is a test that the packet hasn't been corrupted in some
  881.         way.  If it has, it is denied.
  882.  
  883.  
  884.      Sanity:
  885.         There is actually one of these sanity checks before each
  886.         firewall chain, but the input chain's is the most important.
  887.         Some malformed packets might confuse the rule-checking code, and
  888.         these are denied here (a message is printed to the syslog if
  889.         this happens).
  890.  
  891.  
  892.      input chain:
  893.         This is the first firewall chain against which the packet will
  894.         be tested.  If the verdict of the chain is not DENY or REJECT,
  895.         the packet continues on.
  896.  
  897.  
  898.      Demasquerade:
  899.         If the packet is a reply to a previously masqueraded packet, it
  900.         is demasqueraded, and skips straight to the output chain.  If
  901.         you don't use IP Masquerading, you can mentally erase this from
  902.         the diagram.
  903.  
  904.  
  905.      Routing decision:
  906.         The destination field is examined by the routing code, to decide
  907.         if this packet should go to a local process (see Local process
  908.         below) or forwarded to a remote machine (see forward chain
  909.         below).
  910.  
  911.  
  912.      Local process:
  913.         A process running on the machine can receive packets after the
  914.         Routing Decision step, and can send packets (which go through
  915.         the Routing Decision step, then traverse the output chain).
  916.  
  917.  
  918.      lo interface:
  919.         If packets from a local process are destined for a local
  920.         process, they will go through the output chain with interface
  921.         set to `lo', then return through the input chain with interface
  922.         also `lo'.  The lo interface is usually called the loopback
  923.         interface.
  924.  
  925.      local:
  926.         If the packet was not created by a local process, then the
  927.         forward chain is checked, otherwise the packet goes to the
  928.         output chain.
  929.  
  930.  
  931.      forward chain:
  932.         This chain is traversed for any packets which are attempting to
  933.         pass through this machine to another.
  934.  
  935.  
  936.      output chain:
  937.         This chain is traversed for all packets just before they are
  938.         sent out.
  939.  
  940.  
  941.   4.1.1.  Using ipchains
  942.  
  943.   First, check that you have the version of ipchains that this document
  944.   refers to:
  945.  
  946.  
  947.  
  948.        $ ipchains --version
  949.        ipchains 1.3.9, 17-Mar-1999
  950.  
  951.  
  952.  
  953.  
  954.  
  955.   Note that I recommend 1.3.4 (which has no long options, like
  956.   `--sport'), or 1.3.8 or above; these are very stable.
  957.  
  958.  
  959.   ipchains has a fairly detailed manual page (man ipchains), and if you
  960.   need more detail on particulars, you can check out the programming
  961.   interface (man 4 ipfw), or the file net/ipv4/ip_fw.c in the 2.1.x
  962.   kernel source, which is (obviously) authoritative.
  963.  
  964.  
  965.   There is also an excellent quick reference card by Scott Bronson in
  966.   the source package, in both A4 and US Letter PostScript(TM).
  967.  
  968.  
  969.   There are several different things you can do with ipchains.  First
  970.   the operations to manage whole chains.  You start with three built-in
  971.   chains input, output and forward which you can't delete.
  972.  
  973.  
  974.   1. Create a new chain (-N).
  975.  
  976.   2. Delete an empty chain (-X).
  977.  
  978.   3. Change the policy for a built-in chain. (-P).
  979.  
  980.   4. List the rules in a chain (-L).
  981.  
  982.   5. Flush the rules out of a chain (-F).
  983.  
  984.   6. Zero the packet and byte counters on all rules in a chain (-Z).
  985.  
  986.   There are several ways to manipulate rules inside a chain:
  987.  
  988.  
  989.   1. Append a new rule to a chain (-A).
  990.  
  991.   2. Insert a new rule at some position in a chain (-I).
  992.  
  993.   3. Replace a rule at some position in a chain (-R).
  994.  
  995.   4. Delete a rule at some position in a chain (-D).
  996.  
  997.   5. Delete the first rule that matches in a chain (-D).
  998.  
  999.   There are a few operations for masquerading, which are in ipchains for
  1000.   want of a good place to put them:
  1001.  
  1002.  
  1003.   1. List the currently masqueraded connections (-M -L).
  1004.  
  1005.   2. Set masquerading timeout values (-M -S). (But see ``I can't set
  1006.      masquerading timeouts!'').
  1007.  
  1008.   The final (and perhaps the most useful) function allows you to check
  1009.   what would happen to a given packet if it were to traverse a given
  1010.   chain.
  1011.  
  1012.  
  1013.   4.1.2.  Operations on a Single Rule
  1014.  
  1015.   This is the bread-and-butter of ipchains; manipulating rules.  Most
  1016.   commonly, you will probably use the append (-A) and delete (-D)
  1017.   commands.  The others (-I for insert and -R for replace) are simple
  1018.   extensions of these concepts.
  1019.  
  1020.  
  1021.   Each rule specifies a set of conditions the packet must meet, and what
  1022.   to do if it meets them (a `target').  For example, you might want to
  1023.   deny all ICMP packets coming from the IP address 127.0.0.1.  So in
  1024.   this case our conditions are that the protocol must be ICMP and that
  1025.   the source address must be 127.0.0.1.  Our target is `DENY'.
  1026.  
  1027.  
  1028.   127.0.0.1 is the `loopback' interface, which you will have even if you
  1029.   have no real network connection.  You can use the `ping' program to
  1030.   generate such packets (it simply sends an ICMP type 8 (echo request)
  1031.   which all cooperative hosts should obligingly respond to with an ICMP
  1032.   type 0 (echo reply) packet).  This makes it useful for testing.
  1033.  
  1034.  
  1035.  
  1036.        # ping -c 1 127.0.0.1
  1037.        PING 127.0.0.1 (127.0.0.1): 56 data bytes
  1038.        64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms
  1039.  
  1040.        --- 127.0.0.1 ping statistics ---
  1041.        1 packets transmitted, 1 packets received, 0% packet loss
  1042.        round-trip min/avg/max = 0.2/0.2/0.2 ms
  1043.        # ipchains -A input -s 127.0.0.1 -p icmp -j DENY
  1044.        # ping -c 1 127.0.0.1
  1045.        PING 127.0.0.1 (127.0.0.1): 56 data bytes
  1046.  
  1047.        --- 127.0.0.1 ping statistics ---
  1048.        1 packets transmitted, 0 packets received, 100% packet loss
  1049.        #
  1050.  
  1051.  
  1052.  
  1053.  
  1054.   You can see here that the first ping succeeds (the `-c 1' tells ping
  1055.   to only send a single packet).
  1056.  
  1057.   Then we append (-A) to the `input' chain, a rule specifying that for
  1058.   packets from 127.0.0.1 (`-s 127.0.0.1') with protocol ICMP (`-p ICMP')
  1059.   we should jump to DENY (`-j DENY').
  1060.  
  1061.  
  1062.   Then we test our rule, using the second ping.  There will be a pause
  1063.   before the program gives up waiting for a response that will never
  1064.   come.
  1065.  
  1066.  
  1067.   We can delete the rule in one of two ways.  Firstly, since we know
  1068.   that it is the only rule in the input chain, we can use a numbered
  1069.   delete, as in:
  1070.  
  1071.  
  1072.                # ipchains -D input 1
  1073.                #
  1074.  
  1075.  
  1076.  
  1077.  
  1078.   To delete rule number 1 in the input chain.
  1079.  
  1080.  
  1081.   The second way is to mirror the -A command, but replacing the -A with
  1082.   -D.  This is useful when you have a complex chain of rules and you
  1083.   don't want to have to count them to figure out that it's rule 37 that
  1084.   you want to get rid of.  In this case, we would use:
  1085.  
  1086.  
  1087.                # ipchains -D input -s 127.0.0.1 -p icmp -j DENY
  1088.                #
  1089.  
  1090.  
  1091.  
  1092.  
  1093.   The syntax of -D must have exactly the same options as the -A (or -I
  1094.   or -R) command.  If there are multiple identical rules in the same
  1095.   chain, only the first will be deleted.
  1096.  
  1097.  
  1098.   4.1.3.  Filtering Specifications
  1099.  
  1100.   We have seen the use of `-p' to specify protocol, and `-s' to specify
  1101.   source address, but there are other options we can use to specify
  1102.   packet characteristics.  What follows is an exhaustive compendium.
  1103.  
  1104.  
  1105.   4.1.3.1.  Specifying Source and Destination IP Addresses
  1106.  
  1107.   Source (-s) and destination (-d) IP addresses can be specified in four
  1108.   ways.  The most common way is to use the full name, such as
  1109.   `localhost' or `www.linuxhq.com'.  The second way is to specify the IP
  1110.   address such as `127.0.0.1'.
  1111.  
  1112.  
  1113.   The third and fourth ways allow specification of a group of IP
  1114.   addresses, such as `199.95.207.0/24' or `199.95.207.0/255.255.255.0'.
  1115.   These both specify any IP address from 192.95.207.0 to 192.95.207.255
  1116.   inclusive; the digits after the `/' tell which parts of the IP address
  1117.   are significant.  `/32' or `/255.255.255.255' is the default (match
  1118.   all of the IP address).  To specify any IP address at all `/0' can be
  1119.   used, like so:
  1120.  
  1121.  
  1122.  
  1123.           # ipchains -A input -s 0/0 -j DENY
  1124.           #
  1125.  
  1126.  
  1127.  
  1128.  
  1129.   This is rarely used, as the effect above is the same as not specifying
  1130.   the `-s' option at all.
  1131.  
  1132.  
  1133.   4.1.3.2.  Specifying Inversion
  1134.  
  1135.   Many flags, including the `-s' and `-d' flags can have their arguments
  1136.   preceded by `!' (pronounced `not') to match addresses NOT equal to the
  1137.   ones given.  For example. `-s ! localhost' matches any packet not
  1138.   coming from localhost.
  1139.  
  1140.  
  1141.   4.1.3.3.  Specifying Protocol
  1142.  
  1143.   The protocol can be specified with the `-p' flag.  Protocol can be a
  1144.   number (if you know the numeric protocol values for IP) or a name for
  1145.   the special cases of `TCP', `UDP' or `ICMP'.  Case doesn't matter, so
  1146.   `tcp' works as well as `TCP'.
  1147.  
  1148.  
  1149.   The protocol name can be prefixed by a `!', to invert it, such as `-p
  1150.   ! TCP'.
  1151.  
  1152.  
  1153.   4.1.3.3.1.  Specifying UDP and TCP Ports
  1154.  
  1155.   For the special case where a protocol of TCP or UDP is specified,
  1156.   there can be an extra argument indicating the TCP or UDP port, or an
  1157.   (inclusive) range of ports (but see ``Handling Fragments'' below).  A
  1158.   range is represented using a `:' character, such as `6000:6010', which
  1159.   covers 11 port numbers, from 6000 to 6010 inclusive.  If the lower
  1160.   bound is omitted, it defaults to 0.  If the upper bound is omitted, it
  1161.   defaults to 65535.  So to specify TCP connections coming from ports
  1162.   under 1024, the syntax would be as `-p TCP -s 0.0.0.0/0 :1023'.  Port
  1163.   numbers can be specified by name, eg. `www'.
  1164.  
  1165.  
  1166.   Note that the port specification can be preceded by a `!', which
  1167.   inverts it.  So to specify every TCP packet BUT a WWW packet, you
  1168.   would specify
  1169.  
  1170.   -p TCP -d 0.0.0.0/0 ! www
  1171.  
  1172.  
  1173.  
  1174.   It is important to realize that the specification
  1175.  
  1176.  
  1177.   -p TCP -d ! 192.168.1.1 www
  1178.  
  1179.  
  1180.  
  1181.   is very different from
  1182.  
  1183.   -p TCP -d 192.168.1.1 ! www
  1184.  
  1185.  
  1186.  
  1187.   The first specifies any TCP packet to the WWW port on any machine but
  1188.   192.168.1.1.  The second specifies any TCP connection to any port on
  1189.   192.168.1.1 but the WWW port.
  1190.  
  1191.  
  1192.   Finally, this case means not the WWW port and not 192.168.1.1:
  1193.  
  1194.   -p TCP -d ! 192.168.1.1 ! www
  1195.  
  1196.  
  1197.  
  1198.  
  1199.   4.1.3.3.2.  Specifying ICMP Type and Code
  1200.  
  1201.   ICMP also allows an optional argument, but as ICMP doesn't have ports,
  1202.   (ICMP has a type and a code) they have a different meaning.
  1203.  
  1204.  
  1205.   You can specify them as ICMP names (use ipchains -h icmp to list the
  1206.   names) after the `-s' option, or as a numeric ICMP type and code,
  1207.   where the type follows the `-s' option and the code follows the `-d'
  1208.   option.
  1209.  
  1210.  
  1211.   The ICMP names are fairly long: you only need use enough letters to
  1212.   make the name distinct from any other.
  1213.  
  1214.  
  1215.   Here is a small table of some of the most common ICMP packets:
  1216.  
  1217.  
  1218.        Number  Name                     Required by
  1219.  
  1220.        0       echo-reply               ping
  1221.        3       destination-unreachable  Any TCP/UDP traffic.
  1222.        5       redirect                 routing if not running routing daemon
  1223.        8       echo-request             ping
  1224.        11      time-exceeded            traceroute
  1225.  
  1226.  
  1227.  
  1228.  
  1229.   Note that the ICMP names cannot be preceeded by `!' at the moment.
  1230.  
  1231.  
  1232.   DO NOT DO NOT DO NOT block all ICMP type 3 messages!  (See ``ICMP
  1233.   Packets'' below).
  1234.  
  1235.  
  1236.   4.1.3.4.  Specifying an Interface
  1237.  
  1238.   The `-i' option specifies the name of an interface to match.  An
  1239.   interface is the physical device the packet came in on, or is going
  1240.   out on.  You can use the ifconfig command to list the interfaces which
  1241.   are `up' (ie. working at the moment).
  1242.  
  1243.  
  1244.   The interface for incoming packets (ie. packets traversing the input
  1245.   chain) is considered to be the interface they came in on.  Logically,
  1246.   the interface for outgoing packets (packets traversing the output
  1247.   chain) is the interface they will go out on.  The interface for
  1248.   packets traversing the forward chain is also the interface they will
  1249.   go out on; a fairly arbitrary decision it seems to me.
  1250.  
  1251.  
  1252.   It is perfectly legal to specify an interface that currently does not
  1253.   exist; the rule will not match anything until the interface comes up.
  1254.   This is extremely useful for dial-up PPP links (usually interface
  1255.   ppp0) and the like.
  1256.  
  1257.  
  1258.   As a special case, an interface name ending with a `+' will match all
  1259.   interfaces (whether they currently exist or not) which begin with that
  1260.   string.  For example, to specify a rule which matches all PPP
  1261.   interfaces, the -i ppp+ option would be used.
  1262.  
  1263.  
  1264.   The interface name can be preceded by a `!' to match a packet which
  1265.   does NOT match the specified interface(s).
  1266.  
  1267.  
  1268.   4.1.3.5.  Specifying TCP SYN Packets Only
  1269.  
  1270.   It is sometimes useful to allow TCP connections in one direction, but
  1271.   not the other.  For example, you might want to allow connections to an
  1272.   external WWW server, but not connections from that server.
  1273.  
  1274.  
  1275.   The naive approach would be to block TCP packets coming from the
  1276.   server.  Unfortunately, TCP connections require packets going in both
  1277.   directions to work at all.
  1278.  
  1279.  
  1280.   The solution is to block only the packets used to request a
  1281.   connection.  These packets are called SYN packets (ok, technically
  1282.   they're packets with the SYN flag set, and the FIN and ACK flags
  1283.   cleared, but we call them SYN packets).  By disallowing only these
  1284.   packets, we can stop attempted connections in their tracks.
  1285.  
  1286.  
  1287.   The `-y' flag is used for this: it is only valid for rules which
  1288.   specify TCP as their protocol.  For example, to specify TCP connection
  1289.   attempts from 192.168.1.1:
  1290.  
  1291.   -p TCP -s 192.168.1.1 -y
  1292.  
  1293.  
  1294.  
  1295.  
  1296.   Once again, this flag can be inverted by preceding it with a `!',
  1297.   which means every packet other than the connection initiation.
  1298.  
  1299.  
  1300.   4.1.3.6.  Handling Fragments
  1301.  
  1302.   Sometimes a packet is too large to fit down a wire all at once.  When
  1303.   this happens, the packet is divided into fragments, and sent as
  1304.   multiple packets.  The other end reassembles the fragments to
  1305.   reconstruct the whole packet.
  1306.  
  1307.  
  1308.   The problem with fragments is that some of the specifications listed
  1309.   above (in particular, source port, destinations port, ICMP type, ICMP
  1310.   code, or TCP SYN flag) require the kernel to peek at the start of the
  1311.   packet, which is only contained in the first fragment.
  1312.  
  1313.  
  1314.   If your machine is the only connection to an external network, then
  1315.   you can tell the Linux kernel to reassemble all fragments which pass
  1316.   through it, by compiling the kernel with IP: always defragment set to
  1317.   `Y'.  This sidesteps the issue neatly.
  1318.  
  1319.  
  1320.  
  1321.   Otherwise, it is important to understand how fragments get treated by
  1322.   the filtering rules.  Any filtering rule that asks for information we
  1323.   don't have will not match.  This means that the first fragment is
  1324.   treated like any other packet.  Second and further fragments won't be.
  1325.   Thus a rule -p TCP -s 192.168.1.1 www (specifying a source port of
  1326.   `www') will never match a fragment (other than the first fragment).
  1327.   Neither will the opposite rule -p TCP -s 192.168.1.1 ! www.
  1328.  
  1329.  
  1330.   However, you can specify a rule specifically for second and further
  1331.   fragments, using the `-f' flag.  Obviously, it is illegal to specify a
  1332.   TCP or UDP port, ICMP type, ICMP code or TCP SYN flag in such a
  1333.   fragment rule.
  1334.  
  1335.  
  1336.   It is also legal to specify that a rule does not apply to second and
  1337.   further fragments, by preceding the `-f' with `!'.
  1338.  
  1339.  
  1340.   Usually it is regarded as safe to let second and further fragments
  1341.   through, since filtering will effect the first fragment, and thus
  1342.   prevent reassembly on the target host, however, bugs have been known
  1343.   to allow crashing of machines simply by sending fragments.  Your call.
  1344.  
  1345.  
  1346.   Note for network-heads: malformed packets (TCP, UDP and ICMP packets
  1347.   too short for the firewalling code to read the ports or ICMP code and
  1348.   type) are treated as fragments as well.  Only TCP fragments starting
  1349.   at position 8 are explicitly dropped by the firewall code (a message
  1350.   should appear in the syslog if this occurs).
  1351.  
  1352.  
  1353.   As an example, the following rule will drop any fragments going to
  1354.   192.168.1.1:
  1355.  
  1356.  
  1357.  
  1358.  
  1359.        # ipchains -A output -f -d 192.168.1.1 -j DENY
  1360.        #
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.   4.1.4.  Filtering Side Effects
  1367.  
  1368.   OK, so now we know all the ways we can match a packet using a rule.
  1369.   If a packet matches a rule, the following things happen:
  1370.  
  1371.  
  1372.   1. The byte counter for that rule is increased by the size of the
  1373.      packet (header and all).
  1374.  
  1375.   2. The packet counter for that rule is incremented.
  1376.  
  1377.   3. If the rule requests it, the packet is logged.
  1378.  
  1379.   4. If the rule requests it, the packet's Type Of Service field is
  1380.      changed.
  1381.  
  1382.   5. If the rule requests it, the packet is marked (not in 2.0 kernel
  1383.      series).
  1384.  
  1385.   6. The rule target is examined to decide what to do to the packet
  1386.      next.
  1387.   For variety, I'll address these in order of importance.
  1388.  
  1389.  
  1390.   4.1.4.1.  Specifying a Target
  1391.  
  1392.   A target tells the kernel what to do with a packet that matches a
  1393.   rule.  ipchains uses `-j' (think `jump-to') for the target
  1394.   specification.  The target name must be less than 8 letters, and case
  1395.   matters: "RETURN" and "return" are completely different.
  1396.  
  1397.  
  1398.   The simplest case is when there is no target specified.  This type of
  1399.   rule (often called an `accounting' rule) is useful for simply counting
  1400.   a certain type of packet.  Whether this rule matches or not, the
  1401.   kernel simply examines the next rule in the chain.  For example, to
  1402.   count the number of packets from 192.168.1.1, we could do this:
  1403.  
  1404.  
  1405.        # ipchains -A input -s 192.168.1.1
  1406.        #
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.   (Using `ipchains -L -v' we can see the byte and packet counters
  1413.   associated with each rule).
  1414.  
  1415.  
  1416.   There are six special targets.  The first three, ACCEPT, REJECT and
  1417.   DENY are fairly simple.  ACCEPT allows the packet through.  DENY drops
  1418.   the packet as if it had never been received.  REJECT drops the packet,
  1419.   but (if it's not an ICMP packet) generates an ICMP reply to the source
  1420.   to tell it that the destination was unreachable.
  1421.  
  1422.  
  1423.   The next one, MASQ tells the kernel to masquerade the packet.  For
  1424.   this to work, your kernel needs to be compiled with IP Masquerading
  1425.   enabled.  For details on this, see the Masquerading-HOWTO and the
  1426.   Appendix ``Differences between ipchains and ipfwadm''.  This target is
  1427.   only valid for packets traversing the forward chain.
  1428.  
  1429.  
  1430.   The other major special target is REDIRECT which tells the kernel to
  1431.   send a packet to a local port instead of wherever it was heading.
  1432.   This can only be specified for rules specifying TCP or UDP as their
  1433.   protocol.  Optionally, a port (name or number) can be specified
  1434.   following `-j REDIRECT' which will cause the packet to be redirected
  1435.   to that particular port, even if it was addressed to another port.
  1436.   This target is only valid for packets traversing the input chain.
  1437.  
  1438.  
  1439.   The final special target is RETURN which is identical to falling off
  1440.   the end of the chain immediately.  (See ``Setting Policy'' below).
  1441.  
  1442.  
  1443.   Any other target indicates a user-defined chain (as described in
  1444.   ``Operations on an Entire Chain'' below).  The packet will begin
  1445.   traversing the rules in that chain.  If that chain doesn't decide the
  1446.   fate of the packet, then once traversal on that chain has finished,
  1447.   traversal resumes on the next rule in the current chain.
  1448.  
  1449.  
  1450.   Time for more ASCII art.  Consider two (silly) chains: input (the
  1451.   built-in chain) and Test (a user-defined chain).
  1452.  
  1453.            `input'                         `Test'
  1454.           ----------------------------    ----------------------------
  1455.           | Rule1: -p ICMP -j REJECT |    | Rule1: -s 192.168.1.1    |
  1456.           |--------------------------|    |--------------------------|
  1457.           | Rule2: -p TCP -j Test    |    | Rule2: -d 192.168.1.1    |
  1458.           |--------------------------|    ----------------------------
  1459.           | Rule3: -p UDP -j DENY    |
  1460.           ----------------------------
  1461.  
  1462.  
  1463.  
  1464.  
  1465.   Consider a TCP packet coming from 192.168.1.1, going to 1.2.3.4.  It
  1466.   enters the input chain, and gets tested against Rule1 - no match.
  1467.   Rule2 matches, and its target is Test, so the next rule examined is
  1468.   the start of Test.  Rule1 in Test matches, but doesn't specify a
  1469.   target, so the next rule is examined, Rule2.  This doesn't match, so
  1470.   we have reached the end of the chain.  We return to the input chain,
  1471.   where we had just examined Rule2, so we now examine Rule3, which
  1472.   doesn't match either.
  1473.  
  1474.  
  1475.   So the packet path is:
  1476.  
  1477.                                   v    __________________________
  1478.            `input'                |   /    `Test'                v
  1479.           ------------------------|--/    -----------------------|----
  1480.           | Rule1                 | /|    | Rule1                |   |
  1481.           |-----------------------|/-|    |----------------------|---|
  1482.           | Rule2                 /  |    | Rule2                |   |
  1483.           |--------------------------|    -----------------------v----
  1484.           | Rule3                 /--+___________________________/
  1485.           ------------------------|---
  1486.                                   v
  1487.  
  1488.  
  1489.  
  1490.  
  1491.   See the section ``How to Organise Your Firewall Rules'' for ways to
  1492.   use user-defined chains effectively.
  1493.  
  1494.  
  1495.   4.1.4.2.  Logging Packets
  1496.  
  1497.   This is a side effect that matching a rule can have; you can have the
  1498.   matching packet logged using the `-l' flag.  You will usually not want
  1499.   this for routine packets, but it is a useful feature if you want to
  1500.   look for exceptional events.
  1501.  
  1502.  
  1503.   The kernel logs this information looking like:
  1504.  
  1505.  
  1506.  
  1507.        Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
  1508.          L=34 S=0x00 I=18 F=0x0000 T=254
  1509.  
  1510.  
  1511.  
  1512.  
  1513.   This log message is designed to be terse, and contain technical
  1514.   information useful only to networking gurus, but it can be useful to
  1515.   the rest of us.  It breaks down like so:
  1516.  
  1517.  
  1518.  
  1519.   1. `input' is the chain which contained the rule which matched the
  1520.      packet, causing the log message.
  1521.  
  1522.   2. `DENY' is what the rule said to do to the packet.  If this is `-'
  1523.      then the rule didn't effect the packet at all (an accounting rule).
  1524.  
  1525.   3. `eth0' is the interface name.  Because this was the input chain, it
  1526.      means that the packet came in `eth0'.
  1527.  
  1528.   4. `PROTO=17' means that the packet was protocol 17.  A list of
  1529.      protocol numbers is given in `/etc/protocols'.  The most common are
  1530.      1 (ICMP), 6 (TCP) and 17 (UDP).
  1531.  
  1532.   5. `192.168.2.1' means that the packet's source IP address was
  1533.      192.168.2.1.
  1534.  
  1535.   6. `:53' means that the source port was port 53.  Looking in
  1536.      `/etc/services' shows that this is the `domain' port (ie. this is
  1537.      probably an DNS reply).  For UDP and TCP, this number is the source
  1538.      port.  For ICMP, it's the ICMP type.  For others, it will be 65535.
  1539.  
  1540.   7. `192.168.1.1' is the destination IP address.
  1541.  
  1542.   8. `:1025' means that the destination port was 1025.  For UDP and TCP,
  1543.      this number is the destination port.  For ICMP, it's the ICMP code.
  1544.      For others, it will be 65535.
  1545.  
  1546.   9. `L=34' means that packet was a total of 34 bytes long.
  1547.  
  1548.   10.
  1549.      `S=0x00' means the Type of Service field (divide by 4 to get the
  1550.      Type of Service as used by ipchains).
  1551.  
  1552.   11.
  1553.      `I=18' is the IP ID.
  1554.  
  1555.   12.
  1556.      `F=0x0000' is the 16-bit fragment offset plus flags.  A value
  1557.      starting with `0x4' or `0x5' means that the Don't Fragment bit is
  1558.      set.  `0x2' or `0x3' means the `More Fragments' bit is set; expect
  1559.      more fragments after this.  The rest of the number is the offset of
  1560.      this fragment, divided by 8.
  1561.  
  1562.   13.
  1563.      `T=254' is the Time To Live of the packet.  One is subtracted from
  1564.      this value for every hop, and it usually starts at 15 or 255.
  1565.  
  1566.   14.
  1567.      `(#5)' there may be a final number in brackets on more recent
  1568.      kernels (perhaps after 2.2.9).  This is the rule number which
  1569.      caused the packet log.
  1570.  
  1571.  
  1572.   On standard Linux systems, this kernel output is captured by klogd
  1573.   (the kernel logging daemon) which hands it to syslogd (the system
  1574.   logging daemon).  The `/etc/syslog.conf' controls the behaviour of
  1575.   syslogd, by specifying a destination for each `facility' (in our case,
  1576.   the facility is "kernel") and `level' (for ipchains, the level used is
  1577.   "info").
  1578.  
  1579.  
  1580.   For example, my (Debian) /etc/syslog.conf contains two lines which
  1581.   match `kern.info':
  1582.  
  1583.  
  1584.  
  1585.   kern.*                          -/var/log/kern.log
  1586.   *.=info;*.=notice;*.=warn;\
  1587.           auth,authpriv.none;\
  1588.           cron,daemon.none;\
  1589.           mail,news.none          -/var/log/messages
  1590.  
  1591.  
  1592.  
  1593.  
  1594.   These mean that the messags are duplicated in `/var/log/kern.log' and
  1595.   `/var/log/messages'.  For more details, see `man syslog.conf'.
  1596.  
  1597.  
  1598.   4.1.4.3.  Manipulating the Type Of Service
  1599.  
  1600.   There are four seldom-used bits in the IP header, called the Type of
  1601.   Service (TOS) bits.  They effect the way packets are treated; the four
  1602.   bits are "Minimum Delay", "Maximum Throughput", "Maximum Reliability"
  1603.   and "Minimum Cost".  Only one of these bits is allowed to be set.  Rob
  1604.   van Nieuwkerk, the author of the TOS-mangling code, puts it as
  1605.   follows:
  1606.  
  1607.  
  1608.        Especially the "Minimum Delay" is important for me.  I
  1609.        switch it on for "interactive" packets in my upstream
  1610.        (Linux) router.  I'm behind a 33k6 modem link.  Linux prior¡
  1611.        itizes packets in 3 queues.  This way I get acceptable
  1612.        interactive performance while doing bulk downloads at the
  1613.        same time.  (It could even be better if there wasn't such a
  1614.        big queue in the serial driver, but latency is kept down 1.5
  1615.        seconds now).
  1616.  
  1617.  
  1618.  
  1619.   Note: obviously, you have no control over incoming packets; you can
  1620.   only control the priority of packets leaving your box.  To negotiate
  1621.   priorities with the other end, a protocol like RSVP (which I know
  1622.   nothing about, so don't ask me) must be used.
  1623.  
  1624.  
  1625.   The most common use is to set telnet & ftp control connections to
  1626.   "Minimum Delay" and FTP data to "Maximum Throughput".  This would be
  1627.   done as follows:
  1628.  
  1629.  
  1630.  
  1631.        ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
  1632.        ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
  1633.        ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.   The `-t' flag takes two extra parameters, both in hexadecimal.  These
  1640.   allow complex twiddling of the TOS bits: the first mask is ANDed with
  1641.   the packet's current TOS, and then the second mask is XORed with it.
  1642.   If this is too confusing, just use the following table:
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.   TOS Name                Value           Typical Uses
  1652.  
  1653.   Minimum Delay           0x01 0x10       ftp, telnet
  1654.   Maximum Throughput      0x01 0x08       ftp-data
  1655.   Maximum Reliability     0x01 0x04       snmp
  1656.   Minimum Cost            0x01 0x02       nntp
  1657.  
  1658.  
  1659.  
  1660.  
  1661.   Andi Kleen goes on to point out the following (mildly edited for
  1662.   posterity):
  1663.  
  1664.        Maybe it would be useful to add an reference to the txqueue¡
  1665.        len parameter of ifconfig to the discussion of TOS bits. The
  1666.        default device queue length is tuned for ethernet cards, on
  1667.        modems it is too long and makes the 3 band scheduler (which
  1668.        queues based on TOS) work suboptimally. It is a good idea to
  1669.        set it to a value between 4-10 on modem or single b channel
  1670.        ISDN links: on bundled devices a longer queue is needed.
  1671.        This is a 2.0 and 2.1 problem, but in 2.1 it is a ifconfig
  1672.        flag (with recent nettools), while in 2.0 it requires source
  1673.        patches in the device drivers to change.
  1674.  
  1675.  
  1676.   So, to see maximal benifits of TOS manipulation for modem PPP links,
  1677.   do `ifconfig $1 txqueuelen' in your /etc/ppp/ip-up script.  The number
  1678.   to use depends on the modem speed and the amount of buffering in the
  1679.   modem; here's Andi setting me straight again:
  1680.  
  1681.  
  1682.        The best value for a given configuration needs experiment.
  1683.        If the queues are too short on a router then packets will
  1684.        get dropped.  Also of course one gets benefits even without
  1685.        TOS rewriting, just that TOS rewriting helps to give the
  1686.        benefits to non cooperating programs (but all standard linux
  1687.        programs are cooperating).
  1688.  
  1689.  
  1690.  
  1691.   4.1.4.4.  Marking a Packet
  1692.  
  1693.   This allows complex and powerful interactions with Alexey Kuznetsov's
  1694.   new Quality of Service implementation, as well as the mark-based
  1695.   forwarding in later 2.1 series kernels.  More news as it comes to
  1696.   hand.  This option is ignored altogether in the 2.0 kernel series.
  1697.  
  1698.  
  1699.   4.1.4.5.  Operations on an Entire Chain
  1700.  
  1701.   A very useful feature of ipchains is the ability to group related
  1702.   rules into chains.  You can call the chains whatever you want, as long
  1703.   as the names don't clash with the built-in chains (input, output and
  1704.   forward) or the targets (MASQ, REDIRECT, ACCEPT, DENY, REJECT or
  1705.   RETURN).  I suggest avoiding upper-case labels entirely, since I may
  1706.   use these for future extensions.  The chain name can be up to 8
  1707.   characters long.
  1708.  
  1709.  
  1710.   4.1.4.6.  Creating a New Chain
  1711.  
  1712.   Let's create a new chain.  Because I am such an imaginative fellow,
  1713.   I'll call it test.
  1714.  
  1715.  
  1716.  
  1717.   # ipchains -N test
  1718.   #
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  
  1724.   It's that simple.  Now you can put rules in it as detailed above.
  1725.  
  1726.  
  1727.   4.1.4.7.  Deleting a Chain
  1728.  
  1729.   Deleting a chain is simple as well.
  1730.  
  1731.  
  1732.  
  1733.        # ipchains -X test
  1734.        #
  1735.  
  1736.  
  1737.  
  1738.  
  1739.   Why `-X'?  Well, all the good letters were taken.
  1740.  
  1741.  
  1742.   There are a couple of restrictions to deleting chains: they must be
  1743.   empty (see ``Flushing a Chain'' below) and they must not be the target
  1744.   of any rule.  You can't delete any of the three built-in chains.
  1745.  
  1746.  
  1747.   4.1.4.8.  Flushing a Chain
  1748.  
  1749.   There is a simple way of emptying all rules out of a chain, using the
  1750.   `-F' command.
  1751.  
  1752.  
  1753.  
  1754.                # ipchains -F forward
  1755.                #
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.   If you don't specify a chain, then all chains will be flushed.
  1762.  
  1763.  
  1764.   4.1.4.9.  Listing a Chain
  1765.  
  1766.   You can list all the rules in a chain by using the `-L' command.
  1767.  
  1768.  
  1769.  
  1770.        # ipchains -L input
  1771.        Chain input (refcnt = 1): (policy ACCEPT)
  1772.        target     prot opt    source                destination           ports
  1773.        ACCEPT     icmp -----  anywhere              anywhere              any
  1774.        # ipchains -L test
  1775.        Chain test (refcnt = 0):
  1776.        target     prot opt    source                destination           ports
  1777.        DENY       icmp -----  localnet/24           anywhere              any
  1778.        #
  1779.  
  1780.  
  1781.  
  1782.  
  1783.   The `refcnt' listed for test is the number of rules which have test as
  1784.   their target.  This must be zero (and the chain be empty) before this
  1785.   chain can be deleted.
  1786.  
  1787.  
  1788.   If the chain name is omitted, all chains are listed, even empty ones.
  1789.  
  1790.  
  1791.   There are three options which can accompany `-L'.  The `-n' (numeric)
  1792.   option is very useful as it prevents ipchains from trying to lookup
  1793.   the IP addresses, which (if you are using DNS like most people) will
  1794.   cause large delays if your DNS is not set up properly, or you have
  1795.   filtered out DNS requests.  It also causes ports to be printed out as
  1796.   numbers rather than names.
  1797.  
  1798.  
  1799.   The `-v' options shows you all the details of the rules, such as the
  1800.   the packet and byte counters, the TOS masks, the interface, and the
  1801.   packet mark.  Otherwise these values are omitted.  For example:
  1802.  
  1803.  
  1804.  
  1805.        # ipchains -v -L input
  1806.        Chain input (refcnt = 1): (policy ACCEPT)
  1807.         pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
  1808.           10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
  1809.  
  1810.  
  1811.  
  1812.  
  1813.  
  1814.   Note that the packet and byte counters are printed out using the
  1815.   suffixes `K', `M' or `G' for 1000, 1,000,000 and 1,000,000,000
  1816.   respectively.  Using the `-x' (expand numbers) flag as well prints the
  1817.   full numbers, no matter how large they are.
  1818.  
  1819.  
  1820.   4.1.4.10.  Resetting (Zeroing) Counters
  1821.  
  1822.   It is useful to be able to reset the counters.  This can be done with
  1823.   the `-Z' (zero counters) option.  For example:
  1824.  
  1825.  
  1826.  
  1827.        # ipchains -v -L input
  1828.        Chain input (refcnt = 1): (policy ACCEPT)
  1829.         pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
  1830.           10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
  1831.        # ipchains -Z input
  1832.        # ipchains -v -L input
  1833.        Chain input (refcnt = 1): (policy ACCEPT)
  1834.         pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
  1835.            0     0 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
  1836.        #
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.   The problem with this approach is that sometimes you need to know the
  1843.   counter values immediately before they are reset.  In the above
  1844.   example, some packets could pass through between the `-L' and `-Z'
  1845.   commands.  For this reason, you can use the `-L' and `-Z' together, to
  1846.   reset the counters while reading them.  Unfortunately, if you do this,
  1847.   you can't operate on a single chain: you have to list and zero all the
  1848.   chains at once.
  1849.        # ipchains -L -v -Z
  1850.        Chain input (policy ACCEPT):
  1851.         pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
  1852.           10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
  1853.  
  1854.        Chain forward (refcnt = 1): (policy ACCEPT)
  1855.        Chain output (refcnt = 1): (policy ACCEPT)
  1856.        Chain test (refcnt = 0):
  1857.            0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
  1858.        # ipchains -L -v
  1859.        Chain input (policy ACCEPT):
  1860.         pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
  1861.           10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
  1862.  
  1863.        Chain forward (refcnt = 1): (policy ACCEPT)
  1864.        Chain output (refcnt = 1): (policy ACCEPT)
  1865.        Chain test (refcnt = 0):
  1866.            0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
  1867.        #
  1868.  
  1869.  
  1870.  
  1871.  
  1872.  
  1873.   4.1.4.11.  Setting Policy
  1874.  
  1875.   We glossed over what happens when a packet hits the end of a built-in
  1876.   chain when we discussed how a packet walks through chains in
  1877.   ``Specifying a Target'' above.  In this case, the policy of the chain
  1878.   determines the fate of the packet.  Only built-in chains (input,
  1879.   output and forward) have policies, because if a packet falls off the
  1880.   end of a user-defined chain, traversal resumes at the previous chain.
  1881.  
  1882.  
  1883.   The policy can be any of the first four special targets: ACCEPT, DENY,
  1884.   REJECT or MASQ.  MASQ is only valid for the `forward' chain.
  1885.  
  1886.  
  1887.   It is also important to note that a RETURN target in a rule in one of
  1888.   the built-in chains is useful to explicitly target the chain policy
  1889.   when a packet matches a rule.
  1890.  
  1891.  
  1892.   4.1.5.  Operations on Masquerading
  1893.  
  1894.   There are several parameters you can tweak for IP Masquerading.  They
  1895.   are bundled with ipchains because it's not worth writing a separate
  1896.   tool for them (although this will change).
  1897.  
  1898.  
  1899.   The IP Masquerading command is `-M', and it can be combined with `-L'
  1900.   to list currently masqueraded connections, or `-S' to set the
  1901.   masquerading parameters.
  1902.  
  1903.  
  1904.   The `-L' command can be accompanied by `-n' (show numbers instead of
  1905.   hostnames and port names) or `-v' (show deltas in sequence numbers for
  1906.   masqueraded connection, just in case you care).
  1907.  
  1908.  
  1909.   The `-S' command should be followed by three timeout values, each in
  1910.   seconds: for TCP sessions, for TCP sessions after a FIN packet, and
  1911.   for UDP packets.  If you don't want to change one of these values,
  1912.   simply give a value of `0'.
  1913.  
  1914.  
  1915.   The default values are listed in
  1916.   `/usr/src/linux/include/net/ip_masq.h', currently 15 minutes, 2
  1917.   minutes and 5 minutes respectively.
  1918.  
  1919.  
  1920.   The most common value to change is the first one, for FTP (see ``FTP
  1921.   Nightmares'' below).
  1922.  
  1923.  
  1924.   Note the problems with setting timeouts listed in ``I can't set
  1925.   masquerading timeouts!''.
  1926.  
  1927.  
  1928.   4.1.6.  Checking a Packet
  1929.  
  1930.   Sometimes you want to see what happens when a certain packet enters
  1931.   your machine, such as for debugging your firewall chains.  ipchains
  1932.   has the `-C' command to allow this, using the exact same routines that
  1933.   the kernel uses to diagnose real packets.
  1934.  
  1935.  
  1936.   You specify which chain to test the packet on by following the `-C'
  1937.   argument with its name.  Whereas the kernel always starts traversing
  1938.   on the input, output or forward chains, you are allowed to begin
  1939.   traversing on any chain for testing purposes.
  1940.  
  1941.  
  1942.   The details of the `packet' are specified using the same syntax used
  1943.   to specify firewall rules.  In particular, a protocol (`-p'), source
  1944.   address (`-s'), destination address (`-d') and interface (`-i') are
  1945.   compulsory.  If the protocol is TCP or UDP, then a single source and a
  1946.   single destination port must be specified, and a ICMP type and code
  1947.   must be specified for the ICMP protocol (unless the `-f' flag is
  1948.   specified to indicate a fragment rule, in which case these options are
  1949.   illegal).
  1950.  
  1951.  
  1952.   If the protocol is TCP (and the `-f' flag is not specified), the `-y'
  1953.   flag may be specified, to indicate that the test packet should have
  1954.   the SYN bit set.
  1955.  
  1956.  
  1957.   Here is an example of testing a TCP SYN packet from 192.168.1.1 port
  1958.   60000 to 192.168.1.2 port www, coming in the eth0 interface, entering
  1959.   the `input' chain.  (This is a classic incoming WWW connection
  1960.   initiation):
  1961.  
  1962.  
  1963.  
  1964.        # ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
  1965.        packet accepted
  1966.        #
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.   4.1.7.  Multiple Rules at Once and Watching What Happens
  1973.  
  1974.   Sometimes a single command line can result in multiple rules being
  1975.   effected.  This is done in two ways.  Firstly, if you specify a
  1976.   hostname which resolves (using DNS) to multiple IP addresses, ipchains
  1977.   will act as if you had typed multiple commands with each combination
  1978.   of addresses.
  1979.  
  1980.  
  1981.   So if the hostname `www.foo.com' resolves to three IP addresses, and
  1982.   the hostname `www.bar.com' resolves to two IP addresses, then the
  1983.   command `ipchains -A input -j reject -s www.bar.com -d www.foo.com'
  1984.   would append six rules to the input chain.
  1985.  
  1986.  
  1987.   The other way to have ipchains perform multiple actions is to use the
  1988.   bidirectional flag (`-b').  This flag makes ipchains behave as if you
  1989.   had typed the command twice, the second time with the `-s' and `-d'
  1990.   arguments reversed.  So, to avoid forwarding either to or from
  1991.   192.168.1.1, you could do the following:
  1992.  
  1993.  
  1994.  
  1995.        # ipchains -b -A forward -j reject -s 192.168.1.1
  1996.        #
  1997.  
  1998.  
  1999.  
  2000.  
  2001.  
  2002.   Personally, I don't like the `-b' option much; if you want
  2003.   convenience, see ``Using ipchains-save'' below.
  2004.  
  2005.  
  2006.   The -b option can be used with the insert (`-I'), delete (`-D') (but
  2007.   not the variation which takes a rule number), append (`-A') and check
  2008.   (`-C') commands.
  2009.  
  2010.  
  2011.   Another useful flag is `-v' (verbose) which prints out exactly what
  2012.   ipchains is doing with your commands.  This is useful if you are
  2013.   dealing with commands that may effect multiple rules.  For example,
  2014.   here we check the behaviour of fragments between 192.168.1.1 and
  2015.   192.168.1.2.
  2016.  
  2017.  
  2018.  
  2019.        # ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
  2020.          tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.1  -> 192.168.1.2    * ->   *
  2021.        packet accepted
  2022.          tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.2  -> 192.168.1.1    * ->   *
  2023.        packet accepted
  2024.        #
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.   4.2.  Useful Examples
  2031.  
  2032.   I have a dialup PPP connection (-i ppp0).  I grab news (-p TCP -s
  2033.   news.virtual.net.au nntp) and mail (-p TCP -s mail.virtual.net.au
  2034.   pop-3) every time I dial up.  I use Debian's FTP method to update my
  2035.   machine regularly (-p TCP -y -s ftp.debian.org.au ftp-data).  I surf
  2036.   the web through my ISP's proxy while this is going on (-p TCP -d
  2037.   proxy.virtual.net.au 8080), but hate the ads from doubleclick.net on
  2038.   the Dilbert Archive (-p TCP -y -d 199.95.207.0/24 and -p TCP -y -d
  2039.   199.95.208.0/24).
  2040.  
  2041.  
  2042.   I don't mind people trying to ftp to my machine while I'm online (-p
  2043.   TCP -d $LOCALIP ftp), but don't want anyone outside pretending to have
  2044.   an IP address of my internal network (-s 192.168.1.0/24).  This is
  2045.   commonly called IP spoofing, and there is a better way to protect
  2046.   yourself from it in the 2.1.x kernels and above: see ``How do I set up
  2047.   IP spoof protection?''.
  2048.  
  2049.  
  2050.   This setup is fairly simple, because there are currently no other
  2051.   boxes on my internal network.
  2052.  
  2053.  
  2054.   I don't want any local process (ie. Netscape, lynx etc.) to connect to
  2055.   doubleclick.net:
  2056.  
  2057.  
  2058.  
  2059.        # ipchains -A output -d 199.95.207.0/24 -j REJECT
  2060.        # ipchains -A output -d 199.95.208.0/24 -j REJECT
  2061.        #
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.   Now I want to set priorities on various outgoing packets (there isn't
  2068.   much point in doing it on incoming packets).  Since I have a fair
  2069.   number of these rules, it makes sense to put them all in a single
  2070.   chain, called ppp-out.
  2071.  
  2072.  
  2073.  
  2074.        # ipchains -N ppp-out
  2075.        # ipchains -A output -i ppp0 -j ppp-out
  2076.        #
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.   Minimum delay for web traffic & telnet.
  2083.  
  2084.  
  2085.  
  2086.        # ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
  2087.        # ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
  2088.        #
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.   Low cost for ftp data, nntp, pop-3:
  2095.  
  2096.  
  2097.  
  2098.        # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
  2099.        # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
  2100.        # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
  2101.        #
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.   There are a few restrictions on packets coming in the ppp0 interface:
  2108.   let's create a chain called `ppp-in':
  2109.  
  2110.  
  2111.  
  2112.  
  2113.   # ipchains -N ppp-in
  2114.   # ipchains -A input -i ppp0 -j ppp-in
  2115.   #
  2116.  
  2117.  
  2118.  
  2119.  
  2120.  
  2121.   Now, no packets coming in ppp0 should be claiming a source address of
  2122.   192.168.1.*, so we log and deny them:
  2123.  
  2124.  
  2125.  
  2126.        # ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
  2127.        #
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.   I allow UDP packets in for DNS (I run a caching nameserver which
  2134.   forwards all requests to 203.29.16.1, so I expect DNS replies from
  2135.   them only), incoming ftp, and return ftp-data only (which should only
  2136.   be going to a port above 1023, and not the X11 ports around 6000).
  2137.  
  2138.  
  2139.  
  2140.        # ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
  2141.        # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
  2142.        # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
  2143.        # ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
  2144.        #
  2145.  
  2146.  
  2147.  
  2148.  
  2149.  
  2150.   Finally, local-to-local packets are OK:
  2151.  
  2152.  
  2153.  
  2154.        # ipchains -A input -i lo -j ACCEPT
  2155.        #
  2156.  
  2157.  
  2158.  
  2159.  
  2160.  
  2161.   Now, my default policy on the input chain is DENY, so everything else
  2162.   gets dropped:
  2163.  
  2164.  
  2165.  
  2166.        # ipchains -P input DENY
  2167.        #
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  
  2173.   NOTE: I wouldn't set up my chains in this order, as packets might get
  2174.   through while I'm setting up.  Safest is usually to set the policy to
  2175.   DENY first, then insert the rules.  Of course, if your rules require
  2176.   DNS lookups to resolve hostnames, you could be in trouble.
  2177.  
  2178.  
  2179.   4.2.1.  Using ipchains-save
  2180.  
  2181.   Setting up firewall chains just the way you want them, and then trying
  2182.   to remember the commands you used so you can do them next time is a
  2183.   pain.
  2184.  
  2185.  
  2186.   So, ipchains-save is a script which reads your current chains setup
  2187.   and saves it to a file.  For the moment I'll keep you in suspense with
  2188.   regards to what ipchains-restore does.
  2189.  
  2190.  
  2191.   ipchains-save can save a single chain, or all chains (if no chain name
  2192.   is specified).  The only option currently permitted is `-v' which
  2193.   prints the rules (to stderr) as they are saved.  The policy of the
  2194.   chain is also saved for input, output and forward chains.
  2195.  
  2196.  
  2197.  
  2198.        # ipchains-save > my_firewall
  2199.        Saving `input'.
  2200.        Saving `output'.
  2201.        Saving `forward'.
  2202.        Saving `ppp-in'.
  2203.        Saving `ppp-out'.
  2204.        #
  2205.  
  2206.  
  2207.  
  2208.  
  2209.  
  2210.   4.2.2.  Using ipchains-restore
  2211.  
  2212.   ipchains-restore restores chains as saved with ipchains-save.  It can
  2213.   take two options: `-v' which describes each rule as it is added, and
  2214.   `-f' which forces flushing of user-defined chains if they exist, as
  2215.   described below.
  2216.  
  2217.  
  2218.   If a user-defined chain is found in the input, ipchains-restore checks
  2219.   if that chain already exists.  If it does, then you will be prompted
  2220.   whether the chains should be flushed (cleared of all rules) or whether
  2221.   restoring this chain should be skipped.  If you specified `-f' on the
  2222.   command line, you will not be prompted; the chain will be flushed.
  2223.  
  2224.  
  2225.   For example:
  2226.  
  2227.  
  2228.  
  2229.        # ipchains-restore < my_firewall
  2230.        Restoring `input'.
  2231.        Restoring `output'.
  2232.        Restoring `forward'.
  2233.        Restoring `ppp-in'.
  2234.        Chain `ppp-in' already exists. Skip or flush? [S/f]? s
  2235.        Skipping `ppp-in'.
  2236.        Restoring `ppp-out'.
  2237.        Chain `ppp-out' already exists. Skip or flush? [S/f]? f
  2238.        Flushing `ppp-out'.
  2239.        #
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.   5.  Miscellaneous.
  2246.  
  2247.   This section contains all the information and FAQs that I couldn't fit
  2248.   inside the structure above.
  2249.  
  2250.  
  2251.   5.1.  How to Organize Your Firewall Rules
  2252.  
  2253.   This question requires some thought.  You can try to organize them to
  2254.   optimize speed (minimize the number of rule-checks for the most common
  2255.   packets) or to increase manageability.
  2256.  
  2257.  
  2258.   If you have an intermittent link, say a PPP link, you might want to
  2259.   set the first rule in the input chain to be set to `-i ppp0 -j DENY'
  2260.   at boot time, then have something like this in your ip-up script:
  2261.  
  2262.  
  2263.  
  2264.        # Re-create the `ppp-in' chain.
  2265.        ipchains-restore -f < ppp-in.firewall
  2266.  
  2267.        # Replace DENY rule with jump to ppp-handling chain.
  2268.        ipchains -R input 1 -i ppp0 -j ppp-in
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.   Your ip-down script would look like:
  2275.  
  2276.  
  2277.  
  2278.        ipchains -R input 1 -i ppp0 -j DENY
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.   5.2.  What Not To Filter Out
  2286.  
  2287.   There are some things you should be aware of before you start
  2288.   filtering out everything you don't want.
  2289.  
  2290.  
  2291.   5.2.1.  ICMP packets
  2292.  
  2293.   ICMP packets are used (among other things) to indicate failure for
  2294.   other protocols (such as TCP and UDP).  `destination-unreachable'
  2295.   packets in particular.  Blocking these packets means that you will
  2296.   never get `Host unreachable' or `No route to host' errors; any
  2297.   connections will just wait for a reply that never comes.  This is
  2298.   irritating, but rarely fatal.
  2299.  
  2300.  
  2301.   A worse problem is the role of ICMP packets in MTU discovery.  All
  2302.   good TCP implementations (Linux included) use MTU discovery to try to
  2303.   figure out what the largest packet that can get to a destination
  2304.   without being fragmented (fragmentation slows performance, especially
  2305.   when occasional fragments are lost).  MTU discovery works by sending
  2306.   packets with the "Don't Fragment" bit set, and then sending smaller
  2307.   packets if it gets an ICMP packet indicating "Fragmentation needed but
  2308.   DF set" (`fragmentation-needed').  This is a type of `destination-
  2309.   unreachable' packet, and if it is never received, the local host will
  2310.   not reduce MTU, and performance will be abysmal or non-existent.
  2311.   Note that it is common to block all ICMP redirect messages (type 5);
  2312.   these can be used to manipulate routing (although good IP stacks have
  2313.   safeguards), and so are often seen as slightly risky.
  2314.  
  2315.  
  2316.   5.2.2.  TCP Connections to DNS (nameservers)
  2317.  
  2318.   If you're trying to block outgoing TCP connections, remember that DNS
  2319.   doesn't always use UDP; if the reply from the server exceeds 512
  2320.   bytes, the client uses a TCP connection (still going to port number
  2321.   53) to get the data.
  2322.  
  2323.  
  2324.   This can be a trap because DNS will `mostly work' if you disallow such
  2325.   TCP transfers; you may experience strange long delays and other
  2326.   occasional DNS problems if you do.
  2327.  
  2328.  
  2329.   If your DNS queries are always directed at the same external source
  2330.   (either directly by using the nameserver line in /etc/resolv.conf or
  2331.   by using a caching nameserver in forward mode), then you need only
  2332.   allow TCP connections to port domain on that nameserver from the local
  2333.   domain port (if using a caching nameserver) or from a high port (>
  2334.   1023) if using /etc/resolv.conf.
  2335.  
  2336.  
  2337.   5.2.3.  FTP Nightmares
  2338.  
  2339.   The classic packet filtering problem is FTP.  FTP has two modes; the
  2340.   traditional one is called active mode and the more recent one is
  2341.   called passive mode.  Web browsers usually default to passive mode,
  2342.   but command-line FTP programs usually default to active mode.
  2343.  
  2344.  
  2345.   In active mode, when the remote end wants to send a file (or even the
  2346.   results of an ls or dir command) it tries to open a TCP connection to
  2347.   the local machine.  This means you can't filter out these TCP
  2348.   connections without breaking active FTP.
  2349.  
  2350.  
  2351.   If you have the option of using passive mode, then fine; passive mode
  2352.   makes data connections from client to server, even for incoming data.
  2353.   Otherwise, it is recommended that you only allow TCP connections to
  2354.   ports above 1024 and not between 6000 and 6010 (6000 is used for X-
  2355.   Windows).
  2356.  
  2357.  
  2358.   5.3.  Filtering out Ping of Death
  2359.  
  2360.   Linux boxes are now immune to the famous Ping of Death, which involves
  2361.   sending an illegally-large ICMP packet which overflows buffers in the
  2362.   TCP stack on the receiver and causes havoc.
  2363.  
  2364.  
  2365.   If you are protecting boxes which might be vulnerable, you could
  2366.   simply block ICMP fragments.  Normal ICMP packets aren't large enough
  2367.   to require fragmentation, so you won't break anything except big
  2368.   pings.  I have heard (unconfirmed) reports that some systems required
  2369.   only the last fragment of an oversize ICMP packet to corrupt them, so
  2370.   blocking only the first fragment is not recommended.
  2371.  
  2372.  
  2373.   While the exploit programs I have seen all use ICMP, there is no
  2374.   reasons that TCP or UDP fragments (or an unknown protocol) could not
  2375.   be used for this attack, so blocking ICMP fragments is only a
  2376.   temporary solution.
  2377.   5.4.  Filtering out Teardrop and Bonk
  2378.  
  2379.   Teardrop and Bonk are two attacks (mainly against Microsoft Windows NT
  2380.   machines) which rely on overlapping fragments.  Having your Linux
  2381.   router do defragmentation, or disallowing all fragments to your
  2382.   vulnerable machines are the other options.
  2383.  
  2384.  
  2385.   5.5.  Filtering out Fragment Bombs
  2386.  
  2387.   Some less-reliable TCP stacks are said to have problems dealing with
  2388.   large numbers of fragments of packets when they don't receive all the
  2389.   fragments.  Linux does not have this problem.  You can filter out
  2390.   fragments (which might break legitimate uses) or compile your kernel
  2391.   with `IP: always defragment' set to `Y' (only if your Linux box is the
  2392.   only possible route for these packets).
  2393.  
  2394.  
  2395.   5.6.  Changing Firewall Rules
  2396.  
  2397.   There are some timing issues involved in altering firewall rules.  If
  2398.   you are not careful, you can let packets through while you are half-
  2399.   way through your changes.  A simplistic approach is to do the
  2400.   following:
  2401.  
  2402.  
  2403.  
  2404.        # ipchains -I input 1 -j DENY
  2405.        # ipchains -I output 1 -j DENY
  2406.        # ipchains -I forward 1 -j DENY
  2407.  
  2408.        ... make changes ...
  2409.  
  2410.        # ipchains -D input 1
  2411.        # ipchains -D output 1
  2412.        # ipchains -D forward 1
  2413.        #
  2414.  
  2415.  
  2416.  
  2417.  
  2418.   This drops all packets for the duration of the changes.
  2419.  
  2420.  
  2421.   If you changes are restricted to a single chain, you might want to
  2422.   create a new chain with the new rules, and then replace (`-R') the
  2423.   rule that pointed to the old chain with one that points to the new
  2424.   chain: then you can delete the old chain.  This replacement will occur
  2425.   atomically.
  2426.  
  2427.  
  2428.   5.7.  How Do I Set Up IP Spoof Protection?
  2429.  
  2430.   IP spoofing is a technique where a host sends out packets which claim
  2431.   to be from another host.  Since packet filtering makes decisions based
  2432.   on this source address, IP spoofing is uses to fool packet filters.
  2433.   It is also used to hide the identity of attackers using SYN attacks,
  2434.   Teardrop, Ping of Death and the like (don't worry if you don't know
  2435.   what they are).
  2436.  
  2437.  
  2438.   The best way to protect from IP spoofing is called Source Address
  2439.   Verification, and it is done by the routing code, and not firewalling
  2440.   at all.  Look for a file called /proc/sys/net/ipv4/conf/all/rp_filter.
  2441.   If this exists, then turning on Source Address Verification at every
  2442.   boot is the right solution for you.  To do that, insert the following
  2443.   lines somewhere in your init scripts, before any network interfaces
  2444.   are initialized:
  2445.  
  2446.  
  2447.  
  2448.        # This is the best method: turn on Source Address Verification and get
  2449.        # spoof protection on all current and future interfaces.
  2450.        if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
  2451.          echo -n "Setting up IP spoofing protection..."
  2452.          for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
  2453.              echo 1 > $f
  2454.          done
  2455.          echo "done."
  2456.        else
  2457.          echo PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED.
  2458.          echo "CONTROL-D will exit from this shell and continue system startup."
  2459.          echo
  2460.          # Start a single user shell on the console
  2461.          /sbin/sulogin $CONSOLE
  2462.        fi
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.   If you cannot do this, you can manually insert rules to protect every
  2469.   interface.  This requires knowledge of each interface.  The 2.1
  2470.   kernels automatically reject packets claiming to come from the 127.*
  2471.   addresses (reserved for the local loopback interface, lo).
  2472.  
  2473.  
  2474.   For example, say we have three interfaces, eth0, eth1 and ppp0.  We
  2475.   can use ifconfig to tell us the address and netmask of the interfaces.
  2476.   Say eth0 was attached to a network 192.168.1.0 with netmask
  2477.   255.255.255.0, eth1 was attached to a network 10.0.0.0 with netmask
  2478.   255.0.0.0, and ppp0 connected to the Internet (where any address
  2479.   except the reserved private IP addresses are allowed), we would insert
  2480.   the following rules:
  2481.  
  2482.  
  2483.  
  2484.        # ipchains -A input -i eth0 -s ! 192.168.1.0/255.255.255.0 -j DENY
  2485.        # ipchains -A input -i ! eth0 -s 192.168.1.0/255.255.255.0 -j DENY
  2486.        # ipchains -A input -i eth1 -s ! 10.0.0.0/255.0.0.0 -j DENY
  2487.        # ipchains -A input -i ! eth1 -s 10.0.0.0/255.0.0.0 -j DENY
  2488.        #
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.   This approach is not as good as the Source Address Verification
  2495.   approach, because if your network changes, you have to change your
  2496.   firewalling rules to keep up.
  2497.  
  2498.  
  2499.   If you are running a 2.0 series kernel, you might want to protect the
  2500.   loopback interface as well, using a rule like this:
  2501.  
  2502.  
  2503.  
  2504.        # ipchains -A input -i ! lo -s 127.0.0.0/255.0.0.0 -j DENY
  2505.        #
  2506.  
  2507.  
  2508.  
  2509.   5.8.  Advanced Projects
  2510.  
  2511.   There is a userspace library I have written which is included with the
  2512.   source distribution called `libfw'.  It uses the ability of IP Chains
  2513.   1.3 and above to copy a packet to userspace (using the
  2514.   IP_FIREWALL_NETLINK config option).
  2515.  
  2516.  
  2517.   The mark value can be used to specify the Quality of Service
  2518.   parameters for packets, or to specify how packets should be port-
  2519.   forwarded.  I've never used either, but if you want to write about it,
  2520.   please contact me.
  2521.  
  2522.  
  2523.   Things such as stateful inspection (I prefer the term dynamic
  2524.   firewalling) can be implemented in userspace using this library.
  2525.   Other nifty ideas include controlling packets on a per-user basis by
  2526.   doing a lookup in a userspace daemon.  This should be pretty easy.
  2527.  
  2528.  
  2529.   5.8.1.  SPF: Stateful Packet Filtering
  2530.  
  2531.   ftp://ftp.interlinx.bc.ca/pub/spf <ftp://ftp.interlinx.bc.ca/pub/spf>
  2532.   is the site of Brian Murrell's SPF project, which does connection
  2533.   tracking in userspace.  It adds significant security for low-bandwidth
  2534.   sites.
  2535.  
  2536.  
  2537.   There's little documentation at present, but here's a post to the
  2538.   mailing list in which Brian answered some questions:
  2539.  
  2540.  
  2541.  
  2542.  
  2543.        > I believe it does exactly what I want: Installing a temporary
  2544.        > "backward"-rule to let packets in as a response to an
  2545.        > outgoing request.
  2546.  
  2547.        Yup, that is exactly what it does.  The more protocols it
  2548.        understands, the more "backward" rules it gets right.  Right
  2549.        now it has support for (from memory, please excuse any errors
  2550.        or omissions) FTP (both active and passive, in and out), some
  2551.        RealAudio, traceroute, ICMP and basic ICQ (inbound from the ICQ
  2552.        servers, and direct TCP connections, but alas the secondary
  2553.        direct TCP connections for things like file transfer, etc. are
  2554.        not there yet)
  2555.  
  2556.        > Is it a replacement for ipchains or a supplement?
  2557.  
  2558.        It is a supplement.  Think of ipchains as the engine to allow
  2559.        and prevent packets from travelling across a Linux box.  SPF is
  2560.        the driver, constantly monitoring traffic and telling ipchains
  2561.        how to change it's policies to reflect the changes in traffic
  2562.        patterns.
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.   5.8.2.  Michael Hasenstein's ftp-data hack
  2569.  
  2570.   Michael Hasenstein of SuSE has written a kernel patch which adds ftp
  2571.   connection tracking to ipchains.  It can currently be found at
  2572.   http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz
  2573.   <http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz>
  2574.  
  2575.   5.9.  Future Enhancements
  2576.  
  2577.   Firewalling and NAT are being redesigned for 2.3.  Plans and
  2578.   discussions are available on the netdev archive, and ipchains-dev
  2579.   list.  These enhancements should clear up many outstanding usability
  2580.   issues (really, firewalling and masquerading shouldn't be this hard),
  2581.   and allow growth for far more flexible firewalling.
  2582.  
  2583.  
  2584.   6.  Common Problems
  2585.  
  2586.  
  2587.   6.1.  ipchains -L Freezes!
  2588.  
  2589.   You're probably blocking DNS lookups; it will eventually time out.
  2590.   Try using the `-n' (numeric) flag to ipchains, which suppresses the
  2591.   lookup of names.
  2592.  
  2593.  
  2594.  
  2595.   6.2.  Masquerading/Forwarding Doesn't Work!
  2596.  
  2597.   Make sure that packet forwarding is enabled (in recent kernels it is
  2598.   disabled by default, meaning that packets never even try to traverse
  2599.   the `forward' chain).  You can override this (as root) by typing
  2600.  
  2601.  
  2602.  
  2603.        # echo 1 > /proc/sys/net/ipv4/ip_forward
  2604.        #
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.   If this works for you, you can put this somewhere in your bootup
  2611.   scripts so it is enabled every time; you'll want to set up your
  2612.   firewalling before this command runs though, otherwise there's an
  2613.   opportunity for packets to slip through.
  2614.  
  2615.  
  2616.  
  2617.   6.3.  -j REDIR doesn't work!
  2618.  
  2619.   You must allow forwarding packets (see above) for redirect to work;
  2620.   otherwise the routing code drops the packet.  So if you are just using
  2621.   redirect, and don't have any forwarding at all, you should be aware of
  2622.   that.
  2623.  
  2624.  
  2625.   Note that REDIR (being in the input chain) doesn't effect connections
  2626.   from a local process.
  2627.  
  2628.  
  2629.   6.4.  Wildcard Interfaces Don't Work!
  2630.  
  2631.   There was a bug in versions 2.1.102 and 2.1.103 of the kernel (and
  2632.   some old patches I produced) which made ipchains commands which
  2633.   specified a wildcard interface (such as -i ppp+) fail.
  2634.  
  2635.  
  2636.   This is fixed in recent kernels, and in the 2.0.34 patch on the web
  2637.   site.  You can also fix it by hand in the kernel source by changing
  2638.   line 63 or so in include/linux/ip_fw.h:
  2639.  
  2640.  
  2641.        #define IP_FW_F_MASK    0x002F  /* All possible flag bits mask   */
  2642.  
  2643.  
  2644.  
  2645.  
  2646.  
  2647.   This should read ``0x003F''.  Fix this and recompile the kernel.
  2648.  
  2649.  
  2650.   6.5.  TOS Doesn't Work!
  2651.  
  2652.   This was my mistake: setting the Type of Service field did not
  2653.   actually set the Type of Service in kernel versions 2.1.102 through
  2654.   2.1.111.  This problem was fixed in 2.1.112.
  2655.  
  2656.  
  2657.   6.6.  ipautofw and ipportfw Don't Work!
  2658.  
  2659.   For 2.0.x, this is true; I haven't time to create and maintain a jumbo
  2660.   patch for ipchains and ipautofw/ipportfw.
  2661.  
  2662.  
  2663.   For 2.1.x, download Juan Ciarlante's ipmasqadm from
  2664.  
  2665.   <url url="http://juanjox.linuxhq.com/"
  2666.           name="http://juanjox.linuxhq.com/">
  2667.  
  2668.  
  2669.   and use it exactly as you would have used ipautofw or ipportfw, except
  2670.   instead of ipportfw you type ipmasqadm portfw, and instead of ipautofw
  2671.   you type ipmasqadm autofw.
  2672.  
  2673.  
  2674.   6.7.  xosview is Broken!
  2675.  
  2676.   Upgrade to version 1.6.0 or above, which doesn't require any firewall
  2677.   rules at all for 2.1.x kernels.  This seems to have broken again in
  2678.   the 1.6.1 release; please bug the author (it's not my fault!).
  2679.  
  2680.  
  2681.   6.8.  Segmentation Fault With `-j REDIRECT'!
  2682.  
  2683.   This was a bug in ipchains version 1.3.3.  Please upgrade.
  2684.  
  2685.  
  2686.  
  2687.   6.9.  I Can't Set Masquerading Timeouts!
  2688.  
  2689.   True (for 2.1.x kernels) up to 2.1.123.  In 2.1.124, trying to set the
  2690.   masquerading timeouts causes a kernel lockup (change return to ret =
  2691.   on line 1328 of net/ipv4/ip_fw.c).  In 2.1.125, it works fine.
  2692.  
  2693.  
  2694.   6.10.  I Want to Firewall IPX!
  2695.  
  2696.   So do a number of others, it seems.  My code only covers IP,
  2697.   unfortunately.  On the good side, all the hooks are there to firewall
  2698.   IPX!  You just need to write the code; I will happily help where
  2699.   possible.
  2700.  
  2701.  
  2702.   7.  A Serious Example.
  2703.  
  2704.   This example was extracted from Michael Neuling and my March 1999
  2705.   LinuxWorld Tutorial; this is not the only way to solve the given
  2706.   problem, but it is probably the simplest.  I hope you will find it
  2707.   informative.
  2708.  
  2709.  
  2710.  
  2711.   7.1.  The Arrangement
  2712.  
  2713.  
  2714.   ╖  Masqueraded internal network (various operating systems), which we
  2715.      call "GOOD".
  2716.  
  2717.   ╖  Exposed servers in a separate network (called "DMZ" for
  2718.      Demilitarized Zone).
  2719.  
  2720.   ╖  PPP Connection to the Internet (called "BAD").
  2721.  
  2722.  
  2723.  
  2724.  
  2725.           External Network (BAD)
  2726.                   |
  2727.                   |
  2728.               ppp0|
  2729.            ---------------
  2730.            | 192.84.219.1|             Server Network (DMZ)
  2731.            |             |eth0
  2732.            |             |----------------------------------------------
  2733.            |             |192.84.219.250 |             |              |
  2734.            |             |               |             |              |
  2735.            |192.168.1.250|               |             |              |
  2736.            ---------------          --------       -------        -------
  2737.                   | eth1            | SMTP |       | DNS |        | WWW |
  2738.                   |                 --------       -------        -------
  2739.                   |              192.84.219.128  192.84.219.129  192.84.218.130
  2740.                   |
  2741.           Internal Network (GOOD)
  2742.  
  2743.  
  2744.  
  2745.  
  2746.  
  2747.   7.2.  Goals
  2748.  
  2749.  
  2750.   Packet Filter box:
  2751.  
  2752.       PING any network
  2753.         This is really useful to tell if a machine is down.
  2754.  
  2755.  
  2756.       TRACEROUTE any network
  2757.         Once again, useful for diagnosis.
  2758.  
  2759.  
  2760.       Access DNS
  2761.         To make ping and DNS more useful.
  2762.  
  2763.  
  2764.  
  2765.   Within the DMZ:
  2766.  
  2767.  
  2768.   Mail server
  2769.  
  2770.   ╖  SMTP to external
  2771.  
  2772.  
  2773.   ╖  Accept SMTP from internal and external
  2774.  
  2775.   ╖  Accept POP-3 from internal
  2776.  
  2777.   Name Server
  2778.  
  2779.   ╖  Send DNS to external
  2780.  
  2781.   ╖  Accept DNS from internal, external and packet filter box
  2782.  
  2783.  
  2784.   Web server
  2785.  
  2786.   ╖  Accept HTTP from internal and external
  2787.  
  2788.   ╖  Rsync access from internal
  2789.  
  2790.  
  2791.   Internal:
  2792.  
  2793.      Allow WWW, ftp, traceroute, ssh to external
  2794.         These are fairly standard things to allow: some places start by
  2795.         allowing the internal machines to do just about everything, but
  2796.         here we're being restrictive.
  2797.  
  2798.  
  2799.       Allow SMTP to Mail server
  2800.         Obviously, we want them to be able to send mail out.
  2801.  
  2802.  
  2803.       Allow POP-3 to Mail server
  2804.         This is how they read their mail.
  2805.  
  2806.  
  2807.       Allow DNS to Name server
  2808.         They need to be able to look up external names for WWW, ftp,
  2809.         traceroute and ssh.
  2810.  
  2811.  
  2812.       Allow rsync to Web server
  2813.         This is how they synchronize the external web server with the
  2814.         internal one.
  2815.  
  2816.  
  2817.       Allow WWW to Web server
  2818.         Obviously, they should be able to connect to our external web
  2819.         server.
  2820.  
  2821.  
  2822.       Allow ping to packet filter box
  2823.         This is a courteous thing to allow: it means that they can test
  2824.         if the firewall box is down (so we don't get blamed if an
  2825.         external site is broken).
  2826.  
  2827.  
  2828.  
  2829.   7.3.  Before Packet Filtering
  2830.  
  2831.  
  2832.   ╖  Anti-spoofing
  2833.  
  2834.  
  2835.      Since we don't have any asymmetric routing, we can simply turn on
  2836.      anti-spoofing for all interfaces.
  2837.  
  2838.  
  2839.        # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
  2840.        #
  2841.  
  2842.  
  2843.  
  2844.  
  2845.  
  2846.   ╖  Set filtering rules to DENY all:
  2847.  
  2848.  
  2849.      We still allow local loopback traffic, but deny anything else.
  2850.  
  2851.  
  2852.  
  2853.  
  2854.        # ipchains -A input -i ! lo -j DENY
  2855.        # ipchains -A output -i ! lo -j DENY
  2856.        # ipchains -A forward -j DENY
  2857.        #
  2858.  
  2859.  
  2860.  
  2861.  
  2862.  
  2863.   ╖  Set Up Interfaces
  2864.  
  2865.  
  2866.      This is usually done in the boot scripts.  Make sure the above
  2867.      steps are done before the interfaces are configured, to prevent
  2868.      packet leakage before the rules are set up.
  2869.  
  2870.  
  2871.   ╖  Insert per-protocol masquerading modules.
  2872.  
  2873.      We need to insert the masquerading module for FTP, so that active
  2874.      and passive FTP `just work' from the internal network.
  2875.  
  2876.  
  2877.  
  2878.  
  2879.        # insmod ip_masq_ftp
  2880.        #
  2881.  
  2882.  
  2883.  
  2884.  
  2885.  
  2886.   7.4.  Packet Filtering for Through Packets
  2887.  
  2888.   With masquerading, it's best to filter in the forward chain.
  2889.  
  2890.  
  2891.   Split forward chain into various user chains depending on source/dest
  2892.   interfaces; this breaks the problem down into managable chunks.
  2893.  
  2894.  
  2895.  
  2896.        ipchains -N good-dmz
  2897.        ipchains -N bad-dmz
  2898.        ipchains -N good-bad
  2899.        ipchains -N dmz-good
  2900.        ipchains -N dmz-bad
  2901.        ipchains -N bad-good
  2902.  
  2903.  
  2904.  
  2905.   ACCEPTing standard error ICMPs is a common thing to do, so we create a
  2906.   chain for it.
  2907.  
  2908.  
  2909.  
  2910.        ipchains -N icmp-acc
  2911.  
  2912.  
  2913.  
  2914.  
  2915.  
  2916.   7.4.1.  Set Up Jumps From forward Chain
  2917.  
  2918.   Unfortunately, we only know (in the forward chain) the outgoing
  2919.   interface.  Thus, to figure out what interface the packet came in on,
  2920.   we use the source address (the anti-spoofing prevents address faking).
  2921.  
  2922.  
  2923.   Note that we log anything which doesn't match any of these (obviously,
  2924.   this should never happen).
  2925.  
  2926.  
  2927.  
  2928.        ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
  2929.        ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
  2930.        ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
  2931.        ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
  2932.        ipchains -A forward -i eth0 -j bad-dmz
  2933.        ipchains -A forward -i eth1 -j bad-good
  2934.        ipchains -A forward -j DENY -l
  2935.  
  2936.  
  2937.  
  2938.  
  2939.  
  2940.   7.4.2.  Define the icmp-acc Chain
  2941.  
  2942.   Packets which are one of the error ICMPs get ACCEPTed, otherwise,
  2943.   control will pass back to the calling chain.
  2944.  
  2945.  
  2946.  
  2947.  
  2948.        ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
  2949.        ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
  2950.        ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
  2951.        ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT
  2952.  
  2953.  
  2954.  
  2955.  
  2956.  
  2957.   7.4.3.  Good (Internal) to DMZ (Servers)
  2958.  
  2959.   Internal restrictions:
  2960.  
  2961.   ╖  Allow WWW, ftp, traceroute, ssh to external
  2962.  
  2963.   ╖  Allow SMTP to Mail server
  2964.  
  2965.   ╖  Allow POP-3 to Mail server
  2966.  
  2967.   ╖  Allow DNS to Name server
  2968.  
  2969.   ╖  Allow rsync to Web server
  2970.  
  2971.   ╖  Allow WWW to Web server
  2972.  
  2973.   ╖  Allow ping to packet filter box
  2974.  
  2975.   Could do masquerading from internal network into DMZ, but here we
  2976.   don't.  Since noone in the internal network should be trying to do
  2977.   evil things, we log any packets that get denied.
  2978.  
  2979.  
  2980.  
  2981.  
  2982.        ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
  2983.        ipchains -A good-dmz -p tcp -d 192.84.219.128 pop-3 -j ACCEPT
  2984.        ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
  2985.        ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
  2986.        ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
  2987.        ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
  2988.        ipchains -A good-dmz -p icmp -j icmp-acc
  2989.        ipchains -A good-dmz -j DENY -l
  2990.  
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.   7.4.4.  Bad (external) to DMZ (servers).
  2997.  
  2998.  
  2999.  
  3000.   ╖  DMZ restrictions:
  3001.  
  3002.   ╖  Mail server
  3003.  
  3004.   ╖  SMTP to external
  3005.  
  3006.   ╖  Accept SMTP from internal and external
  3007.  
  3008.   ╖  Accept POP-3 from internal
  3009.  
  3010.  
  3011.   ╖  Name server
  3012.  
  3013.   ╖  Send DNS to external
  3014.  
  3015.   ╖  Accept DNS from internal, external and packet filter box
  3016.  
  3017.  
  3018.   ╖  Web server
  3019.  
  3020.   ╖  Accept HTTP from internal and external
  3021.  
  3022.   ╖  Rsync access from internal
  3023.  
  3024.  
  3025.   ╖  Things we allow from external network to DMZ.
  3026.  
  3027.   ╖  Don't log violations, as they may happen.
  3028.  
  3029.  
  3030.  
  3031.  
  3032.  
  3033.  
  3034.  
  3035.  
  3036.  
  3037.   ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
  3038.   ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
  3039.   ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
  3040.   ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
  3041.   ipchains -A bad-dmz -p icmp -j icmp-acc
  3042.   ipchains -A bad-dmz -j DENY
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048.   7.4.5.  Good (internal) to Bad (external).
  3049.  
  3050.  
  3051.   ╖  Internal restrictions:
  3052.  
  3053.   ╖  Allow WWW, ftp, traceroute, ssh to external
  3054.  
  3055.   ╖  Allow SMTP to Mail server
  3056.  
  3057.   ╖  Allow POP-3 to Mail server
  3058.  
  3059.   ╖  Allow DNS to Name server
  3060.  
  3061.   ╖  Allow rsync to Web server
  3062.  
  3063.   ╖  Allow WWW to Web server
  3064.  
  3065.   ╖  Allow ping to packet filter box
  3066.  
  3067.   ╖  Many people allow everything from the internal to external
  3068.      networks, then add restrictions.  We're being fascist.
  3069.  
  3070.   ╖  Log violations.
  3071.  
  3072.   ╖  Passive FTP handled by masq. module.
  3073.  
  3074.  
  3075.  
  3076.        ipchains -A good-bad -p tcp --dport www -j MASQ
  3077.        ipchains -A good-bad -p tcp --dport ssh -j MASQ
  3078.        ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
  3079.        ipchains -A good-bad -p tcp --dport ftp --j MASQ
  3080.        ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
  3081.        ipchains -A good-bad -j REJECT -l
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.   7.4.6.  DMZ to Good (internal).
  3088.  
  3089.  
  3090.  
  3091.   ╖  Internal restrictions:
  3092.  
  3093.   ╖  Allow WWW, ftp, traceroute, ssh to external
  3094.  
  3095.   ╖  Allow SMTP to Mail server
  3096.  
  3097.   ╖  Allow POP-3 to Mail server
  3098.  
  3099.   ╖  Allow DNS to Name server
  3100.  
  3101.   ╖  Allow rsync to Web server
  3102.  
  3103.   ╖  Allow WWW to Web server
  3104.  
  3105.   ╖  Allow ping to packet filter box
  3106.  
  3107.  
  3108.   ╖  If we were masquerading from the internal network to the DMZ,
  3109.      simply refuse any packets coming the other way. As it is, only
  3110.      allow packets which might be part of an established connection.
  3111.  
  3112.  
  3113.  
  3114.        ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
  3115.        ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
  3116.        ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
  3117.        ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
  3118.        ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
  3119.        ipchains -A dmz-good -p icmp -j icmp-acc
  3120.        ipchains -A dmz-bad -j DENY -l
  3121.  
  3122.  
  3123.  
  3124.  
  3125.  
  3126.   7.4.7.  DMZ to bad (external).
  3127.  
  3128.  
  3129.  
  3130.   ╖  DMZ restrictions:
  3131.  
  3132.   ╖  Mail server
  3133.  
  3134.   ╖  SMTP to external
  3135.  
  3136.   ╖  Accept SMTP from internal and external
  3137.  
  3138.   ╖  Accept POP-3 from internal
  3139.  
  3140.  
  3141.   ╖  Name server
  3142.  
  3143.   ╖  Send DNS to external
  3144.  
  3145.   ╖  Accept DNS from internal, external and packet filter box
  3146.  
  3147.  
  3148.   ╖  Web server
  3149.  
  3150.   ╖  Accept HTTP from internal and external
  3151.  
  3152.   ╖  Rsync access from internal
  3153.  
  3154.  
  3155.   ╖
  3156.  
  3157.  
  3158.        ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
  3159.        ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
  3160.        ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
  3161.        ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
  3162.        ipchains -A dmz-bad -p icmp -j icmp-acc
  3163.        ipchains -A dmz-bad -j DENY -l
  3164.  
  3165.  
  3166.  
  3167.  
  3168.  
  3169.   7.4.8.  Bad (external) to Good (internal).
  3170.  
  3171.  
  3172.  
  3173.   ╖  We don't allow anything (non-masqueraded) from the external network
  3174.      to the internal network
  3175.  
  3176.  
  3177.        ipchains -A bad-good -j REJECT
  3178.  
  3179.  
  3180.  
  3181.  
  3182.  
  3183.   7.4.9.  Packet Filtering for the Linux Box Itself
  3184.  
  3185.  
  3186.  
  3187.   ╖  If we want to use packet filtering on packets coming into the box
  3188.      itself, we need to do filtering in the input chain. We create one
  3189.      chain for each destination interface:
  3190.  
  3191.  
  3192.        ipchains -N bad-if
  3193.        ipchains -N dmz-if
  3194.        ipchains -N good-if
  3195.  
  3196.  
  3197.  
  3198.  
  3199.  
  3200.   ╖  Create jumps to them:
  3201.  
  3202.  
  3203.  
  3204.        ipchains -A input -d 192.84.219.1 -j bad-if
  3205.        ipchains -A input -d 192.84.219.250 -j dmz-if
  3206.        ipchains -A input -d 192.168.1.250 -j good-if
  3207.  
  3208.  
  3209.  
  3210.  
  3211.  
  3212.   7.4.9.1.  Bad (external) interface.
  3213.  
  3214.  
  3215.  
  3216.   ╖  Packet Filter box:
  3217.  
  3218.   ╖  PING any network
  3219.  
  3220.   ╖  TRACEROUTE any network
  3221.  
  3222.   ╖  Access DNS
  3223.  
  3224.  
  3225.   ╖  External interface also receives replies to masqueraded packets,
  3226.      and ICMP errors for them and PING replies.
  3227.  
  3228.  
  3229.  
  3230.  
  3231.  
  3232.  
  3233.  
  3234.  
  3235.   ipchains -A bad-if -i ! ppp0 -j DENY -l
  3236.   ipchains -A bad-if -p TCP --dport 61000:65096 -j ACCEPT
  3237.   ipchains -A bad-if -p UDP --dport 61000:65096 -j ACCEPT
  3238.   ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
  3239.   ipchains -A bad-if -j icmp-acc
  3240.   ipchains -A bad-if -j DENY
  3241.  
  3242.  
  3243.  
  3244.  
  3245.  
  3246.   7.4.9.2.  DMZ interface.
  3247.  
  3248.  
  3249.  
  3250.   ╖  Packet Filter box restrictions:
  3251.  
  3252.   ╖  PING any network
  3253.  
  3254.   ╖  TRACEROUTE any network
  3255.  
  3256.   ╖  Access DNS
  3257.  
  3258.  
  3259.   ╖  DMZ interface receives DNS replies, ping replies and ICMP errors.
  3260.  
  3261.  
  3262.  
  3263.        ipchains -A dmz-if -i ! eth0 -j DENY
  3264.        ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
  3265.        ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
  3266.        ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
  3267.        ipchains -A dmz-if -j icmp-acc
  3268.        ipchains -A dmz-if -j DENY -l
  3269.  
  3270.  
  3271.  
  3272.  
  3273.  
  3274.   7.4.9.3.  Good (internal) interface.
  3275.  
  3276.  
  3277.  
  3278.   ╖  Packet Filter box restrictions:
  3279.  
  3280.   ╖  PING any network
  3281.  
  3282.   ╖  TRACEROUTE any network
  3283.  
  3284.   ╖  Access DNS
  3285.  
  3286.  
  3287.   ╖  Internal restrictions:
  3288.  
  3289.   ╖  Allow WWW, ftp, traceroute, ssh to external
  3290.  
  3291.   ╖  Allow SMTP to Mail server
  3292.  
  3293.   ╖  Allow POP-3 to Mail server
  3294.  
  3295.   ╖  Allow DNS to Name server
  3296.  
  3297.   ╖  Allow rsync to Web server
  3298.  
  3299.   ╖  Allow WWW to Web server
  3300.  
  3301.   ╖  Allow ping to packet filter box
  3302.  
  3303.  
  3304.   ╖  Internal interface receives pings, ping replies and ICMP errors.
  3305.  
  3306.  
  3307.  
  3308.        ipchains -A good-if -i ! eth1 -j DENY
  3309.        ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
  3310.        ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
  3311.        ipchains -A good-if -j icmp-acc
  3312.        ipchains -A good-if -j DENY -l
  3313.  
  3314.  
  3315.  
  3316.  
  3317.  
  3318.   7.5.  Finally
  3319.  
  3320.  
  3321.   ╖  Delete blocking rules:
  3322.  
  3323.  
  3324.        ipchains -D input 1
  3325.        ipchains -D forward 1
  3326.        ipchains -D output 1
  3327.  
  3328.  
  3329.  
  3330.  
  3331.  
  3332.   8.  Appendix: Differences between ipchains and ipfwadm.
  3333.  
  3334.   Some of these changes are a result of kernel changes, and some a
  3335.   result of ipchains being different from ipfwadm.
  3336.  
  3337.  
  3338.  
  3339.   1. Many arguments have been remapped: capitals now indicates a
  3340.      command, and lower case now indicates an option.
  3341.  
  3342.   2. Arbitrary chains are supported, so even built-in chains have full
  3343.      names instead of flags (eg. `input' instead of `-I').
  3344.  
  3345.   3. The `-k' option has vanished: use `! -y'.
  3346.  
  3347.   4. The `-b' option actually inserts/appends/deletes two rules, rather
  3348.      than a single `bidirectional' rule.
  3349.  
  3350.   5. The `-b' option can be passed to `-C' to do two checks (one in each
  3351.      direction).
  3352.  
  3353.   6. The `-x' option to `-l' has been replaced by `-v'.
  3354.  
  3355.   7. Multiple source and destination ports are not supported anymore.
  3356.      Hopefully being able to negate the port range will somewhat make up
  3357.      for that.
  3358.  
  3359.   8. Interfaces can only be specified by name (not address).  The old
  3360.      semantics got silently changed in the 2.1 kernel series anyway.
  3361.  
  3362.   9. Fragments are examined, not automatically allowed through.
  3363.  
  3364.   10.
  3365.      Explicit accounting chains have been done away with.
  3366.  
  3367.   11.
  3368.      Arbitrary protocols over IP can be tested for.
  3369.  
  3370.   12.
  3371.      The old behavior of SYN and ACK matching (which was previously
  3372.      ignored for non-TCP packets) has changed; the SYN option is not
  3373.      valid for non-TCP-specific rules.
  3374.  
  3375.   13.
  3376.      Counters are now 64-bit on 32-bit machines, not 32-bit.
  3377.  
  3378.   14.
  3379.      Inverse options are now supported.
  3380.  
  3381.   15.
  3382.      ICMP codes are now supported.
  3383.  
  3384.   16.
  3385.      Wildcard interfaces are now supported.
  3386.  
  3387.   17.
  3388.      TOS manipulations are now sanity-checked: the old kernel code would
  3389.      silently stop you from (illegally) manipulating the `Must Be Zero'
  3390.      TOS bit; ipchains now returns an error if you try, as well as for
  3391.      other illegal cases.
  3392.  
  3393.  
  3394.   8.1.  Quick-Reference table.
  3395.  
  3396.   [ Mainly, command arguments are UPPER CASE, and option arguments are
  3397.   lower case ]
  3398.  
  3399.  
  3400.   One thing to note, masquerading is specified by `-j MASQ'; it is
  3401.   completely different from `-j ACCEPT', and not treated as merely a
  3402.   side-effect, unlike ipfwadm does.
  3403.  
  3404.  
  3405.  
  3406.  
  3407.  
  3408.  
  3409.  
  3410.  
  3411.  
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.  
  3418.  
  3419.  
  3420.  
  3421.  
  3422.  
  3423.  
  3424.  
  3425.  
  3426.  
  3427.  
  3428.  
  3429.  
  3430.  
  3431.  
  3432.  
  3433.   ================================================================
  3434.   | ipfwadm      | ipchains              | Notes
  3435.   ----------------------------------------------------------------
  3436.   | -A [both]    | -N acct               | Create an `acct' chain
  3437.   |              |& -I 1 input -j acct   | and have output and input
  3438.   |              |& -I 1 output -j acct  | packets traverse it.
  3439.   |              |& acct                 |
  3440.   ----------------------------------------------------------------
  3441.   | -A in        | input                 | A rule with no target
  3442.   ----------------------------------------------------------------
  3443.   | -A out       | output                | A rule with no target
  3444.   ----------------------------------------------------------------
  3445.   | -F           | forward               | Use this as [chain].
  3446.   ----------------------------------------------------------------
  3447.   | -I           | input                 | Use this as [chain].
  3448.   ----------------------------------------------------------------
  3449.   | -O           | output                | Use this as [chain].
  3450.   ----------------------------------------------------------------
  3451.   | -M -l        | -M -L                 |
  3452.   ----------------------------------------------------------------
  3453.   | -M -s        | -M -S                 |
  3454.   ----------------------------------------------------------------
  3455.   | -a policy    | -A [chain] -j POLICY  | (but see -r and -m).
  3456.   ----------------------------------------------------------------
  3457.   | -d policy    | -D [chain] -j POLICY  | (but see -r and -m).
  3458.   ----------------------------------------------------------------
  3459.   | -i policy    | -I 1 [chain] -j POLICY| (but see -r and -m).
  3460.   ----------------------------------------------------------------
  3461.   | -l           | -L                    |
  3462.   ----------------------------------------------------------------
  3463.   | -z           | -Z                    |
  3464.   ----------------------------------------------------------------
  3465.   | -f           | -F                    |
  3466.   ----------------------------------------------------------------
  3467.   | -p           | -P                    |
  3468.   ----------------------------------------------------------------
  3469.   | -c           | -C                    |
  3470.   ----------------------------------------------------------------
  3471.   | -P           | -p                    |
  3472.   ----------------------------------------------------------------
  3473.   | -S           | -s                    | Only takes one port or
  3474.   |              |                       | range, not multiples.
  3475.   ----------------------------------------------------------------
  3476.   | -D           | -d                    | Only takes one port or
  3477.   |              |                       | range, not multiples.
  3478.   ----------------------------------------------------------------
  3479.   | -V           | <none>                | Use -i [name].
  3480.   ----------------------------------------------------------------
  3481.   | -W           | -i                    |
  3482.   ----------------------------------------------------------------
  3483.   | -b           | -b                    | Now actually makes 2 rules.
  3484.   ----------------------------------------------------------------
  3485.   | -e           | -v                    |
  3486.   ----------------------------------------------------------------
  3487.   | -k           | ! -y                  | Doesn't work unless
  3488.   |              |                       | -p tcp also specified.
  3489.   ----------------------------------------------------------------
  3490.   | -m           | -j MASQ               |
  3491.   ----------------------------------------------------------------
  3492.   | -n           | -n                    |
  3493.   ----------------------------------------------------------------
  3494.   | -o           | -l                    |
  3495.   ----------------------------------------------------------------
  3496.   | -r [redirpt] | -j REDIRECT [redirpt] |
  3497.   ----------------------------------------------------------------
  3498.   | -t           | -t                    |
  3499.   ----------------------------------------------------------------
  3500.   | -v           | -v                    |
  3501.   ----------------------------------------------------------------
  3502.   | -x           | -x                    |
  3503.   ----------------------------------------------------------------
  3504.   | -y           | -y                    | Doesn't work unless
  3505.   |              |                       | -p tcp also specified.
  3506.   ----------------------------------------------------------------
  3507.  
  3508.  
  3509.  
  3510.  
  3511.   8.2.  Examples of translated ipfwadm commands
  3512.  
  3513.   Old command: ipfwadm -F  -p deny
  3514.  
  3515.   New command: ipchains -P forward DENY
  3516.  
  3517.  
  3518.   Old command: ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0
  3519.  
  3520.   New command: ipchains -A forward -j MASQ -s 192.168.0.0/24 -d
  3521.   0.0.0.0/0
  3522.  
  3523.  
  3524.   Old command: ipfwadm -I -a accept -V 10.1.2.1 -S 10.0.0.0/8 -D
  3525.   0.0.0.0/0
  3526.  
  3527.   New command: ipchains -A input -j ACCEPT -i eth0 -s 10.0.0.0/8 -d
  3528.   0.0.0.0/0
  3529.  
  3530.   (Note that there is no equivalent for specifying interfaces by
  3531.   address: use the interface name.  On this machine, 10.1.2.1
  3532.   corresponds to eth0).
  3533.  
  3534.  
  3535.   9.  Appendix: Using the ipfwadm-wrapper script.
  3536.  
  3537.   The ipfwadm-wrapper shell script should be a plug-in replacement of
  3538.   ipfwadm for backwards compatibility with ipfwadm 2.3a.
  3539.  
  3540.  
  3541.   The only feature it can't really handle is the `-V' option.  When this
  3542.   is used, a warning is given.  If the `-W' option is also used, the
  3543.   `-V' option is ignored.  Otherwise, the script tries to find the
  3544.   interface name associated with that address, using ifconfig.  If that
  3545.   fails (such as for an interface which is down) then it will exit with
  3546.   an error message.
  3547.  
  3548.  
  3549.   This warning can be suppressed by either changing the `-V' to a `-W',
  3550.   or directing the standard output of the script to /dev/null.
  3551.  
  3552.  
  3553.   If you should find any mistakes in this script, or any changes between
  3554.   the real ipfwadm and this script, please report a bug to me: send an
  3555.   EMail to ipchains@rustcorp.com with "BUG-REPORT" in the subject.
  3556.   Please list your old version of ipfwadm (ipfwadm -h), your version of
  3557.   ipchains (ipchains --version), the version of the ipfwadm wrapper
  3558.   script (ipfwadm-wrapper --version).  Also send the output of ipchains-
  3559.   save.  Thanks in advance.
  3560.  
  3561.  
  3562.   Mix ipchains with this ipfwadm-wrapper script at your own peril.
  3563.  
  3564.  
  3565.   10.  Appendix: Thanks.
  3566.  
  3567.   Many thanks have to go to Michael Neuling, who wrote the first
  3568.   releasable cut of the IP chains code while working for me.  Public
  3569.   apologies for nixing his result-caching idea, which Alan Cox later
  3570.   proposed and I have finally begun implementing, having seen the error
  3571.   of my ways.
  3572.  
  3573.  
  3574.   Thanks to Alan Cox for his 24-hour EMail tech support, and
  3575.   encouragement.
  3576.  
  3577.  
  3578.   Thanks to all the authors of the ipfw and ipfwadm code, especially Jos
  3579.   Vos.  Standing on the shoulders of giants and all that...  This
  3580.   applies to Linus Torvalds and all the kernel and userspace hackers as
  3581.   well.
  3582.  
  3583.  
  3584.   Thanks to the diligent beta testers and bughunters, especially Jordan
  3585.   Mendelson, Shaw Carruthers, Kevin Moule, Dr. Liviu Daia, Helmut Adams,
  3586.   Franck Sicard, Kevin Littlejohn, Matt Kemner, John D. Hardin, Alexey
  3587.   Kuznetsov, Leos Bitto, Jim Kunzman, Gerard Gerritsen, Serge Sivkov,
  3588.   Andrew Burgess, Steve Schmidtke, Richard Offer, Bernhard Weisshuhn,
  3589.   Larry Auton, Ambrose Li, Pavel Krauz, Steve Chadsey, Francesco
  3590.   Potorti` and Alain Knaff.
  3591.  
  3592.  
  3593.  
  3594.  
  3595.  
  3596.  
  3597.  
  3598.  
  3599.  
  3600.  
  3601.  
  3602.  
  3603.  
  3604.  
  3605.  
  3606.  
  3607.  
  3608.  
  3609.  
  3610.  
  3611.  
  3612.  
  3613.  
  3614.  
  3615.  
  3616.  
  3617.  
  3618.  
  3619.  
  3620.  
  3621.  
  3622.  
  3623.  
  3624.  
  3625.  
  3626.  
  3627.  
  3628.  
  3629.  
  3630.  
  3631.