Differences between current version and predecessor to the previous major change of HowToIPCHAINSHOWTO.
Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Friday, October 22, 2004 11:34:27 pm | by StuartYeates | |
Older page: | version 2 | Last edited on Friday, June 7, 2002 1:06:45 am | by perry | Revert |
@@ -1,5037 +1 @@
-
-
-
-Linux IPCHAINS-HOWTO
-
-
-
-----
-
-!!!Linux IPCHAINS-HOWTO
-
-!!Rusty Russellv1..8, Tue Jul 4 14:20:53 EST 2000
-
-
-----
-''This document aims to describe how to obtain, install and configure
-the enhanced IP firewalling chains software for Linux, and
-some ideas on how you might use them.''
-----
-
-
-
-
-!!1. Introduction
-
-
-*1.1 What?
-
-*1.2 Why?
-
-*1.3 How?
-
-*1.4 Where?
-
-
-
-
-
-!!2. Packet Filtering Basics
-
-
-*2.1 What?
-
-*2.2 Why?
-
-*2.3 How?
-
-
-
-
-
-!!3. I'm confused! Routing, masquerading, portforwarding, ipautofw...
-
-
-*3.1 Rusty's Three-Line Guide To Masquerading
-
-*3.2 Gratuitous Promotion: !WatchGuard Rules
-
-*3.3 Common Firewall-like Setups
-
-*3.4 More Information on Masquerading
-
-
-
-
-
-!!4. IP Firewalling Chains
-
-
-*4.1 How Packets Traverse The Filters
-
-*4.2 Useful Examples
-
-
-
-
-
-!!5. Miscellaneous.
-
-
-*5.1 How to Organize Your Firewall Rules
-
-*5.2 What Not To Filter Out
-
-*5.3 Filtering out Ping of Death
-
-*5.4 Filtering out Teardrop and Bonk
-
-*5.5 Filtering out Fragment Bombs
-
-*5.6 Changing Firewall Rules
-
-*5.7 How Do I Set Up IP Spoof Protection?
-
-*5.8 Advanced Projects
-
-*5.9 Future Enhancements
-
-
-
-
-
-!!6. Common Problems
-
-
-*6.1 ipchains -L Freezes!
-
-*6.2 Inverse doesn't work!
-
-*6.3 Masquerading/Forwarding Doesn't Work!
-
-*6.4 -j REDIR doesn't work!
-
-*6.5 Wildcard Interfaces Don't Work!
-
-*6.6 TOS Doesn't Work!
-
-*6.7 ipautofw and ipportfw Don't Work!
-
-*6.8 xosview is Broken!
-
-*6.9 Segmentation Fault With `-j REDIRECT'!
-
-*6.10 I Can't Set Masquerading Timeouts!
-
-*6.11 I Want to Firewall IPX!
-
-
-
-
-
-!!7. A Serious Example.
-
-
-*7.1 The Arrangement
-
-*7.2 Goals
-
-*7.3 Before Packet Filtering
-
-*7.4 Packet Filtering for Through Packets
-
-*7.5 Finally
-
-
-
-
-
-!!8. Appendix: Differences between ipchains and ipfwadm.
-
-
-*8.1 Quick-Reference table.
-
-*8.2 Examples of translated ipfwadm commands
-
-
-
-
-
-!!9. Appendix: Using the ipfwadm-wrapper script.
-
-
-
-
-!!10. Appendix: Thanks.
-
-
-*10.1 Translations
-
-----
-
-!! 1. Introduction
-
-
-This is the Linux IPCHAINS-HOWTO; see
-Where?
-for the master site, which contains the latest copy. You should read
-the Linux NET-3-HOWTO as well. The IP-Masquerading HOWTO, the
-PPP-HOWTO, the Ethernet-HOWTO and the Firewall HOWTO might make
-interesting reading. (Then again, so might the alt.fan.bigfoot FAQ).
-
-
-
-
-
-If packet filtering is passe to you, read Section
-Why?, Section
-How?, and
-scan through the titles in Section
-IP Firewalling Chains.
-
-
-
-
-
-If you are converting from ipfwadm, read Section
-Introduction, Section
-How?, and
-Appendices in section
-Differences between ipchains and ipfwadm and section
-Using the `ipfwadm-wrapper' script.
-
-
-
-
-!!1.1 What?
-
-
-
-Linux ipchains is a rewrite of the Linux IPv4 firewalling code
-(which was mainly stolen from BSD) and a rewrite of ipfwadm,
-which was a rewrite of BSD's ipfw, I believe. It is required to
-administer the IP packet filters in Linux kernel versions 2.1.102 and
-above.
-
-
-
-
-!! 1.2 Why?
-
-
-
-The older Linux firewalling code doesn't deal with fragments, has
-32-bit counters (on Intel at least), doesn't allow specification of
-protocols other than TCP, UDP or ICMP, can't make large changes
-atomically, can't specify inverse rules, has some quirks, and can be
-tough to manage (making it prone to user error).
-
-
-
-
-!!1.3 How?
-
-
-
-Currently the code is in the mainstream kernel from 2.1.102. For the
-2.0 kernel series, you will need to download a kernel patch from the
-web page. If your 2.0 kernel is more recent than the supplied patch,
-the older patch should be OK; this part of the 2.0 kernels is fairly
-stable (eg. the 2..34 kernel patch works just fine on the 2..35
-kernel). Since the 2.0 patch is incompatible with the ipportfw and
-ipautofw patches, I don't recommend applying it unless you really need
-some functionality that ipchains offers.
-
-
-
-
-!! 1.4 Where?
-
-
-
-The official page is in three places:
-Thanks to Penguin Computing
-Thanks to the SAMBA Team
-Thanks to Jim Pick
-
-
-
-
-There is a mailing list for bug reports, discussion, development and
-usage. Join the mailing list by sending a message containing the word
-``subscribe ipchains-list'' to subscribe at east.balius.com. To mail
-to everyone on the list use ipchains-list at east.balius.com.
-
-
-
-----
-
-!!2. Packet Filtering Basics
-
-!!2.1 What?
-
-
-
-All traffic through a network is sent in the form of __packets__. For
-example, downloading this package (say it's 50k long) might cause you
-to receive 36 or so packets of 1460 bytes each, (to pull numbers at
-random).
-
-
-
-
-
-The start of each packet says where it's going, where it came from,
-the type of the packet, and other administrative details. This start
-of the packet is called the __header__. The rest of the packet,
-containing the actual data being transmitted, is usually called the
-__body__.
-
-
-
-
-
-Some protocols, such __TCP__, which is used for web traffic, mail, and
-remote logins, use the concept of a `connection' -- before any packets
-with actual data are sent, various setup packets (with special
-headers) are exchanged saying `I want to connect', `OK' and `Thanks'.
-Then normal packets are exchanged.
-
-
-
-
-
-A packet filter is a piece of software which looks at the ''header''
-of packets as they pass through, and decides the fate of the entire
-packet. It might decide to __deny__ the packet (ie. discard the
-packet as if it had never received it), __accept__ the packet
-(ie. let the packet go through), or __reject__ the packet (like deny,
-but tell the source of the packet that it has done so).
-
-
-
-
-
-Under Linux, packet filtering is built into the kernel, and there are
-a few trickier things we can do with packets, but the general
-principle of looking at the headers and deciding the fate of the
-packet is still there.
-
-
-
-
-!!2.2 Why?
-
-
-
-Control. Security. Watchfulness.
-
-
-
-
-
-
-
-; __Control:__:
-
-when you are using a Linux box to connect your internal
-network to another network (say, the Internet) you have an opportunity
-to allow certain types of traffic, and disallow others. For example,
-the header of a packet contains the destination address of the packet,
-so you can prevent packets going to a certain part of the outside
-network. As another example, I use Netscape to access the Dilbert
-archives. There are advertisements from doubleclick.net on the page,
-and Netscape wastes my time by cheerfully downloading them.
-Telling the packet filter not to allow any packets to or from the
-addresses owned by doubleclick.net solves that problem (there are
-better ways of doing this though).
-
-
-
-; __Security:__:
-
-when your Linux box is the only thing between the
-chaos of the Internet and your nice, orderly network, it's nice to
-know you can restrict what comes tromping in your door. For example,
-you might allow anything to go out from your network, but you might be
-worried about the well-known `Ping of Death' coming in from malicious
-outsiders. As another example, you might not want outsiders
-telnetting to your Linux box, even though all your accounts have
-passwords; maybe you want (like most people) to be an observer on the
-Internet, and not a server (willing or otherwise) -- simply don't let
-anyone connect in, by having the packet filter reject incoming packets
-used to set up connections.
-
-
-
-; __Watchfulness:__:
-
-sometimes a badly configured machine on the local
-network will decide to spew packets to the outside world. It's nice
-to tell the packet filter to let you know if anything abnormal occurs;
-maybe you can do something about it, or maybe you're just curious by
-nature.
-
-
-
-
-
-!! 2.3 How?
-
-
-!A Kernel With Packet Filtering
-
-
-You need a kernel which has the new IP firewall chains in it.
-You can tell if the kernel you are running right now has this
-installed by looking for the file `/proc/net/ip_fwchains'. If it
-exists, you're in.
-
-
-
-
-
-If not, you need to make a kernel that has IP firewall chains.
-First, download the source to the kernel you want. If you have a
-kernel numbered 2.1.102 or higher, you won't need to patch it (it's in
-the mainstream kernel now). Otherwise, apply the patch from the web
-page listed above, and set the configuration as detailed below. If
-you don't know how to do this, don't panic -- read the Kernel-HOWTO.
-
-
-
-
-
-
-
-
-The configuration options you will need to set ''for the 2.-series
-kernel'' are:
-
-
-
-----
-
-CONFIG_EXPERIMENTAL=y
-CONFIG_FIREWALL=y
-CONFIG_IP_FIREWALL=y
-CONFIG_IP_FIREWALL_CHAINS=y
-
-----
-
-
-For the ''2.1 or 2.2 series kernels'':
-----
-
-CONFIG_FIREWALL=y
-CONFIG_IP_FIREWALL=y
-
-----
-
-
-
-
-
-The tool ipchains talks to the kernel and tells it what packets to
-filter. Unless you are a programmer, or overly curious, this is how
-you will control the packet filtering.
-
-
-
-
-!ipchains
-
-
-The ipchains tool inserts and deletes rules from the kernel's packet
-filtering section. This means that whatever you set up, it will be
-lost upon reboot; see
-Making Rules Permanent
-for how to make sure they are restored the next time Linux is booted.
-
-
-
-
-
-ipchains replaces ipfwadm, which was used for the
-old IP Firewall code. There is a set of useful scripts available from
-the ipchains ftp site:
-
-
-
-http://netfilter.filewatcher.org/ipchains/ipchains-scripts-1.1.2.tar.gz
-
-
-
-
-This contains a shell script called ipfwadm-wrapper which
-allows you to do packet filtering as it was done before. You probably
-shouldn't use this script unless you want a quick way of upgrading a
-system which uses ipfwadm (it's slower, and doesn't check
-arguments, etc). In that case, you don't need this HOWTO much either.
-
-
-See Appendix
-Differences between ipchains and ipfwadm
-and Appendix
-Using the `ipfwadm-wrapper' script
-for more details on ipfwadm issues.
-
-
-
-
-! Making Rules Permanent
-
-
-Your current firewall setup is stored in the kernel, and thus will
-be lost on reboot. I recommend using the `ipchains-save' and
-`ipchains-restore' scripts to make your rules permanent. To do this,
-set up your rules, then run (as root):
-
-
-
-
-
-# ipchains-save > /etc/ipchains.rules
-#
-
-
-
-
-Create a script like the following:
-
-
-
-
-
-#! /bin/sh
-# Script to control packet filtering.
-# If no rules, do nothing.
-
[[ -f /etc/ipchains.rules
] || exit
-case "$1" in
-start)
-echo -n "Turning on packet filtering:"
-/sbin/ipchains-restore < /etc/ipchains.rules || exit 1
-echo 1 > /proc/sys/net/ipv4/ip_forward
-echo "."
-;;
-stop)
-echo -n "Turning off packet filtering:"
-echo 0 > /proc/sys/net/ipv4/ip_forward
-/sbin/ipchains -F
-/sbin/ipchains -X
-/sbin/ipchains -P input ACCEPT
-/sbin/ipchains -P output ACCEPT
-/sbin/ipchains -P forward ACCEPT
-echo "."
-;;
-*)
-echo "Usage: /etc/init.d/packetfilter {start|stop}"
-exit 1
-;;
-esac
-exit
-
-
-
-
-Make sure this is run early in the bootup procedure. In my case
-(Debian 2.1), I make a symbolic link called `S39packetfilter' in the
-`/etc/rcS.d' directory (this will be run before S40network).
-
-
-
-----
-
-!!3. I'm confused! Routing, masquerading, portforwarding, ipautofw...
-
-
-This HOWTO is about packet filtering. This means deciding whether a
-packet should be allowed to pass or not. However, Linux being the
-hacker's playground that it is, you probably want to do more than
-that.
-
-
-
-
-
-One problem is that the same tool (``ipchains'') is used to control
-both masquerading and transparent proxying, although these are
-notionally separate from packet filtering (the current Linux
-implementation blurs these together unnaturally, leaving the
-impression that they are closely related).
-
-
-
-
-
-Masquerading and proxying are covered by separate HOWTOs, and the auto
-forwarding and port forwarding features are controlled by separate
-tools, but since so many people keep asking me about it, I'll include
-a set of common scenarios and indicate when each one should be
-applied. The security merits of each setup will not be discussed
-
here.
-
-
-
-
-!!3.1 Rusty's Three-Line Guide To Masquerading
-
-
-
-This assumes that your __external__ interface is called `ppp0'.
-Use ifconfig to find out, and adjust to taste.
-
-
-
-
-
-# ipchains -P forward DENY
-# ipchains -A forward -i ppp0 -j MASQ
-# echo 1 > /proc/sys/net/ipv4/ip_forward
-
-
-
-
-
-
-!!3.2 Gratuitous Promotion: !WatchGuard Rules
-
-
-
-You can buy off-the-shelf firewalls. An excellent one is !WatchGuard's
-!FireBox. It's excellent because I like it, it's secure, it's
-Linux-based, and because they funded the maintenance of ipchains as
-well as the new firewalling code (for 2.4). In short, !WatchGuard were
-paying for me to eat while I work for you. So please consider their
-stuff.
-
-
-
-http://www.watchguard.com
-
-
-
-!!3.3 Common Firewall-like Setups
-
-
-
-You run littlecorp.com. You have an internal network, and a single
-dialup (PPP) connection to the Internet (firewall.littlecorp.com which
-is 1.2.3.4). You run Ethernet on your local network, and your
-personal machine is called "myhost".
-
-
-
-
-
-This section will illustrate the different arrangement which are
-common. Read carefully, because they are each subtly different.
-
-
-
-
-!Private Network: Traditional Proxies
-
-
-In this scenario, packets from the private network never traverse the
-Internet, and vice versa. The IP addresses of the private network
-should be assigned from the RFC1918 Address Allocation for Private
-Internets (ie. 10.*.*.*, 172.16.*.*-172.31.*.* or 192.168.*.*).
-
-
-
-
-
-The only way things ever connect to the Internet is by connecting to
-the firewall, which is the only machine on both networks which
-connects onwards. You run a program (on the firewall) called a proxy
-to do this (there are proxies for FTP, web access, telnet, !RealAudio,
-Usenet News and other services). See the Firewall HOWTO.
-
-
-
-
-
-Any services you wish the Internet to access must be on the firewall.
-(But see
-Limited Internal Services
-below).
-
-
-
-
-
-Example: Allowing web access from private network to the Internet.
-
-
-# The private network is assigned 192.168.1.* addresses, with
-myhost being 192.168.1.100, and the firewall's Ethernet interface
-being assigned 192.168.1.1.
-
-#
-
-# A web proxy (eg. "squid") is installed and configured on the
-firewall, say running on port 8080.
-
-#
-
-# Netscape on the private network is configured to use the
-firewall port 8080 as a proxy.
-
-#
-
-# DNS does not need to be configured on the private network.
-
-#
-
-# DNS does need to be configured on the firewall.
-
-#
-
-# No default route (aka gateway) needs to be configured on the
-private network.
-#
-
-
-
-
-
-
-Netscape on myhost reads http://slashdot.org.
-
-
-# Netscape connects to the firewall port 8080, using port 1050 on
-myhost. It asks for the web page of "http://slashdot.org".
-
-#
-
-# The proxy looks up the name "slashdot.org", and gets
-207.218.152.131. It then opens a connection to that IP address (using
-port 1025 on the firewall's external interface), and asks the web
-server (port 80) for the web page.
-
-#
-
-# As it receives the web page from its connection to the web
-server, it copies the data to the connection from Netscape.
-
-#
-
-# Netscape renders the page.
-#
-
-
-
-ie. From slashdot.org's point of view, the connection is made from
-1.2.3.4 (firewall's PPP interface) port 1025 to 207.218.152.131
-(slashdot.org) port 80. From myhost's point of view, the connection
-is made from 192.168.1.100 (myhost) port 1050, to 192.168.1.1
-(firewall's Ethernet interface) port 8080.
-
-
-
-
-
-
-
-!Private Network: Transparent Proxies
-
-
-In this scenario, packets from the private network never traverse the
-Internet, and vice versa. The IP addresses of the private network
-should be assigned from the RFC1918 Address Allocation for Private
-Internets (ie. 10.*.*.*, 172.16.*.*-172.31.*.* or 192.168.*.*).
-
-
-
-
-
-The only way things ever connect to the Internet is by connecting to
-the firewall, which is the only machine on both networks, which
-connects onwards. You run a program (on the firewall) called a
-transparent proxy to do this; the kernel sends outgoing packets to the
-transparent proxy instead of sending them onwards (ie. it bastardizes
-routing).
-
-
-
-
-
-Transparent proxying means that the clients don't need to know there
-is a proxy involved.
-
-
-
-
-
-Any services you wish the Internet to access must be on the firewall.
-(But see
-Limited Internal Services
-below).
-
-
-
-
-
-Example: Allowing web access from private network to the Internet.
-
-
-# The private network is assigned 192.168.1.* addresses, with
-myhost being 192.168.1.100, and the firewall's Ethernet interface
-being assigned 192.168.1.1.
-
-#
-
-# A transparent web proxy (I believe there are patches for squid
-to allow it to operate in this manner, or try "transproxy") is
-installed and configured on the firewall, say running on port 8080.
-
-#
-
-# The kernel is told to redirect connections to port 80 to the
-proxy, using ipchains.
-
-#
-
-# Netscape on the private network is configured to connect directly.
-
-#
-
-# DNS needs to be configured on the private network (ie. you need
-to run a DNS server as a proxy on the firewall).
-
-#
-
-# The default route (aka gateway) needs to be configured on the
-private network, to send packets to the firewall.
-#
-
-
-
-
-
-
-Netscape on myhost reads http://slashdot.org.
-
-
-# Netscape looks up the name "slashdot.org", and gets
-207.218.152.131. It then opens a connection to that IP address, using
-local port 1050, and asks the web server (port 80) for the web page.
-
-#
-
-# As the packets from myhost (port 1050) to slashdot.org (port
-80) pass through the firewall, they are redirected to the waiting
-transparent proxy on port 8080. The transparent proxy opens a
-connection (using local port 1025) to 207.218.152.131 port 80 (which
-is where the original packets were going).
-
-#
-
-# As the proxy receives the web page from its connection to the
-web server, it copies the data to the connection from Netscape.
-
-#
-
-# Netscape renders the page.
-#
-
-
-
-ie. From slashdot.org's point of view, the connection is made from
-1.2.3.4 (firewall's PPP interface) port 1025 to 207.218.152.131
-(slashdot.org) port 80. From myhost's point of view, the connection
-is made from 192.168.1.100 (myhost) port 1050, to 207.218.152.131
-(slashdot.org) port 80, but it's actually talking to the transparent
-proxy.
-
-
-
-
-!Private Network: Masquerading
-
-
-In this scenario, packets from the private network never traverse the
-Internet without special treatment, and vice versa. The IP addresses
-of the private network should be assigned from the RFC1918 Address
-Allocation for Private Internets (ie. 10.*.*.*, 172.16.*.*-172.31.*.*
-or 192.168.*.*).
-
-
-
-
-
-Instead of using a proxy, we use a special kernel facility called
-"masquerading". Masquerading rewrites packets as they pass through
-the firewall, so that they always seem to come from the firewall
-itself. It then rewrites the responses so that they look like they
-are going to the original recipient.
-
-
-
-
-
-Masquerading has separate modules to handle "tricky" protocols, such
-as FTP, !RealAudio, Quake, etc. For really hard-to-handle protocols,
-the "auto forwarding" facility can handle some of them by
-automatically setting up port forwarding for related sets of ports:
-look for ``ipportfw'' (2.0 kernels) or ``ipmasqadm'' (2.1 kernels).
-
-
-
-
-
-Any services you wish the Internet to access must be on the firewall.
-(But see
-Limited Internal Services
-below).
-
-
-
-
-
-Example: Allowing web access from private network to the Internet.
-
-
-# The private network is assigned 192.168.1.* addresses, with
-myhost being 192.168.1.100, and the firewall's Ethernet interface
-being assigned 192.168.1.1.
-
-#
-
-# The firewall is set up to masquerade any packets coming from
-the private network and going to port 80 on an Internet host.
-
-#
-
-# Netscape is configured to connect directly.
-
-#
-
-# DNS must be configured correctly on the private network.
-
-#
-
-# The firewall should be the default route (aka gateway) for the
-private network.
-#
-
-
-
-Netscape on myhost reads http://slashdot.org.
-
-
-# Netscape looks up the name "slashdot.org", and gets
-207.218.152.131. It then opens a connection to that IP address, using
-local port 1050, and asks the web server (port 80) for the web page.
-
-#
-
-# As the packets from myhost (port 1050) to slashdot.org (port
-80) pass through the firewall, they are rewritten to come from the PPP
-interface of the firewall, port 65000. The firewall has a valid
-Internet address (1.2.3.4) so reply packets from slashdot.org get
-routed back OK.
-
-#
-
-# As packets from slashdot.org (port 80) to
-firewall.littlecorp.com (port 65000) come in, they are rewritten to go
-to myhost, port 1050. This is the real magic of masquerading: it
-remembers when it rewrites outgoing packets to it can write them back
-as replies come in.
-
-#
-
-# Netscape renders the page.
-#
-
-
-
-ie. From the slashdot.org's point of view, the connection is made
-from 1.2.3.4 (firewall's PPP interface) port 65000 to 207.218.152.131
-(slashdot.org) port 80. From the myhost's point of view, the
-connection is made from 192.168.1.100 (myhost) port 1050, to
-207.218.152.131 (slashdot.org) port 80.
-
-
-
-
-
-
-
-!Public Network
-
-
-In this scenario, your personal network is a part of the Internet:
-packets can flow without change across both networks. The IP
-addresses of the internal network must be assigned by applying for a
-block of IP addresses, so the rest of the network will know how to get
-packets to you. This implies a permanent connection.
-
-
-
-
-
-In this role, packet filtering is used to restrict which packets can
-be forwarded between your network and the rest of the Internet, eg. to
-restrict the rest of the Internet to only accessing your internal web
-servers.
-
-
-
-
-
-Example: Allowing web access from private network to the Internet.
-
-
-# Your internal network is assigned according to the IP address
-block you have registered, (say 1.2.3.*).
-
-#
-
-# The firewall is set up to allow all traffic.
-
-#
-
-# Netscape is configured to connect directly.
-
-#
-
-# DNS must be configured correctly on your network.
-
-#
-
-# The firewall should be the default route (aka gateway) for the
-private network.
-#
-
-
-
-Netscape on myhost reads http://slashdot.org.
-
-
-# Netscape looks up the name "slashdot.org", and gets
-207.218.152.131. It then opens a connection to that IP address, using
-local port 1050, and asks the web server (port 80) for the web page.
-
-#
-
-# Packets pass through your firewall, just as they pass through
-several other routers between you and slashdot.org.
-
-#
-
-# Netscape renders the page.
-#
-
-
-
-ie. There is only one connection: from 1.2.3.100 (myhost) port
-1050, to 207.218.152.131 (slashdot.org) port 80.
-
-
-
-
-! Limited Internal Services
-
-
-There are a few tricks you can pull to allow the Internet to access
-your internal services, rather than running the services on the
-firewall. These will work with either a proxy or masquerading based
-approach for external connections.
-
-
-
-
-
-The simplest approach is to run a "redirector", which is a poor-man's
-proxy which waits for a connection on a given port, and then open a
-connection a fixed internal host and port, and copies data between the
-two connections. An example of this is the "redir" program. From the
-Internet point of view, the connection is made to your firewall.
-From your internal server's point of view, the connection is made from
-the internal interface of the firewall to the server.
-
-
-
-
-
-Another approach (which requires a 2.0 kernel patched for ipportfw, or
-a 2.1 or later kernel) is to use port forwarding in the kernel. This
-does the same job as "redir" in a different way: the kernel rewrites
-packets as they pass through, changing their destination address and
-ports to point them at an internal host and port. From the Internet's
-point of view, the connection is made to your firewall. From your
-internal server's point of view, a direct connection is made from the
-Internet host to the server.
-
-
-
-
-!!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
-
-
-
-http://www.linuxdoc.org/HOWTO/IP-Masquerade-HOWTO.html
-
-
-
-
-The official Masquerading home page is at
-
-
-
-http://ipmasq.cjb.net
-
-
-
-
-
-----
-
-!! 4. IP Firewalling Chains
-
-
-This section describes all you really need to know to build a packet
-filter that meets your needs.
-
-
-
-
-!!4.1 How Packets Traverse The Filters
-
-
-
-The kernel starts with three lists of rules; these lists are called
-__firewall chains__ or just __chains__. The three chains are
-called __input__, __output__ and __forward__. When a packet comes
-in (say, through the Ethernet card) the kernel uses the input
-chain to decide its fate. If it survives that step, then the kernel
-decides where to send the packet next (this is called __routing__).
-If it is destined for another machine, it consults the forward
-chain. Finally, just before a packet is to go out, the kernel
-consults the output chain.
-
-
-
-
-
-A chain is a checklist of __rules__. Each rule says `if the packet
-header looks like this, then here's what to do with the packet'. If
-the rule doesn't match the packet, then the next rule in the chain is
-consulted. Finally, if there are no more rules to consult, then the
-kernel looks at the chain __policy__ to decide what to do. In a
-security-conscious system, this policy usually tells the kernel to
-reject or deny the packet.
-
-
-
-
-
-For ASCII-art fans, this shown the complete path of a packet coming
-into a machine.
-
-
-
-
-----------------------------------------------------------------
-| ACCEPT/ lo interface |
-v REDIRECT _______ |
---> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
-h a |input | e {Routing } |Chain | |output |ACCEPT
-e n |Chain | m {Decision} |_______| --->|Chain |
-c i |______| a ~~~~~~~~ | | ->|_______|
-k t | s | | | | |
-s y | q | v | | |
-u | v e v DENY/ | | v
-m | DENY/ r Local Process REJECT | | DENY/
-| v REJECT a | | | REJECT
-| DENY d --------------------- |
-v e -----------------------------
-DENY
-
-Here is a blow-by-blow description of each stage:
-
-
-
-
-; __Checksum:__:
-
-This is a test that the packet hasn't been corrupted
-in some way. If it has, it is denied.
-
-
-
-; __Sanity:__:
-
-There is actually one of these sanity checks before each
-firewall chain, but the input chain's is the most important. Some
-malformed packets might confuse the rule-checking code, and these are
-denied here (a message is printed to the syslog if this happens).
-
-
-
-; __input chain:__:
-
-This is the first firewall chain against which the
-packet will be tested. If the verdict of the chain is not DENY
-or REJECT, the packet continues on.
-
-
-
-; __Demasquerade:__:
-
-If the packet is a reply to a previously
-masqueraded packet, it is demasqueraded, and skips straight to the
-output chain. If you don't use IP Masquerading, you can mentally
-erase this from the diagram.
-
-
-
-; __Routing decision:__:
-
-The destination field is examined by the
-routing code, to decide if this packet should go to a local process
-(see Local process below) or forwarded to a remote machine (see forward
-chain below).
-
-
-
-; __Local process:__:
-
-A process running on the machine can receive
-packets after the Routing Decision step, and can send packets (which
-go through the Routing Decision step, then traverse the output chain).
-
-
-
-; __lo interface:__:
-
-If packets from a local process are destined for a
-local process, they will go through the output chain with interface
-set to `lo', then return through the input chain with interface also
-`lo'. The lo interface is usually called the loopback interface.
-
-
-
-; __local:__:
-
-If the packet was not created by a local process, then
-the forward chain is checked, otherwise the packet goes to the output
-chain.
-
-
-
-; __forward chain:__:
-
-This chain is traversed for any packets which are
-attempting to pass through this machine to another.
-
-
-
-; __output chain:__:
-
-This chain is traversed for all packets just
-before they are sent out.
-
-
-
-
-
-!Using ipchains
-
-
-First, check that you have the version of ipchains that this document
-refers to:
-
-
-
-
-
-$ ipchains --version
-ipchains 1.3.9, 17-Mar-1999
-
-
-
-
-
-
-
-Note that I recommend 1.3.4 (which has no long options, like
-`--sport'), or 1.3.8 or above; these are very stable.
-
-
-
-
-
-ipchains has a fairly detailed manual page (man ipchains),
-and if you need more detail on particulars, you can check out the
-programming interface (man 4 ipfw), or the file
-net/ipv4/ip_fw.c in the 2.1.x kernel source, which is
-(obviously) authoritative.
-
-
-
-
-
-There is also an excellent quick reference card by Scott Bronson in
-the source package, in both A4 and US Letter !PostScript(TM).
-
-
-
-
-
-There are several different things you can do with ipchains.
-First the operations to manage whole chains. You start with three
-built-in chains input, output and forward
-which you can't delete.
-
-
-
-
-
-# Create a new chain (-N).
-#
-
-# Delete an empty chain (-X).
-#
-
-# Change the policy for a built-in chain. (-P).
-#
-
-# List the rules in a chain (-L).
-#
-
-# Flush the rules out of a chain (-F).
-#
-
-# Zero the packet and byte counters on all rules in a chain (-Z).
-#
-
-
-
-There are several ways to manipulate rules inside a chain:
-
-
-
-
-
-# Append a new rule to a chain (-A).
-#
-
-# Insert a new rule at some position in a chain (-I).
-#
-
-# Replace a rule at some position in a chain (-R).
-#
-
-# Delete a rule at some position in a chain (-D).
-#
-
-# Delete the first rule that matches in a chain (-D).
-#
-
-
-
-There are a few operations for masquerading, which are in
-ipchains for want of a good place to put them:
-
-
-
-
-
-# List the currently masqueraded connections (-M -L).
-#
-
-# Set masquerading timeout values (-M -S). (But see
-I can't set masquerading timeouts!).
-#
-
-
-
-The final (and perhaps the most useful) function allows you to check
-what would happen to a given packet if it were to traverse a given
-chain.
-
-
-
-
-!What You'll See When Your Computer Starts Up
-
-
-Before any ipchains commands have been run (be careful: some
-distributions run ipchains in their initialization scripts), there
-will be no rules in any of the built-in chains (`input', `forward' and
-`output'), and each of the chains will have a policy of ACCEPT. This
-is as wide-open as you can get.
-
-
-
-
-!Operations on a Single Rule
-
-
-This is the bread-and-butter of ipchains; manipulating rules. Most
-commonly, you will probably use the append (-A) and delete (-D)
-commands. The others (-I for insert and -R for replace) are simple
-extensions of these concepts.
-
-
-
-
-
-Each rule specifies a set of conditions the packet must meet, and what
-to do if it meets them (a `target'). For example, you might want to
-deny all ICMP packets coming from the IP address 127...1. So in
-this case our conditions are that the protocol must be ICMP and that
-the source address must be 127...1. Our target is `DENY'.
-
-
-
-
-
-127...1 is the `loopback' interface, which you will have even if you
-have no real network connection. You can use the `ping' program to
-generate such packets (it simply sends an ICMP type 8 (echo request)
-which all cooperative hosts should obligingly respond to with an ICMP
-type 0 (echo reply) packet). This makes it useful for testing.
-
-
-
-
-
-# ping -c 1 127...1
-PING 127...1 (127...1): 56 data bytes
-64 bytes from 127...1: icmp_seq=0 ttl=64 time=.2 ms
---- 127...1 ping statistics ---
-1 packets transmitted, 1 packets received, % packet loss
-round-trip min/avg/max = .2/.2/.2 ms
-# ipchains -A input -s 127...1 -p icmp -j DENY
-# ping -c 1 127...1
-PING 127...1 (127...1): 56 data bytes
---- 127...1 ping statistics ---
-1 packets transmitted, 0 packets received, 100% packet loss
-#
-
-
-
-
-You can see here that the first ping succeeds (the `-c 1' tells ping
-to only send a single packet).
-
-
-
-
-
-Then we append (-A) to the `input' chain, a rule specifying that for
-packets from 127...1 (`-s 127...1') with protocol ICMP (`-p ICMP')
-we should jump to DENY (`-j DENY').
-
-
-
-
-
-Then we test our rule, using the second ping. There will be a pause
-before the program gives up waiting for a response that will never
-come.
-
-
-
-
-
-We can delete the rule in one of two ways. Firstly, since we know
-that it is the only rule in the input chain, we can use a numbered
-delete, as in:
-
-
-# ipchains -D input 1
-#
-
-
-To delete rule number 1 in the input chain.
-
-
-
-
-
-The second way is to mirror the -A command, but replacing the -A with
--D. This is useful when you have a complex chain of rules and you
-don't want to have to count them to figure out that it's rule 37 that
-you want to get rid of. In this case, we would use:
-
-
-# ipchains -D input -s 127...1 -p icmp -j DENY
-#
-
-
-The syntax of -D must have exactly the same options as the -A (or -I
-or -R) command. If there are multiple identical rules in the same
-chain, only the first will be deleted.
-
-
-
-
-!Filtering Specifications
-
-
-We have seen the use of `-p' to specify protocol, and `-s' to specify
-source address, but there are other options we can use to specify
-packet characteristics. What follows is an exhaustive compendium.
-
-
-
-
-!Specifying Source and Destination IP Addresses
-
-
-Source (-s) and destination (-d) IP addresses can be specified in four
-ways. The most common way is to use the full name, such as
-`localhost' or `www.linuxhq.com'. The second way is to specify the IP
-address such as `127...1'.
-
-
-
-
-
-The third and fourth ways allow specification of a group of IP
-addresses, such as `199.95.207./24' or `199.95.207./255.255.255.'.
-These both specify any IP address from 199.95.207.0 to 199.95.207.255
-inclusive; the digits after the `/' tell which parts of the IP address
-are significant. `/32' or `/255.255.255.255' is the default (match
-all of the IP address). To specify any IP address at all `/' can be
-used, like so:
-
-
-# ipchains -A input -s /0 -j DENY
-#
-
-
-
-
-This is rarely used, as the effect above is the same as not specifying
-the `-s' option at all.
-
-
-
-
-!Specifying Inversion
-
-
-Many flags, including the `-s' and `-d' flags can have their arguments
-preceded by `!' (pronounced `not') to match addresses NOT equal to the
-ones given. For example. `-s ! localhost' matches any packet not
-coming from localhost.
-
-
-
-
-
-Don't forget the spaces around the `!': they really are needed.
-
-
-
-
-!Specifying Protocol
-
-
-The protocol can be specified with the `-p' flag. Protocol can be a
-number (if you know the numeric protocol values for IP) or a name for
-the special cases of `TCP', `UDP' or `ICMP'. Case doesn't matter, so
-`tcp' works as well as `TCP'.
-
-
-
-
-
-The protocol name can be prefixed by a `!', to invert it, such as `-p
-! TCP'.
-
-
-
-
-!Specifying UDP and TCP Ports
-
-
-For the special case where a protocol of TCP or UDP is specified,
-there can be an extra argument indicating the TCP or UDP port, or an
-(inclusive) range of ports (but see
-Handling Fragments below). A range is represented using a `:'
-character, such as `6000:6010', which covers 11 port numbers, from
-6000 to 6010 inclusive. If the lower bound is omitted, it defaults to
-. If the upper bound is omitted, it defaults to 65535. So to
-specify TCP connections coming from ports under 1024, the syntax would
-be as `-p TCP -s .../0 :1023'. Port numbers can be specified by
-name, eg. `www'.
-
-
-
-
-
-Note that the port specification can be preceded by a `!', which
-inverts it. So to specify every TCP packet BUT a WWW packet, you
-would specify
-
--p TCP -d .../0 ! www
-
-
-
-It is important to realize that the specification
-
-
-
-
--p TCP -d ! 192.168.1.1 www
-
-
-
-is very different from
-
--p TCP -d 192.168.1.1 ! www
-
-
-
-The first specifies any TCP packet to the WWW port on any machine but
-192.168.1.1. The second specifies any TCP connection to any port on
-192.168.1.1 but the WWW port.
-
-
-
-
-
-Finally, this case means not the WWW port and not 192.168.1.1:
-
--p TCP -d ! 192.168.1.1 ! www
-
-
-
-
-
-!Specifying ICMP Type and Code
-
-
-ICMP also allows an optional argument, but as ICMP doesn't have ports,
-(ICMP has a __type__ and a __code__) they have a different meaning.
-
-
-
-
-
-You can specify them as ICMP names (use ipchains -h icmp to list the
-names) after the `-s' option, or as a numeric ICMP type and code,
-where the type follows the `-s' option and the code follows the `-d'
-option.
-
-
-
-
-
-The ICMP names are fairly long: you only need use enough letters to
-make the name distinct from any other.
-
-
-
-
-
-Here is a small table of some of the most common ICMP packets:
-
-
-Number Name Required by
-0 echo-reply ping
-3 destination-unreachable Any TCP/UDP traffic.
-5 redirect routing if not running routing daemon
-8 echo-request ping
-11 time-exceeded traceroute
-
-
-
-
-Note that the ICMP names cannot be preceeded by `!' at the moment.
-
-
-
-
-
-DO NOT DO NOT DO NOT block all ICMP type 3 messages! (See
-ICMP Packets below).
-
-
-
-
-!Specifying an Interface
-
-
-The `-i' option specifies the name of an __interface__ to match. An
-interface is the physical device the packet came in on, or is going
-out on. You can use the ifconfig command to list the interfaces
-which are `up' (ie. working at the moment).
-
-
-
-
-
-The interface for incoming packets (ie. packets traversing the input
-chain) is considered to be the interface they came in on. Logically,
-the interface for outgoing packets (packets traversing the output
-chain) is the interface they will go out on. The interface for
-packets traversing the forward chain is also the interface they will
-go out on; a fairly arbitrary decision it seems to me.
-
-
-
-
-
-It is perfectly legal to specify an interface that currently does not
-exist; the rule will not match anything until the interface comes up.
-This is extremely useful for dial-up PPP links (usually interface
-ppp0) and the like.
-
-
-
-
-
-As a special case, an interface name ending with a `+' will match all
-interfaces (whether they currently exist or not) which begin with that
-string. For example, to specify a rule which matches all PPP
-interfaces, the -i ppp+ option would be used.
-
-
-
-
-
-The interface name can be preceded by a `!' to match a packet which
-does NOT match the specified interface(s).
-
-
-
-
-!Specifying TCP SYN Packets Only
-
-
-It is sometimes useful to allow TCP connections in one direction, but
-not the other. For example, you might want to allow connections to an
-external WWW server, but not connections from that server.
-
-
-
-
-
-The naive approach would be to block TCP packets coming from the
-server. Unfortunately, TCP connections require packets going in both
-directions to work at all.
-
-
-
-
-
-The solution is to block only the packets used to request a
-connection. These packets are called __SYN__ packets (ok,
-technically they're packets with the SYN flag set, and the FIN and ACK
-flags cleared, but we call them SYN packets). By disallowing only
-these packets, we can stop attempted connections in their tracks.
-
-
-
-
-
-The `-y' flag is used for this: it is only valid for rules which
-specify TCP as their protocol. For example, to specify TCP connection
-attempts from 192.168.1.1:
-
--p TCP -s 192.168.1.1 -y
-
-
-
-
-
-
-Once again, this flag can be inverted by preceding it with a `!',
-which means every packet other than the connection initiation.
-
-
-
-
-! Handling Fragments
-
-
-Sometimes a packet is too large to fit down a wire all at once. When
-this happens, the packet is divided into __fragments__, and sent as
-multiple packets. The other end reassembles the fragments to
-reconstruct the whole packet.
-
-
-
-
-
-The problem with fragments is that some of the specifications listed
-above (in particular, source port, destinations port, ICMP type, ICMP
-code, or TCP SYN flag) require the kernel to peek at the start of the
-packet, which is only contained in the first fragment.
-
-
-
-
-
-If your machine is the only connection to an external network, then
-you can tell the Linux kernel to reassemble all fragments which pass
-through it, by compiling the kernel with IP: always defragment set
-to `Y'. This sidesteps the issue neatly.
-
-
-
-
-
-Otherwise, it is important to understand how fragments get treated by
-the filtering rules. Any filtering rule that asks for information we
-don't have will ''not'' match. This means that the first fragment is
-treated like any other packet. Second and further fragments won't be.
-Thus a rule -p TCP -s 192.168.1.1 www (specifying a source port of
-`www') will never match a fragment (other than the first fragment).
-Neither will the opposite rule -p TCP -s 192.168.1.1 ! www.
-
-
-
-
-
-However, you can specify a rule specifically for second and further
-fragments, using the `-f' flag. Obviously, it is illegal to specify a
-TCP or UDP port, ICMP type, ICMP code or TCP SYN flag in such a
-fragment rule.
-
-
-
-
-
-It is also legal to specify that a rule does ''not'' apply to second
-and further fragments, by preceding the `-f' with `!'.
-
-
-
-
-
-Usually it is regarded as safe to let second and further fragments
-through, since filtering will effect the first fragment, and thus
-prevent reassembly on the target host, however, bugs have been known
-to allow crashing of machines simply by sending fragments. Your call.
-
-
-
-
-
-Note for network-heads: malformed packets (TCP, UDP and ICMP packets
-too short for the firewalling code to read the ports or ICMP code and
-type) are treated as fragments as well. Only TCP fragments starting
-at position 8 are explicitly dropped by the firewall code (a message
-should appear in the syslog if this occurs).
-
-
-
-
-
-As an example, the following rule will drop any fragments going to
-192.168.1.1:
-
-
-
-
-
-# ipchains -A output -f -d 192.168.1.1 -j DENY
-#
-
-
-
-
-
-
-!Filtering Side Effects
-
-
-OK, so now we know all the ways we can match a packet using a rule.
-If a packet matches a rule, the following things happen:
-
-
-
-
-
-# The byte counter for that rule is increased by the size of the
-packet (header and all).
-
-#
-
-# The packet counter for that rule is incremented.
-
-#
-
-# If the rule requests it, the packet is logged.
-
-#
-
-# If the rule requests it, the packet's Type Of Service field is
-changed.
-
-#
-
-# If the rule requests it, the packet is marked (not in 2.
-kernel series).
-
-#
-
-# The rule target is examined to decide what to do to the packet
-next.
-#
-
-
-
-
-
-
-For variety, I'll address these in order of importance.
-
-
-
-
-! Specifying a Target
-
-
-A __target__ tells the kernel what to do with a packet that
-matches a rule. ipchains uses `-j' (think `jump-to') for the target
-specification. The target name must be less than 8 letters, and case
-matters: "RETURN" and "return" are completely different.
-
-
-
-
-
-The simplest case is when there is no target specified. This type of
-rule (often called an `accounting' rule) is useful for simply counting
-a certain type of packet. Whether this rule matches or not, the
-kernel simply examines the next rule in the chain. For example, to
-count the number of packets from 192.168.1.1, we could do this:
-
-
-# ipchains -A input -s 192.168.1.1
-#
-
-
-
-
-
-
-
-(Using `ipchains -L -v' we can see the byte and packet counters
-associated with each rule).
-
-
-
-
-
-There are six special targets. The first three, ACCEPT,
-REJECT and DENY are fairly simple. ACCEPT allows the
-packet through. DENY drops the packet as if it had never been
-received. REJECT drops the packet, but (if it's not an ICMP
-packet) generates an ICMP reply to the source to tell it that the
-destination was unreachable.
-
-
-
-
-
-The next one, MASQ tells the kernel to masquerade the packet. For
-this to work, your kernel needs to be compiled with IP Masquerading
-enabled. For details on this, see the Masquerading-HOWTO and the
-Appendix
-Differences between ipchains and ipfwadm. This target is only valid for packets traversing the
-forward chain.
-
-
-
-
-
-The other major special target is REDIRECT which tells the kernel
-to send a packet to a local port instead of wherever it was heading.
-This can only be specified for rules specifying TCP or UDP as their
-protocol. Optionally, a port (name or number) can be specified
-following `-j REDIRECT' which will cause the packet to be redirected
-to that particular port, even if it was addressed to another port.
-This target is only valid for packets traversing the input chain.
-
-
-
-
-
-The final special target is RETURN which is identical to falling
-off the end of the chain immediately. (See
-Setting Policy below).
-
-
-
-
-
-Any other target indicates a user-defined chain (as described in
-Operations on an Entire Chain below). The
-packet will begin traversing the rules in that chain. If that chain
-doesn't decide the fate of the packet, then once traversal on that
-chain has finished, traversal resumes on the next rule in the current
-chain.
-
-
-
-
-
-Time for more ASCII art. Consider two (silly) chains: input (the
-built-in chain) and Test (a user-defined chain).
-
-
-
-
-`input' `Test'
----------------------------- ----------------------------
-| Rule1: -p ICMP -j REJECT | | Rule1: -s 192.168.1.1 |
-|--------------------------| |--------------------------|
-| Rule2: -p TCP -j Test | | Rule2: -d 192.168.1.1 |
-|--------------------------| ----------------------------
-| Rule3: -p UDP -j DENY |
-----------------------------
-
-
-
-
-
-
-Consider a TCP packet coming from 192.168.1.1, going to 1.2.3.4. It
-enters the input chain, and gets tested against Rule1 - no match.
-Rule2 matches, and its target is Test, so the next rule examined
-is the start of Test. Rule1 in Test matches, but doesn't
-specify a target, so the next rule is examined, Rule2. This doesn't
-match, so we have reached the end of the chain. We return to the
-input chain, where we had just examined Rule2, so we now examine
-Rule3, which doesn't match either.
-
-
-
-
-
-So the packet path is:
-
-v __________________________
-`input' | / `Test' v
-------------------------|--/ -----------------------|----
-| Rule1 | /| | Rule1 | |
-|-----------------------|/-| |----------------------|---|
-| Rule2 / | | Rule2 | |
-|--------------------------| -----------------------v----
-| Rule3 /--+___________________________/
-------------------------|---
-v
-
-
-
-
-
-
-See the section
-How to Organise Your Firewall Rules for ways to use user-defined chains effectively.
-
-
-
-
-!Logging Packets
-
-
-This is a side effect that matching a rule can have; you can have the
-matching packet logged using the `-l' flag. You will usually not want
-this for routine packets, but it is a useful feature if you want to
-look for exceptional events.
-
-
-
-
-
-The kernel logs this information looking like:
-
-
-
-
-
-Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
-L=34 S=0x00 I=18 F=0x0000 T=254
-
-
-
-
-This log message is designed to be terse, and contain technical
-information useful only to networking gurus, but it can be useful to
-the rest of us. It breaks down like so:
-
-
-
-
-
-# `input' is the chain which contained the rule which matched the
-packet, causing the log message.
-
-#
-
-# `DENY' is what the rule said to do to the packet. If this is
-`-' then the rule didn't effect the packet at all (an accounting rule).
-
-#
-
-# `eth0' is the interface name. Because this was the input
-chain, it means that the packet came in `eth0'.
-
-#
-
-# `PROTO=17' means that the packet was protocol 17. A list of
-protocol numbers is given in `/etc/protocols'. The most common are 1
-(ICMP), 6 (TCP) and 17 (UDP).
-
-#
-
-# `192.168.2.1' means that the packet's source IP address was
-192.168.2.1.
-
-#
-
-# `:53' means that the source port was port 53. Looking in
-`/etc/services' shows that this is the `domain' port (ie. this is
-probably an DNS reply). For UDP and TCP, this number is the source
-port. For ICMP, it's the ICMP type. For others, it will be 65535.
-
-#
-
-# `192.168.1.1' is the destination IP address.
-
-#
-
-# `:1025' means that the destination port was 1025. For UDP and
-TCP, this number is the destination port. For ICMP, it's the ICMP
-code. For others, it will be 65535.
-
-#
-
-# `L=34' means that packet was a total of 34 bytes long.
-
-#
-
-# `S=0x00' means the Type of Service field (divide by 4 to get
-the Type of Service as used by ipchains).
-
-#
-
-# `I=18' is the IP ID.
-
-#
-
-# `F=0x0000' is the 16-bit fragment offset plus flags. A value
-starting with `0x4' or `0x5' means that the Don't Fragment bit is set.
-`0x2' or `0x3' means the `More Fragments' bit is set; expect more
-fragments after this. The rest of the number is the offset of this
-fragment, divided by 8.
-
-#
-
-# `T=254' is the Time To Live of the packet. One is subtracted
-from this value for every hop, and it usually starts at 15 or 255.
-
-#
-
-# `(#5)' there may be a final number in brackets on more recent
-kernels (perhaps after 2.2.9). This is the rule number which caused
-the packet log.
-
-#
-
-
-
-
-
-
-On standard Linux systems, this kernel output is captured by klogd
-(the kernel logging daemon) which hands it to syslogd (the system
-logging daemon). The `/etc/syslog.conf' controls the behaviour of
-syslogd, by specifying a destination for each `facility' (in our case,
-the facility is "kernel") and `level' (for ipchains, the level used is
-"info").
-
-
-
-
-
-For example, my (Debian) /etc/syslog.conf contains two lines which
-match `kern.info':
-
-
-
-
-
-kern.* -/var/log/kern.log
-*.=info;*.=notice;*.=warn;\
-auth,authpriv.none;\
-cron,daemon.none;\
-mail,news.none -/var/log/messages
-
-
-
-
-These mean that the messags are duplicated in `/var/log/kern.log' and
-`/var/log/messages'. For more details, see `man syslog.conf'.
-
-
-
-
-!Manipulating the Type Of Service
-
-
-There are four seldom-used bits in the IP header, called the __Type of
-Service__ (TOS) bits. They effect the way packets are treated; the four
-bits are "Minimum Delay", "Maximum Throughput", "Maximum Reliability"
-and "Minimum Cost". Only one of these bits is allowed to be set. Rob
-van Nieuwkerk, the author of the TOS-mangling code, puts it as
-follows:
-
-
-
-
-Especially the "Minimum Delay" is important for me. I switch it on
-for "interactive" packets in my upstream (Linux) router. I'm behind a
-33k6 modem link. Linux prioritizes packets in 3 queues. This way I
-get acceptable interactive performance while doing bulk downloads at
-the same time. (It could even be better if there wasn't such a big
-queue in the serial driver, but latency is kept down 1.5 seconds now).
-
-
-
-
-
-
-Note: obviously, you have no control over incoming packets; you can
-only control the priority of packets leaving your box. To negotiate
-priorities with the other end, a protocol like RSVP (which I know
-nothing about, so don't ask me) must be used.
-
-
-
-
-
-The most common use is to set telnet & ftp control connections to
-"Minimum Delay" and FTP data to "Maximum Throughput". This would be
-done as follows:
-
-
-
-
-
-ipchains -A output -p tcp -d .../0 telnet -t 0x01 0x10
-ipchains -A output -p tcp -d .../0 ftp -t 0x01 0x10
-ipchains -A output -p tcp -s .../0 ftp-data -t 0x01 0x08
-
-
-
-
-
-
-
-The `-t' flag takes two extra parameters, both in hexadecimal. These
-allow complex twiddling of the TOS bits: the first mask is ANDed with
-the packet's current TOS, and then the second mask is XORed with it.
-If this is too confusing, just use the following table:
-
-
-
-
-
-TOS Name Value Typical Uses
-Minimum Delay 0x01 0x10 ftp, telnet
-Maximum Throughput 0x01 0x08 ftp-data
-Maximum Reliability 0x01 0x04 snmp
-Minimum Cost 0x01 0x02 nntp
-
-
-
-
-Andi Kleen goes on to point out the following (mildly edited for
-posterity):
-
-Maybe it would be useful to add an reference to the txqueuelen
-parameter of ifconfig to the discussion of TOS bits. The default
-device queue length is tuned for ethernet cards, on modems it is too
-long and makes the 3 band scheduler (which queues based on TOS) work
-suboptimally. It is a good idea to set it to a value between 4-10 on
-modem or single b channel ISDN links: on bundled devices a longer
-queue is needed. This is a 2.0 and 2.1 problem, but in 2.1 it is a
-ifconfig flag (with recent nettools), while in 2.0 it requires source
-patches in the device drivers to change.
-
-
-
-So, to see maximal benifits of TOS manipulation for modem PPP links,
-do `ifconfig $1 txqueuelen' in your /etc/ppp/ip-up script. The number
-to use depends on the modem speed and the amount of buffering in the
-modem; here's Andi setting me straight again:
-
-
-
-
-The best value for a given configuration needs experiment. If the
-queues are too short on a router then packets will get dropped. Also
-of course one gets benefits even without TOS rewriting, just that TOS
-rewriting helps to give the benefits to non cooperating programs (but
-all standard linux programs are cooperating).
-
-
-
-
-
-!Marking a Packet
-
-
-This allows complex and powerful interactions with Alexey Kuznetsov's
-new Quality of Service implementation, as well as the mark-based
-forwarding in later 2.1 series kernels. More news as it comes to
-hand. This option is ignored altogether in the 2.0 kernel series.
-
-
-
-
-! Operations on an Entire Chain
-
-
-A very useful feature of ipchains is the ability to group related
-rules into chains. You can call the chains whatever you want, as long
-as the names don't clash with the built-in chains (input,
-output and forward) or the targets (MASQ,
-REDIRECT, ACCEPT, DENY, REJECT or RETURN). I
-suggest avoiding upper-case labels entirely, since I may use these for
-future extensions. The chain name can be up to 8 characters long.
-
-
-
-
-!Creating a New Chain
-
-
-Let's create a new chain. Because I am such an imaginative fellow,
-I'll call it test.
-
-
-
-
-
-# ipchains -N test
-#
-
-
-
-
-
-
-
-It's that simple. Now you can put rules in it as detailed above.
-
-
-
-
-!Deleting a Chain
-
-
-Deleting a chain is simple as well.
-
-
-
-
-
-# ipchains -X test
-#
-
-
-
-
-Why `-X'? Well, all the good letters were taken.
-
-
-
-
-
-There are a couple of restrictions to deleting chains: they must be
-empty (see
-Flushing a Chain below) and they
-must not be the target of any rule. You can't delete any of the three
-built-in chains.
-
-
-
-
-! Flushing a Chain
-
-
-There is a simple way of emptying all rules out of a chain, using the
-`-F' command.
-
-
-
-
-
-# ipchains -F forward
-#
-
-
-
-
-
-
-
-If you don't specify a chain, then ''all'' chains will be flushed.
-
-
-
-
-!Listing a Chain
-
-
-You can list all the rules in a chain by using the `-L' command.
-
-
-
-
-
-# ipchains -L input
-Chain input (refcnt = 1): (policy ACCEPT)
-target prot opt source destination ports
-ACCEPT icmp ----- anywhere anywhere any
-# ipchains -L test
-Chain test (refcnt = ):
-target prot opt source destination ports
-DENY icmp ----- localnet/24 anywhere any
-#
-
-
-
-
-
-
-
-The `refcnt' listed for test is the number of rules which have
-test as their target. This must be zero (and the chain be empty)
-before this chain can be deleted.
-
-
-
-
-
-If the chain name is omitted, all chains are listed, even empty ones.
-
-
-
-
-
-There are three options which can accompany `-L'. The `-n' (numeric)
-option is very useful as it prevents ipchains from trying to
-lookup the IP addresses, which (if you are using DNS like most people)
-will cause large delays if your DNS is not set up properly, or you
-have filtered out DNS requests. It also causes ports to be printed
-out as numbers rather than names.
-
-
-
-
-
-The `-v' options shows you all the details of the rules, such as the
-the packet and byte counters, the TOS masks, the interface, and the
-packet mark. Otherwise these values are omitted. For example:
-
-
-
-
-
-# ipchains -v -L input
-Chain input (refcnt = 1): (policy ACCEPT)
-pkts bytes target prot opt tosa tosx ifname mark source destination ports
-10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
-
-
-
-
-
-
-
-Note that the packet and byte counters are printed out using the
-suffixes `K', `M' or `G' for 1000, 1,000,000 and 1,000,000,000
-respectively. Using the `-x' (expand numbers) flag as well prints the
-full numbers, no matter how large they are.
-
-
-
-
-!Resetting (Zeroing) Counters
-
-
-It is useful to be able to reset the counters. This can be done with
-the `-Z' (zero counters) option. For example:
-
-
-
-
-
-# ipchains -v -L input
-Chain input (refcnt = 1): (policy ACCEPT)
-pkts bytes target prot opt tosa tosx ifname mark source destination ports
-10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
-# ipchains -Z input
-# ipchains -v -L input
-Chain input (refcnt = 1): (policy ACCEPT)
-pkts bytes target prot opt tosa tosx ifname mark source destination ports
-0 0 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
-#
-
-
-
-
-
-
-
-The problem with this approach is that sometimes you need to know the
-counter values immediately before they are reset. In the above
-example, some packets could pass through between the `-L' and `-Z'
-commands. For this reason, you can use the `-L' and `-Z'
-''together'', to reset the counters while reading them.
-Unfortunately, if you do this, you can't operate on a single chain:
-you have to list and zero all the chains at once.
-
-
-
-
-
-# ipchains -L -v -Z
-Chain input (policy ACCEPT):
-pkts bytes target prot opt tosa tosx ifname mark source destination ports
-10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
-Chain forward (refcnt = 1): (policy ACCEPT)
-Chain output (refcnt = 1): (policy ACCEPT)
-Chain test (refcnt = ):
-0 0 DENY icmp ----- 0xFF 0x00 ppp0 localnet/24 anywhere any
-# ipchains -L -v
-Chain input (policy ACCEPT):
-pkts bytes target prot opt tosa tosx ifname mark source destination ports
-10 840 ACCEPT icmp ----- 0xFF 0x00 lo anywhere anywhere any
-Chain forward (refcnt = 1): (policy ACCEPT)
-Chain output (refcnt = 1): (policy ACCEPT)
-Chain test (refcnt = ):
-0 0 DENY icmp ----- 0xFF 0x00 ppp0 localnet/24 anywhere any
-#
-
-
-
-
-
-
-! Setting Policy
-
-
-We glossed over what happens when a packet hits the end of a built-in
-chain when we discussed how a packet walks through chains in
-Specifying a Target above. In this case,
-the __policy__ of the chain determines the fate of the packet. Only
-built-in chains (input, output and forward) have policies,
-because if a packet falls off the end of a user-defined chain,
-traversal resumes at the previous chain.
-
-
-
-
-
-The policy can be any of the first four special targets: ACCEPT,
-DENY, REJECT or MASQ. MASQ is only valid for the
-`forward' chain.
-
-
-
-
-
-It is also important to note that a RETURN target in a rule in
-one of the built-in chains is useful to explicitly target the chain
-policy when a packet matches a rule.
-
-
-
-
-!Operations on Masquerading
-
-
-There are several parameters you can tweak for IP Masquerading. They
-are bundled with ipchains because it's not worth writing a
-separate tool for them (although this will change).
-
-
-
-
-
-The IP Masquerading command is `-M', and it can be combined with `-L'
-to list currently masqueraded connections, or `-S' to set the
-masquerading parameters.
-
-
-
-
-
-The `-L' command can be accompanied by `-n' (show numbers instead of
-hostnames and port names) or `-v' (show deltas in sequence numbers for
-masqueraded connection, just in case you care).
-
-
-
-
-
-The `-S' command should be followed by three timeout values, each in
-seconds: for TCP sessions, for TCP sessions after a FIN packet, and
-for UDP packets. If you don't want to change one of these values,
-simply give a value of `'.
-
-
-
-
-
-The default values are listed in `/usr/src/linux/include/net/ip_masq.h',
-currently 15 minutes, 2 minutes and 5 minutes respectively.
-
-
-
-
-
-The most common value to change is the first one, for FTP (see
-FTP Nightmares below).
-
-
-
-
-
-Note the problems with setting timeouts listed in
-I can't set masquerading timeouts!.
-
-
-
-
-!Checking a Packet
-
-
-Sometimes you want to see what happens when a certain packet enters
-your machine, such as for debugging your firewall chains.
-ipchains has the `-C' command to allow this, using the exact same
-routines that the kernel uses to diagnose real packets.
-
-
-
-
-
-You specify which chain to test the packet on by following the `-C'
-argument with its name. Whereas the kernel always starts traversing
-on the input, output or forward chains, you are allowed
-to begin traversing on any chain for testing purposes.
-
-
-
-
-
-The details of the `packet' are specified using the same syntax used
-to specify firewall rules. In particular, a protocol (`-p'), source
-address (`-s'), destination address (`-d') and interface (`-i') are
-compulsory. If the protocol is TCP or UDP, then a single source and a
-single destination port must be specified, and a ICMP type and code
-must be specified for the ICMP protocol (unless the `-f' flag is
-specified to indicate a fragment rule, in which case these options are
-illegal).
-
-
-
-
-
-If the protocol is TCP (and the `-f' flag is not specified), the `-y'
-flag may be specified, to indicate that the test packet should have
-the SYN bit set.
-
-
-
-
-
-Here is an example of testing a TCP SYN packet from 192.168.1.1 port
-60000 to 192.168.1.2 port www, coming in the eth0 interface, entering
-the `input' chain. (This is a classic incoming WWW connection
-initiation):
-
-
-
-
-
-# ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
-packet accepted
-#
-
-
-
-
-
-
-!Multiple Rules at Once and Watching What Happens
-
-
-Sometimes a single command line can result in multiple rules being
-effected. This is done in two ways. Firstly, if you specify a
-hostname which resolves (using DNS) to multiple IP addresses,
-ipchains will act as if you had typed multiple commands with each
-combination of addresses.
-
-
-
-
-
-So if the hostname `www.foo.com' resolves to three IP addresses, and
-the hostname `www.bar.com' resolves to two IP addresses, then the
-command `ipchains -A input -j reject -s www.bar.com -d www.foo.com'
-would append six rules to the input chain.
-
-
-
-
-
-The other way to have ipchains perform multiple actions is to use
-the bidirectional flag (`-b'). This flag makes ipchains behave
-as if you had typed the command twice, the second time with the `-s'
-and `-d' arguments reversed. So, to avoid forwarding either to or
-from 192.168.1.1, you could do the following:
-
-
-
-
-
-# ipchains -b -A forward -j reject -s 192.168.1.1
-#
-
-
-
-
-
-
-
-Personally, I don't like the `-b' option much; if you want
-convenience, see
-Using ipchains-save
-below.
-
-
-
-
-
-The -b option can be used with the insert (`-I'), delete (`-D') (but
-not the variation which takes a rule number), append (`-A') and check
-(`-C') commands.
-
-
-
-
-
-Another useful flag is `-v' (verbose) which prints out exactly what
-ipchains is doing with your commands. This is useful if you are
-dealing with commands that may effect multiple rules. For example,
-here we check the behaviour of fragments between 192.168.1.1 and
-192.168.1.2.
-
-
-
-
-
-# ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
-tcp opt ---f- tos 0xFF 0x00 via lo 192.168.1.1 -> 192.168.1.2 * -> *
-packet accepted
-tcp opt ---f- tos 0xFF 0x00 via lo 192.168.1.2 -> 192.168.1.1 * -> *
-packet accepted
-#
-
-
-
-
-
-
-!!4.2 Useful Examples
-
-
-
-I have a dialup PPP connection (-i ppp0). I grab news (-p
-TCP -s news.virtual.net.au nntp) and mail (-p TCP -s
-mail.virtual.net.au pop-3) every time I dial up. I use Debian's FTP
-method to update my machine regularly (-p TCP -y -s
-ftp.debian.org.au ftp-data). I surf the web through my ISP's proxy
-while this is going on (-p TCP -d proxy.virtual.net.au 8080), but
-hate the ads from doubleclick.net on the Dilbert Archive (-p TCP -y
--d 199.95.207./24 and -p TCP -y -d 199.95.208./24).
-
-
-
-
-
-I don't mind people trying to ftp to my machine while I'm online
-(-p TCP -d $LOCALIP ftp), but don't want anyone outside
-pretending to have an IP address of my internal network (-s
-192.168.1./24). This is commonly called IP spoofing, and there
-is a better way to protect yourself from it in the 2.1.x kernels and
-above: see
-How do I set up IP spoof protection?.
-
-
-
-
-
-This setup is fairly simple, because there are currently no other
-boxes on my internal network.
-
-
-
-
-
-I don't want any local process (ie. Netscape, lynx etc.) to connect
-to doubleclick.net:
-
-
-
-
-
-# ipchains -A output -d 199.95.207./24 -j REJECT
-# ipchains -A output -d 199.95.208./24 -j REJECT
-#
-
-
-
-
-
-
-
-Now I want to set priorities on various outgoing packets (there isn't
-much point in doing it on incoming packets). Since I have a fair
-number of these rules, it makes sense to put them all in a single
-chain, called ppp-out.
-
-
-
-
-
-# ipchains -N ppp-out
-# ipchains -A output -i ppp0 -j ppp-out
-#
-
-
-
-
-
-
-
-Minimum delay for web traffic & telnet.
-
-
-
-
-
-# ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
-# ipchains -A ppp-out -p TCP -d .../0 telnet -t 0x01 0x10
-#
-
-
-
-
-
-
-
-Low cost for ftp data, nntp, pop-3:
-
-
-
-
-
-# ipchains -A ppp-out -p TCP -d .../0 ftp-data -t 0x01 0x02
-# ipchains -A ppp-out -p TCP -d .../0 nntp -t 0x01 0x02
-# ipchains -A ppp-out -p TCP -d .../0 pop-3 -t 0x01 0x02
-#
-
-
-
-
-
-
-
-There are a few restrictions on packets coming in the ppp0 interface:
-let's create a chain called `ppp-in':
-
-
-
-
-
-# ipchains -N ppp-in
-# ipchains -A input -i ppp0 -j ppp-in
-#
-
-
-
-
-
-
-
-Now, no packets coming in ppp0 should be claiming a source
-address of 192.168.1.*, so we log and deny them:
-
-
-
-
-
-# ipchains -A ppp-in -s 192.168.1./24 -l -j DENY
-#
-
-
-
-
-
-
-
-I allow UDP packets in for DNS (I run a caching nameserver which
-forwards all requests to 203.29.16.1, so I expect DNS replies from
-them only), incoming ftp, and return ftp-data only (which should only
-be going to a port above 1023, and not the X11 ports around 6000).
-
-
-
-
-
-# ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
-# ipchains -A ppp-in -p TCP -s .../0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
-# ipchains -A ppp-in -p TCP -s .../0 ftp-data -d $LOCALIP 6010: -j ACCEPT
-# ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
-#
-
-
-
-
-
-
-
-I allow TCP reply packets back in
-
-
-
-
-
-# ipchains -A ppp-in -p TCP ! -y -j ACCEPT
-#
-
-
-
-
-
-
-
-Finally, local-to-local packets are OK:
-
-
-
-
-
-# ipchains -A input -i lo -j ACCEPT
-#
-
-
-
-
-
-
-
-Now, my default policy on the input chain is DENY, so
-everything else gets dropped:
-
-
-
-
-
-# ipchains -P input DENY
-#
-
-
-
-
-
-
-
-NOTE: I wouldn't set up my chains in this order, as packets might get
-through while I'm setting up. Safest is usually to set the policy to
-DENY first, then insert the rules. Of course, if your rules require
-DNS lookups to resolve hostnames, you could be in trouble.
-
-
-
-
-! Using ipchains-save
-
-
-Setting up firewall chains just the way you want them, and then trying
-to remember the commands you used so you can do them next time is a
-pain.
-
-
-
-
-
-So, ipchains-save is a script which reads your current chains
-setup and saves it to a file. For the moment I'll keep you in
-suspense with regards to what ipchains-restore does.
-
-
-
-
-
-ipchains-save can save a single chain, or all chains (if no chain
-name is specified). The only option currently permitted is `-v' which
-prints the rules (to stderr) as they are saved. The policy of the
-chain is also saved for input, output and forward
-chains.
-
-
-
-
-
-# ipchains-save > my_firewall
-Saving `input'.
-Saving `output'.
-Saving `forward'.
-Saving `ppp-in'.
-Saving `ppp-out'.
-#
-
-
-
-
-
-
-!Using ipchains-restore
-
-
-ipchains-restore restores chains as saved with
-ipchains-save. It can take two options: `-v' which describes
-each rule as it is added, and `-f' which forces flushing of
-user-defined chains if they exist, as described below.
-
-
-
-
-
-If a user-defined chain is found in the input, ipchains-restore
-checks if that chain already exists. If it does, then you will be
-prompted whether the chains should be flushed (cleared of all rules)
-or whether restoring this chain should be skipped. If you specified
-`-f' on the command line, you will not be prompted; the chain will be
-flushed.
-
-
-
-
-
-For example:
-
-
-
-
-
-# ipchains-restore < my_firewall
-Restoring `input'.
-Restoring `output'.
-Restoring `forward'.
-Restoring `ppp-in'.
-Chain `ppp-in' already exists. Skip or flush? [[S/f]? s
-Skipping `ppp-in'.
-Restoring `ppp-out'.
-Chain `ppp-out' already exists. Skip or flush? [[S/f]? f
-Flushing `ppp-out'.
-#
-
-
-
-
-
-----
-
-!!5. Miscellaneous.
-
-
-This section contains all the information and FAQs that I couldn't fit
-inside the structure above.
-
-
-
-
-!! 5.1 How to Organize Your Firewall Rules
-
-
-
-This question requires some thought. You can try to organize them to
-optimize speed (minimize the number of rule-checks for the most common
-packets) or to increase manageability.
-
-
-
-
-
-If you have an intermittent link, say a PPP link, you might want to
-set the first rule in the input chain to be set to `-i ppp0 -j DENY' at
-boot time, then have something like this in your ip-up script:
-
-
-
-
-
-# Re-create the `ppp-in' chain.
-ipchains-restore -f < ppp-in.firewall
-# Replace DENY rule with jump to ppp-handling chain.
-ipchains -R input 1 -i ppp0 -j ppp-in
-
-
-
-
-
-
-
-Your ip-down script would look like:
-
-
-
-
-
-ipchains -R input 1 -i ppp0 -j DENY
-
-
-
-
-
-
-
-
-
-!!5.2 What Not To Filter Out
-
-
-
-There are some things you should be aware of before you start
-filtering out everything you don't want.
-
-
-
-
-! ICMP packets
-
-
-ICMP packets are used (among other things) to indicate failure for
-other protocols (such as TCP and UDP). `destination-unreachable'
-packets in particular. Blocking these packets means that you will
-never get `Host unreachable' or `No route to host' errors; any
-connections will just wait for a reply that never comes. This is
-irritating, but rarely fatal.
-
-
-
-
-
-A worse problem is the role of ICMP packets in MTU discovery. All
-good TCP implementations (Linux included) use MTU discovery to try to
-figure out what the largest packet that can get to a destination
-without being fragmented (fragmentation slows performance, especially
-when occasional fragments are lost). MTU discovery works by sending
-packets with the "Don't Fragment" bit set, and then sending smaller
-packets if it gets an ICMP packet indicating "Fragmentation needed but
-DF set" (`fragmentation-needed'). This is a type of
-`destination-unreachable' packet, and if it is never received, the
-local host will not reduce MTU, and performance will be abysmal or
-non-existent.
-
-
-
-
-
-Note that it is common to block all ICMP redirect messages (type 5);
-these can be used to manipulate routing (although good IP stacks have
-safeguards), and so are often seen as slightly risky.
-
-
-
-
-!TCP Connections to DNS (nameservers)
-
-
-If you're trying to block outgoing TCP connections, remember that DNS
-doesn't always use UDP; if the reply from the server exceeds 512
-bytes, the client uses a TCP connection (still going to port number
-53) to get the data.
-
-
-
-
-
-This can be a trap because DNS will `mostly work' if you disallow such
-TCP transfers; you may experience strange long delays and other
-occasional DNS problems if you do.
-
-
-
-
-
-If your DNS queries are always directed at the same external source
-(either directly by using the nameserver line in
-/etc/resolv.conf or by using a caching nameserver in forward
-mode), then you need only allow TCP connections to port domain
-on that nameserver from the local domain port (if using a caching
-nameserver) or from a high port (> 1023) if using
-/etc/resolv.conf.
-
-
-
-
-! FTP Nightmares
-
-
-The classic packet filtering problem is FTP. FTP has two __modes__;
-the traditional one is called __active mode__ and the more recent one
-is called __passive mode__. Web browsers usually default to passive
-mode, but command-line FTP programs usually default to active mode.
-
-
-
-
-
-In active mode, when the remote end wants to send a file (or even the
-results of an ls or dir command) it tries to open a TCP
-connection to the local machine. This means you can't filter out
-these TCP connections without breaking active FTP.
-
-
-
-
-
-If you have the option of using passive mode, then fine; passive mode
-makes data connections from client to server, even for incoming data.
-Otherwise, it is recommended that you only allow TCP connections to
-ports above 1024 and not between 6000 and 6010 (6000 is used for
-X-Windows).
-
-
-
-
-!!5.3 Filtering out Ping of Death
-
-
-
-Linux boxes are now immune to the famous __Ping of Death__, which
-involves sending an illegally-large ICMP packet which overflows
-buffers in the TCP stack on the receiver and causes havoc.
-
-
-
-
-
-If you are protecting boxes which might be vulnerable, you could simply
-block ICMP fragments. Normal ICMP packets aren't large enough to
-require fragmentation, so you won't break anything except big pings.
-I have heard (unconfirmed) reports that some systems required only the
-last fragment of an oversize ICMP packet to corrupt them, so blocking
-only the first fragment is not recommended.
-
-
-
-
-
-While the exploit programs I have seen all use ICMP, there is no
-reasons that TCP or UDP fragments (or an unknown protocol) could not
-be used for this attack, so blocking ICMP fragments is only a
-temporary solution.
-
-
-
-
-!!5.4 Filtering out Teardrop and Bonk
-
-
-
-Teardrop and Bonk are two attacks (mainly against Microsoft Windows NT
-machines) which rely on overlapping fragments. Having your Linux
-router do defragmentation, or disallowing all fragments to your
-vulnerable machines are the other options.
-
-
-
-
-!!5.5 Filtering out Fragment Bombs
-
-
-
-Some less-reliable TCP stacks are said to have problems dealing with
-large numbers of fragments of packets when they don't receive all the
-fragments. Linux does not have this problem. You can filter out
-fragments (which might break legitimate uses) or compile your kernel
-with `IP: always defragment' set to `Y' (only if your Linux box is the
-only possible route for these packets).
-
-
-
-
-!!5.6 Changing Firewall Rules
-
-
-
-There are some timing issues involved in altering firewall rules. If
-you are not careful, you can let packets through while you are
-half-way through your changes. A simplistic approach is to do the
-following:
-
-
-
-
-
-# ipchains -I input 1 -j DENY
-# ipchains -I output 1 -j DENY
-# ipchains -I forward 1 -j DENY
-... make changes ...
-# ipchains -D input 1
-# ipchains -D output 1
-# ipchains -D forward 1
-#
-
-
-
-
-This drops all packets for the duration of the changes.
-
-
-
-
-
-If your changes are restricted to a single chain, you might want to
-create a new chain with the new rules, and then replace (`-R') the
-rule that pointed to the old chain with one that points to the new
-chain: then you can delete the old chain. This replacement will occur
-atomically.
-
-
-
-
-!! 5.7 How Do I Set Up IP Spoof Protection?
-
-
-
-IP spoofing is a technique where a host sends out packets which claim
-to be from another host. Since packet filtering makes decisions based
-on this source address, IP spoofing is uses to fool packet filters.
-It is also used to hide the identity of attackers using SYN attacks,
-Teardrop, Ping of Death and the like (don't worry if you don't know
-what they are).
-
-
-
-
-
-The best way to protect from IP spoofing is called Source Address
-Verification, and it is done by the routing code, and not firewalling
-at all. Look for a file called
-/proc/sys/net/ipv4/conf/all/rp_filter. If this exists, then
-turning on Source Address Verification at every boot is the right
-solution for you. To do that, insert the following lines somewhere in
-your init scripts, before any network interfaces are initialized:
-
-
-
-
-
-# This is the best method: turn on Source Address Verification and get
-# spoof protection on all current and future interfaces.
-if [[ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
-echo -n "Setting up IP spoofing protection..."
-for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
-echo 1 > $f
-done
-echo "done."
-else
-echo PROBLEMS SETTING UP IP SPOOFING PROTECTION. BE WORRIED.
-echo "CONTROL-D will exit from this shell and continue system startup."
-echo
-# Start a single user shell on the console
-/sbin/sulogin $CONSOLE
-fi
-
-
-
-
-
-
-
-If you cannot do this, you can manually insert rules to protect every
-interface. This requires knowledge of each interface. The 2.1
-kernels automatically reject packets claiming to come from the 127.*
-addresses (reserved for the local loopback interface, lo).
-
-
-
-
-
-For example, say we have three interfaces, eth0, eth1 and
-ppp0. We can use ifconfig to tell us the address and
-netmask of the interfaces. Say eth0 was attached to a network
-192.168.1.0 with netmask 255.255.255., eth1 was attached to a
-network 10...0 with netmask 255..., and ppp0 connected to
-the Internet (where any address except the reserved private IP
-addresses are allowed), we would insert the following rules:
-
-
-
-
-
-# ipchains -A input -i eth0 -s ! 192.168.1./255.255.255.0 -j DENY
-# ipchains -A input -i ! eth0 -s 192.168.1./255.255.255.0 -j DENY
-# ipchains -A input -i eth1 -s ! 10.../255...0 -j DENY
-# ipchains -A input -i ! eth1 -s 10.../255...0 -j DENY
-#
-
-
-
-
-
-
-
-This approach is not as good as the Source Address Verification
-approach, because if your network changes, you have to change your
-firewalling rules to keep up.
-
-
-
-
-
-If you are running a 2.0 series kernel, you might want to protect the
-loopback interface as well, using a rule like this:
-
-
-
-
-
-# ipchains -A input -i ! lo -s 127.../255...0 -j DENY
-#
-
-
-
-
-
-
-!!5.8 Advanced Projects
-
-
-
-There is a userspace library I have written which is included with the
-source distribution called `libfw'. It uses the ability of IP Chains
-1.3 and above to copy a packet to userspace (using the
-IP_FIREWALL_NETLINK config option).
-
-
-
-
-
-The mark value can be used to specify the Quality of Service
-parameters for packets, or to specify how packets should be
-port-forwarded. I've never used either, but if you want to write
-about it, please contact me.
-
-
-
-
-
-Things such as __stateful inspection__ (I prefer the term
-dynamic firewalling) can be implemented in userspace using this
-library. Other nifty ideas include controlling packets on a per-user
-basis by doing a lookup in a userspace daemon. This should be pretty
-easy.
-
-
-
-
-!SPF: Stateful Packet Filtering
-
-
-
-ftp://ftp.interlinx.bc.ca/pub/spf is the site of Brian
-Murrell's SPF project, which does connection tracking in userspace.
-It adds significant security for low-bandwidth sites.
-
-
-
-
-
-There's little documentation at present, but here's a post to the
-mailing list in which Brian answered some questions:
-
-
-
-
-
-> I believe it does exactly what I want: Installing a temporary
-> "backward"-rule to let packets in as a response to an
-> outgoing request.
-Yup, that is exactly what it does. The more protocols it
-understands, the more "backward" rules it gets right. Right
-now it has support for (from memory, please excuse any errors
-or omissions) FTP (both active and passive, in and out), some
-!RealAudio, traceroute, ICMP and basic ICQ (inbound from the ICQ
-servers, and direct TCP connections, but alas the secondary
-direct TCP connections for things like file transfer, etc. are
-not there yet)
-> Is it a replacement for ipchains or a supplement?
-It is a supplement. Think of ipchains as the engine to allow
-and prevent packets from travelling across a Linux box. SPF is
-the driver, constantly monitoring traffic and telling ipchains
-how to change it's policies to reflect the changes in traffic
-patterns.
-
-
-
-
-
-
-!Michael Hasenstein's ftp-data hack
-
-
- Michael Hasenstein of SuSE has written a kernel patch which adds
-ftp connection tracking to ipchains. It can currently be found at
-http://www.suse.de/~mha/patch.ftp-data-2.gz
-
-
-
-!!5.9 Future Enhancements
-
-
-
-Firewalling and NAT have being redesigned for 2.4. Plans and
-discussions are available on the netfilter list (see
-http://lists.samba.org). These
-enhancements should clear up many outstanding usability issues
-(really, firewalling and masquerading shouldn't be ''this
-hard''), and allow growth for far more flexible firewalling.
-
-
-
-----
-
-!!6. Common Problems
-
-
-
-
-!!6.1 ipchains -L Freezes!
-
-
-
-You're probably blocking DNS lookups; it will eventually time out.
-Try using the `-n' (numeric) flag to ipchains, which suppresses the
-lookup of names.
-
-
-
-
-
-
-
-!!6.2 Inverse doesn't work!
-
-
-
-You must put the `!' option by itself, with spaces either side. A
-classic mistake (warned about in 1.3.10) is:
-
-
-
-
-
-# ipchains -A input -i !eth0 -j DENY
-#
-
-
-
-
-There will never be an interface called `!eth0', but ipchains doesn't
-know that.
-
-
-
-
-
-
-
-!!6.3 Masquerading/Forwarding Doesn't Work!
-
-
-
-Make sure that packet forwarding is enabled (in recent kernels it is
-disabled by default, meaning that packets never even try to traverse
-the `forward' chain). You can override this (as root) by typing
-
-
-
-
-
-# echo 1 > /proc/sys/net/ipv4/ip_forward
-#
-
-
-
-
-
-
-
-If this works for you, you can put this somewhere in your bootup
-scripts so it is enabled every time; you'll want to set up your
-firewalling before this command runs though, otherwise there's an
-opportunity for packets to slip through.
-
-
-
-
-
-
-
-!!6.4 -j REDIR doesn't work!
-
-
-
-You must allow forwarding packets (see above) for redirect to work;
-otherwise the routing code drops the packet. So if you are just using
-redirect, and don't have any forwarding at all, you should be aware of
-that.
-
-
-
-
-
-Note that REDIR (being in the input chain) doesn't effect connections
-from a local process.
-
-
-
-
-!!6.5 Wildcard Interfaces Don't Work!
-
-
-
-There was a bug in versions 2.1.102 and 2.1.103 of the kernel (and
-some old patches I produced) which made ipchains commands which
-specified a wildcard interface (such as -i ppp+) fail.
-
-
-
-
-
-This is fixed in recent kernels, and in the 2..34 patch on the web
-site. You can also fix it by hand in the kernel source by changing
-line 63 or so in include/linux/ip_fw.h:
-
-
-
-
-
-#define IP_FW_F_MASK 0x002F /* All possible flag bits mask */
-
-
-
-
-
-
-
-This should read ``0x003F''. Fix this and recompile the kernel.
-
-
-
-
-!!6.6 TOS Doesn't Work!
-
-
-
-This was my mistake: setting the Type of Service field did not
-actually set the Type of Service in kernel versions 2.1.102 through
-2.1.111. This problem was fixed in 2.1.112.
-
-
-
-
-!!6.7 ipautofw and ipportfw Don't Work!
-
-
-
-For 2..x, this is true; I haven't time to create and maintain a jumbo
-patch for ipchains and ipautofw/ipportfw.
-
-
-
-
-
-For 2.1.x, download Juan Ciarlante's ipmasqadm from
-
-<url url="http://juanjox.linuxhq.com/"
-name="http://juanjox.linuxhq.com/">
-
-and use it exactly as you would have used ipautofw or
-ipportfw, except instead of ipportfw you type ipmasqadm
-portfw, and instead of ipautofw you type ipmasqadm autofw.
-
-
-
-
-!!6.8 xosview is Broken!
-
-
-
-Upgrade to version 1.6.0 or above, which doesn't require any firewall
-rules at all for 2.1.x kernels. This seems to have broken again in
-the 1.6.1 release; please bug the author (it's not my fault!).
-
-
-
-
-!!6.9 Segmentation Fault With `-j REDIRECT'!
-
-
-
-This was a bug in ipchains version 1.3.3. Please upgrade.
-
-
-
-
-
-
-
-!! 6.10 I Can't Set Masquerading Timeouts!
-
-
-
-True (for 2.1.x kernels) up to 2.1.123. In 2.1.124, trying to set the
-masquerading timeouts causes a kernel lockup (change return
-to ret = on line 1328 of net/ipv4/ip_fw.c). In 2.1.125, it
-works fine.
-
-
-
-
-!!6.11 I Want to Firewall IPX!
-
-
-
-So do a number of others, it seems. My code only covers IP,
-unfortunately. On the good side, all the hooks are there to firewall
-IPX! You just need to write the code; I will happily help where
-possible.
-
-
-
-----
-
-!!7. A Serious Example.
-
-
-This example was extracted from Michael Neuling and my March 1999
-!LinuxWorld Tutorial; this is not the only way to solve the given
-problem, but it is probably the simplest. I hope you will find it
-informative.
-
-
-
-
-
-
-
-!!7.1 The Arrangement
-
-
-
-
-
-
-* Masqueraded internal network (various operating systems), which
-we call "GOOD".
-
-*
-
-* Exposed servers in a separate network (called "DMZ" for
-Demilitarized Zone).
-
-*
-
-* PPP Connection to the Internet (called "BAD").
-*
-
-
-
-
-
-
-
-
-
-External Network (BAD)
-|
-|
-ppp0|
----------------
-| 192.84.219.1| Server Network (DMZ)
-| |eth0
-| |----------------------------------------------
-| |192.84.219.250 | | |
-| | | | |
-|192.168.1.250| | | |
---------------- -------- ------- -------
-| eth1 | SMTP | | DNS | | WWW |
-| -------- ------- -------
-| 192.84.219.128 192.84.219.129 192.84.218.130
-|
-Internal Network (GOOD)
-
-
-
-
-
-
-!!7.2 Goals
-
-
-
-
-
-
-Packet Filter box:
-
-; __ PING any network__:
-
-This is really useful to tell if a machine is down.
-
-
-
-; __ TRACEROUTE any network __:
-
-Once again, useful for diagnosis.
-
-
-
-; __ Access DNS __:
-
-To make ping and DNS more useful.
-
-
-
-
-
-
-
-
-
-Within the DMZ:
-
-
-
-
-
-Mail server
-
-
-* SMTP to external
-*
-
-* Accept SMTP from internal and external
-*
-
-* Accept POP-3 from internal
-*
-
-
-
-Name Server
-
-
-* Send DNS to external
-*
-
-* Accept DNS from internal, external and packet filter box
-*
-
-
-
-
-
-
-Web server
-
-
-* Accept HTTP from internal and external
-*
-
-* Rsync access from internal
-*
-
-
-
-
-
-
- Internal:
-
-; __Allow WWW, ftp, traceroute, ssh to external__:
-
-These are fairly standard things to allow: some places start by
-allowing the internal machines to do just about everything, but here
-we're being restrictive.
-
-
-
-; __ Allow SMTP to Mail server __:
-
-Obviously, we want them to be able to send mail out.
-
-
-
-; __ Allow POP-3 to Mail server __:
-
-This is how they read their mail.
-
-
-
-; __ Allow DNS to Name server __:
-
-They need to be able to look up external names for WWW, ftp,
-traceroute and ssh.
-
-
-
-; __ Allow rsync to Web server __:
-
-This is how they synchronize the external web server with the
-internal one.
-
-
-
-; __ Allow WWW to Web server __:
-
-Obviously, they should be able to connect to our external web server.
-
-
-
-; __ Allow ping to packet filter box __:
-
-This is a courteous thing to allow: it means that they can test if
-the firewall box is down (so we don't get blamed if an external site
-is broken).
-
-
-
-
-
-
-
-
-!!7.3 Before Packet Filtering
-
-
-
-
-
-
-* Anti-spoofing
-
-
-Since we don't have any asymmetric routing, we can simply turn on
-anti-spoofing for all interfaces.
-
-
-
-
-
-
-
-
-# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
-#
-
-
-
-
-
-
-*
-
-* Set filtering rules to DENY all:
-
-
-We still allow local loopback traffic, but deny anything else.
-
-
-
-
-
-
-
-
-# ipchains -A input -i ! lo -j DENY
-# ipchains -A output -i ! lo -j DENY
-# ipchains -A forward -j DENY
-#
-
-
-
-
-
-
-*
-
-* Set Up Interfaces
-
-
-This is usually done in the boot scripts. Make sure the above steps
-are done before the interfaces are configured, to prevent packet
-leakage before the rules are set up.
-
-
-
-
-*
-
-* Insert per-protocol masquerading modules.
-
-
-We need to insert the masquerading module for FTP, so that active and
-passive FTP `just work' from the internal network.
-
-
-
-
-
-
-
-
-# insmod ip_masq_ftp
-#
-
-
-
-*
-
-
-
-
-
-!!7.4 Packet Filtering for Through Packets
-
-
-
-With masquerading, it's best to filter in the forward chain.
-
-
-
-
-
-Split forward chain into various user chains depending on source/dest
-interfaces; this breaks the problem down into managable chunks.
-
-
-
-
-
-ipchains -N good-dmz
-ipchains -N bad-dmz
-ipchains -N good-bad
-ipchains -N dmz-good
-ipchains -N dmz-bad
-ipchains -N bad-good
-
-
-
-
-ACCEPTing standard error ICMPs is a common thing to do, so we create a
-chain for it.
-
-
-
-
-
-ipchains -N icmp-acc
-
-
-
-
-
-
-!Set Up Jumps From forward Chain
-
-
-Unfortunately, we only know (in the forward chain) the outgoing
-interface. Thus, to figure out what interface the packet came in on,
-we use the source address (the anti-spoofing prevents address faking).
-
-
-
-
-
-Note that we log anything which doesn't match any of these (obviously,
-this should never happen).
-
-
-
-
-
-ipchains -A forward -s 192.168.1./24 -i eth0 -j good-dmz
-ipchains -A forward -s 192.168.1./24 -i ppp0 -j good-bad
-ipchains -A forward -s 192.84.219./24 -i ppp0 -j dmz-bad
-ipchains -A forward -s 192.84.219./24 -i eth1 -j dmz-good
-ipchains -A forward -i eth0 -j bad-dmz
-ipchains -A forward -i eth1 -j bad-good
-ipchains -A forward -j DENY -l
-
-
-
-
-
-
-!Define the icmp-acc Chain
-
-
-Packets which are one of the error ICMPs get ACCEPTed, otherwise,
-control will pass back to the calling chain.
-
-
-
-
-
-
-
-
-ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
-ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
-ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
-ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT
-
-
-
-
-
-
-!Good (Internal) to DMZ (Servers)
-
-
-Internal restrictions:
-
-
-* Allow WWW, ftp, traceroute, ssh to external
-*
-
-* __Allow SMTP to Mail server__
-*
-
-* __Allow POP-3 to Mail server__
-*
-
-* __Allow DNS to Name server__
-*
-
-* __Allow rsync to Web server__
-*
-
-* __Allow WWW to Web server__
-*
-
-* Allow ping to packet filter box
-*
-
-
-
-Could do masquerading from internal network into DMZ, but here we
-don't. Since noone in the internal network should be trying to do
-evil things, we log any packets that get denied.
-
-
-
-
-
-Note that old versions of Debian called `pop3' `pop-3' in
-/etc/services, which disagrees with RFC1700.
-
-
-
-
-
-ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
-ipchains -A good-dmz -p tcp -d 192.84.219.128 pop3 -j ACCEPT
-ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
-ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
-ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
-ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
-ipchains -A good-dmz -p icmp -j icmp-acc
-ipchains -A good-dmz -j DENY -l
-
-
-
-
-
-
-
-
-
-!Bad (external) to DMZ (servers).
-
-
-
-
-
-
-
-
-* DMZ restrictions:
-
-
-** Mail server
-
-
-*** __SMTP to external__
-***
-
-*** __Accept SMTP from__ internal and __external__
-***
-
-*** Accept POP-3 from internal
-***
-
-
-**
-
-** Name server
-
-
-*** __Send DNS to external__
-***
-
-*** __Accept DNS from__ internal, __external__ and packet filter box
-***
-
-
-**
-
-** Web server
-
-
-*** __Accept HTTP from__ internal and __external__
-***
-
-*** Rsync access from internal
-***
-
-
-**
-
-
-*
-
-* Things we allow from external network to DMZ.
-
-
-** Don't log violations, as they may happen.
-**
-
-
-
-ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
-ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
-ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
-ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
-ipchains -A bad-dmz -p icmp -j icmp-acc
-ipchains -A bad-dmz -j DENY
-
-
-
-*
-
-
-
-
-
-!Good (internal) to Bad (external).
-
-
-
-
-
-* Internal restrictions:
-
-
-** __Allow WWW, ftp, traceroute, ssh to external__
-**
-
-** Allow SMTP to Mail server
-**
-
-** Allow POP-3 to Mail server
-**
-
-** Allow DNS to Name server
-**
-
-** Allow rsync to Web server
-**
-
-** Allow WWW to Web server
-**
-
-** Allow ping to packet filter box
-**
-
-
-*
-
-* Many people allow everything from the internal to external networks,
-then add restrictions. We're being fascist.
-
-
-** Log violations.
-**
-
-** Passive FTP handled by masq. module.
-**
-
-** UDP destination ports 33434 and up are used by traceroute.
-**
-
-
-
-ipchains -A good-bad -p tcp --dport www -j MASQ
-ipchains -A good-bad -p tcp --dport ssh -j MASQ
-ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
-ipchains -A good-bad -p tcp --dport ftp -j MASQ
-ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
-ipchains -A good-bad -j REJECT -l
-
-
-
-*
-
-
-
-
-
-!DMZ to Good (internal).
-
-
-
-
-
-
-
-
-* Internal restrictions:
-
-
-** Allow WWW, ftp, traceroute, ssh to external
-**
-
-** __Allow SMTP to Mail server__
-**
-
-** __Allow POP-3 to Mail server__
-**
-
-** __Allow DNS to Name server__
-**
-
-** __Allow rsync to Web server__
-**
-
-** __Allow WWW to Web server__
-**
-
-** Allow ping to packet filter box
-**
-
-
-*
-
-* If we were masquerading from the internal network to the DMZ, simply
-refuse any packets coming the other way. As it is, only allow packets
-which might be part of an established connection.
-
-
-ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
-ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
-ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
-ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
-ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
-ipchains -A dmz-good -p icmp -j icmp-acc
-ipchains -A dmz-good -j DENY -l
-
-
-
-*
-
-
-
-
-
-!DMZ to bad (external).
-
-
-
-
-
-
-
-
-* DMZ restrictions:
-
-
-** Mail server
-
-
-*** __SMTP to external__
-***
-
-*** __Accept SMTP from__ internal and __external__
-***
-
-*** Accept POP-3 from internal
-***
-
-
-**
-
-** Name server
-
-
-*** __Send DNS to external__
-***
-
-*** __Accept DNS from__ internal, __external__ and packet filter box
-***
-
-
-**
-
-** Web server
-
-
-*** __Accept HTTP from__ internal and __external__
-***
-
-*** Rsync access from internal
-***
-
-
-**
-
-
-*
-
-*
-
-
-ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
-ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
-ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
-ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
-ipchains -A dmz-bad -p icmp -j icmp-acc
-ipchains -A dmz-bad -j DENY -l
-
-
-
-*
-
-
-
-
-
-!Bad (external) to Good (internal).
-
-
-
-
-
-
-
-
-* We don't allow anything (non-masqueraded) from the external network
-to the internal network
-
-
-ipchains -A bad-good -j REJECT
-
-
-
-*
-
-
-
-
-
-!Packet Filtering for the Linux Box Itself
-
-
-
-
-
-
-
-
-* If we want to use packet filtering on packets coming into the box
-itself, we need to do filtering in the input chain. We create one
-chain for each destination interface:
-
-
-ipchains -N bad-if
-ipchains -N dmz-if
-ipchains -N good-if
-
-
-
-*
-
-* Create jumps to them:
-
-
-ipchains -A input -d 192.84.219.1 -j bad-if
-ipchains -A input -d 192.84.219.250 -j dmz-if
-ipchains -A input -d 192.168.1.250 -j good-if
-
-
-
-*
-
-
-
-
-
-!Bad (external) interface.
-
-
-
-
-
-
-
-
-* Packet Filter box:
-
-
-** __PING any network__
-**
-
-** __TRACEROUTE any network__
-**
-
-** Access DNS
-**
-
-
-*
-
-* External interface also receives replies to masqueraded packets
-(masquerading uses source ports 61000 to 65095) and ICMP errors for
-them and PING replies.
-
-
-ipchains -A bad-if -i ! ppp0 -j DENY -l
-ipchains -A bad-if -p TCP --dport 61000:65095 -j ACCEPT
-ipchains -A bad-if -p UDP --dport 61000:65095 -j ACCEPT
-ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
-ipchains -A bad-if -j icmp-acc
-ipchains -A bad-if -j DENY
-
-
-
-*
-
-
-
-
-
-!DMZ interface.
-
-
-
-
-
-
-
-
-* Packet Filter box restrictions:
-
-
-** __PING any network__
-**
-
-** __TRACEROUTE any network__
-**
-
-** __Access DNS__
-**
-
-
-*
-
-* DMZ interface receives DNS replies, ping replies and ICMP errors.
-
-
-ipchains -A dmz-if -i ! eth0 -j DENY
-ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
-ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
-ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
-ipchains -A dmz-if -j icmp-acc
-ipchains -A dmz-if -j DENY -l
-
-
-
-*
-
-
-
-
-
-!Good (internal) interface.
-
-
-
-
-
-
-
-
-* Packet Filter box restrictions:
-
-
-** __PING any network__
-**
-
-** __TRACEROUTE any network__
-**
-
-** __Access DNS__
-**
-
-
-*
-
-* Internal restrictions:
-
-
-** Allow WWW, ftp, traceroute, ssh to external
-**
-
-** Allow SMTP to Mail server
-**
-
-** Allow POP-3 to Mail server
-**
-
-** Allow DNS to Name server
-**
-
-** Allow rsync to Web server
-**
-
-** Allow WWW to Web server
-**
-
-** __Allow ping to packet filter box__
-**
-
-
-*
-
-* Internal interface receives pings, ping replies and ICMP errors.
-
-
-ipchains -A good-if -i ! eth1 -j DENY
-ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
-ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
-ipchains -A good-if -j icmp-acc
-ipchains -A good-if -j DENY -l
-
-
-
-*
-
-
-
-
-
-!!7.5 Finally
-
-
-
-
-
-
-* Delete blocking rules:
-
-
-ipchains -D input 1
-ipchains -D forward 1
-ipchains -D output 1
-
-
-
-*
-
-
-
-
-----
-
-!! 8. Appendix: Differences between ipchains and ipfwadm.
-
-
-Some of these changes are a result of kernel changes, and some a
-result of ipchains being different from ipfwadm.
-
-
-
-
-
-
-
-
-# Many arguments have been remapped: capitals now indicates a
-command, and lower case now indicates an option.
-
-#
-
-# Arbitrary chains are supported, so even built-in chains have
-full names instead of flags (eg. `input' instead of `-I').
-
-#
-
-# The `-k' option has vanished: use `! -y'.
-
-#
-
-# The `-b' option actually inserts/appends/deletes two rules,
-rather than a single `bidirectional' rule.
-
-#
-
-# The `-b' option can be passed to `-C' to do two checks (one in
-each direction).
-
-#
-
-# The `-x' option to `-l' has been replaced by `-v'.
-
-#
-
-# Multiple source and destination ports are not supported
-anymore. Hopefully being able to negate the port range will somewhat
-make up for that.
-
-#
-
-# Interfaces can only be specified by name (not address). The
-old semantics got silently changed in the 2.1 kernel series anyway.
-
-#
-
-# Fragments are examined, not automatically allowed through.
-
-#
-
-# Explicit accounting chains have been done away with.
-
-#
-
-# Arbitrary protocols over IP can be tested for.
-
-#
-
-# The old behavior of SYN and ACK matching (which was previously
-ignored for non-TCP packets) has changed; the SYN option is not valid
-for non-TCP-specific rules.
-
-#
-
-# Counters are now 64-bit on 32-bit machines, not 32-bit.
-
-#
-
-# Inverse options are now supported.
-
-#
-
-# ICMP codes are now supported.
-
-#
-
-# Wildcard interfaces are now supported.
-
-#
-
-# TOS manipulations are now sanity-checked: the old kernel code
-would silently stop you from (illegally) manipulating the `Must Be
-Zero' TOS bit; ipchains now returns an error if you try, as well as
-for other illegal cases.
-#
-
-
-
-
-
-!!8.1 Quick-Reference table.
-
-
-
-[[ Mainly, command arguments are UPPER CASE, and option arguments are
-lower case ]
-
-
-
-
-
-One thing to note, masquerading is specified by `-j MASQ'; it is
-completely different from `-j ACCEPT', and not treated as merely a
-side-effect, unlike ipfwadm does.
-
-
-
-
-
-
-
-================================================================
-| ipfwadm | ipchains | Notes
-----------------------------------------------------------------
-| -A [[both] | -N acct | Create an `acct' chain
-| |& -I 1 input -j acct | and have output and input
-| |& -I 1 output -j acct | packets traverse it.
-| |& acct |
-----------------------------------------------------------------
-| -A in | input | A rule with no target
-----------------------------------------------------------------
-| -A out | output | A rule with no target
-----------------------------------------------------------------
-| -F | forward | Use this as [[chain].
-----------------------------------------------------------------
-| -I | input | Use this as [[chain].
-----------------------------------------------------------------
-| -O | output | Use this as [[chain].
-----------------------------------------------------------------
-| -M -l | -M -L |
-----------------------------------------------------------------
-| -M -s | -M -S |
-----------------------------------------------------------------
-| -a policy | -A [[chain] -j POLICY | (but see -r and -m).
-----------------------------------------------------------------
-| -d policy | -D [[chain] -j POLICY | (but see -r and -m).
-----------------------------------------------------------------
-| -i policy | -I 1 [[chain] -j POLICY| (but see -r and -m).
-----------------------------------------------------------------
-| -l | -L |
-----------------------------------------------------------------
-| -z | -Z |
-----------------------------------------------------------------
-| -f | -F |
-----------------------------------------------------------------
-| -p | -P |
-----------------------------------------------------------------
-| -c | -C |
-----------------------------------------------------------------
-| -P | -p |
-----------------------------------------------------------------
-| -S | -s | Only takes one port or
-| | | range, not multiples.
-----------------------------------------------------------------
-| -D | -d | Only takes one port or
-| | | range, not multiples.
-----------------------------------------------------------------
-| -V | <none> | Use -i [[name].
-----------------------------------------------------------------
-| -W | -i |
-----------------------------------------------------------------
-| -b | -b | Now actually makes 2 rules.
-----------------------------------------------------------------
-| -e | -v |
-----------------------------------------------------------------
-| -k | ! -y | Doesn't work unless
-| | | -p tcp also specified.
-----------------------------------------------------------------
-| -m | -j MASQ |
-----------------------------------------------------------------
-| -n | -n |
-----------------------------------------------------------------
-| -o | -l |
-----------------------------------------------------------------
-| -r [[redirpt] | -j REDIRECT [[redirpt] |
-----------------------------------------------------------------
-| -t | -t |
-----------------------------------------------------------------
-| -v | -v |
-----------------------------------------------------------------
-| -x | -x |
-----------------------------------------------------------------
-| -y | -y | Doesn't work unless
-| | | -p tcp also specified.
-----------------------------------------------------------------
-
-
-
-
-
-!!8.2 Examples of translated ipfwadm commands
-
-
-
-Old command: ipfwadm -F -p deny
-
-
-New command: ipchains -P forward DENY
-
-
-
-
-
-Old command: ipfwadm -F -a m -S 192.168../24 -D .../
-
-
-New command: ipchains -A forward -j MASQ -s 192.168../24 -d .../
-
-
-
-
-
-Old command: ipfwadm -I -a accept -V 10.1.2.1 -S 10.../8 -D .../
-
-
-New command: ipchains -A input -j ACCEPT -i eth0 -s 10.../8 -d .../
-
-
-(Note that there is no equivalent for specifying interfaces by
-address: use the interface name. On this machine, 10.1.2.1
-corresponds to eth0).
-
-
-
-----
-
-!! 9. Appendix: Using the ipfwadm-wrapper script.
-
-
-The ipfwadm-wrapper shell script should be a plug-in replacement of
-ipfwadm for backwards compatibility with ipfwadm 2.3a.
-
-
-
-
-
-The only feature it can't really handle is the `-V' option. When this
-is used, a warning is given. If the `-W' option is also used, the
-`-V' option is ignored. Otherwise, the script tries to find the
-interface name associated with that address, using ifconfig. If
-that fails (such as for an interface which is down) then it will exit
-with an error message.
-
-
-
-
-
-This warning can be suppressed by either changing the `-V' to a `-W',
-or directing the standard output of the script to /dev/null.
-
-
-
-
-
-If you should find any mistakes in this script, or any changes between
-the real ipfwadm and this script, ''please'' report a bug to me: send
-an EMail to rusty@linuxcare.com with "BUG-REPORT" in the subject.
-Please list your old version of ipfwadm (ipfwadm -h), your
-version of ipchains (ipchains --version), the version of the
-ipfwadm wrapper script (ipfwadm-wrapper --version). Also send the
-output of ipchains-save. Thanks in advance.
-
-
-
-
-
-Mix ipchains with this ipfwadm-wrapper script at
-your own peril.
-
-
-
-----
-
-!!10. Appendix: Thanks.
-
-
-Many thanks have to go to Michael Neuling, who wrote the first
-releasable cut of the IP chains code while working for me. Public
-apologies for nixing his result-caching idea, which Alan Cox later
-proposed and I have finally begun implementing, having seen the error
-of my ways.
-
-
-
-
-
-Thanks to Alan Cox for his 24-hour EMail tech support, and
-encouragement.
-
-
-
-
-
-Thanks to all the authors of the ipfw and ipfwadm code, especially Jos
-Vos. Standing on the shoulders of giants and all that... This
-applies to Linus Torvalds and all the kernel and userspace hackers as
-well.
-
-
-
-
-
-Thanks to the diligent beta testers and bughunters, especially Jordan
-Mendelson, Shaw Carruthers, Kevin Moule, Dr. Liviu Daia, Helmut Adams,
-Franck Sicard, Kevin Littlejohn, Matt Kemner, John D. Hardin, Alexey
-Kuznetsov, Leos Bitto, Jim Kunzman, Gerard Gerritsen, Serge Sivkov,
-Andrew Burgess, Steve Schmidtke, Richard Offer, Bernhard Weisshuhn,
-Larry Auton, Ambrose Li, Pavel Krauz, Steve Chadsey, Francesco
-Potorti`, Alain Knaff, Casper Boden-Cummins and Henry Hollenberg.
-
-
-
-
-!!10.1 Translations
-
-
-
-People who do translations should put themselves at the ''top''
-of the Thanks page, like so: `Special thanks to XXX, for translating
-everything exactly from my English.'. Then tell me about your
-translation so I can include it here.
-
-
-
-
-
-Arnaud Launay, asl@launay.org:
-http://www.freenix.fr/unix/linux/HOWTO/IPCHAINS-HOWTO.html
-
-
-
-
-Giovanni Bortolozzo, borto@pluto.linux.it:
-http://www.pluto.linux.it/ildp/HOWTO/IPCHAINS-HOWTO.html
-
-
-
-
-Herman Rodriacuteguez, herman@maristas.dhis.org:
-http://netfilter.kernelnotes.org/ipchains/spanish/HOWTO.html
-
-
-----
+Describe
[HowToIPCHAINSHOWTO
] here.