summaryrefslogtreecommitdiff
path: root/doc/firewall.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/firewall.html')
-rw-r--r--doc/firewall.html767
1 files changed, 0 insertions, 767 deletions
diff --git a/doc/firewall.html b/doc/firewall.html
deleted file mode 100644
index 0747ab83d..000000000
--- a/doc/firewall.html
+++ /dev/null
@@ -1,767 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
-<HTML>
-<HEAD>
-<TITLE>Introduction to FreeS/WAN</TITLE>
-<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=iso-8859-1">
-<STYLE TYPE="text/css"><!--
-BODY { font-family: serif }
-H1 { font-family: sans-serif }
-H2 { font-family: sans-serif }
-H3 { font-family: sans-serif }
-H4 { font-family: sans-serif }
-H5 { font-family: sans-serif }
-H6 { font-family: sans-serif }
-SUB { font-size: smaller }
-SUP { font-size: smaller }
-PRE { font-family: monospace }
---></STYLE>
-</HEAD>
-<BODY>
-<A HREF="toc.html">Contents</A>
-<A HREF="manpages.html">Previous</A>
-<A HREF="trouble.html">Next</A>
-<HR>
-<H1><A name="firewall">FreeS/WAN and firewalls</A></H1>
-<P>FreeS/WAN, or other IPsec implementations, frequently run on gateway
- machines, the same machines running firewall or packet filtering code.
- This document discusses the relation between the two.</P>
-<P>The firewall code in 2.4 and later kernels is called Netfilter. The
- user-space utility to manage a firewall is iptables(8). See the<A href="http://netfilter.samba.org">
- netfilter/iptables web site</A> for details.</P>
-<H2><A name="filters">Filtering rules for IPsec packets</A></H2>
-<P>The basic constraint is that<STRONG> an IPsec gateway must have
- packet filters that allow IPsec packets</STRONG>, at least when talking
- to other IPsec gateways:</P>
-<UL>
-<LI>UDP port 500 for<A href="glossary.html#IKE"> IKE</A> negotiations</LI>
-<LI>protocol 50 if you use<A href="glossary.html#ESP"> ESP</A>
- encryption and/or authentication (the typical case)</LI>
-<LI>protocol 51 if you use<A href="glossary.html#AH"> AH</A>
- packet-level authentication</LI>
-</UL>
-<P>Your gateway and the other IPsec gateways it communicates with must
- be able to exchange these packets for IPsec to work. Firewall rules
- must allow UDP 500 and at least one of<A href="glossary.html#AH"> AH</A>
- or<A href="glossary.html#ESP"> ESP</A> on the interface that
- communicates with the other gateway.</P>
-<P>For nearly all FreeS/WAN applications, you must allow UDP port 500
- and the ESP protocol.</P>
-<P>There are two ways to set this up:</P>
-<DL>
-<DT>easier but less flexible</DT>
-<DD>Just set up your firewall scripts at boot time to allow IPsec
- packets to and from your gateway. Let FreeS/WAN reject any bogus
- packets.</DD>
-<DT>more work, giving you more precise control</DT>
-<DD>Have the<A href="manpage.d/ipsec_pluto.8.html"> ipsec_pluto(8)</A>
- daemon call scripts to adjust firewall rules dynamically as required.
- This is done by naming the scripts in the<A href="manpage.d/ipsec.conf.5.html">
- ipsec.conf(5)</A> variables<VAR> prepluto=</VAR>,<VAR> postpluto=</VAR>
-,<VAR> leftupdown=</VAR> and<VAR> rightupdown=</VAR>.</DD>
-</DL>
-<P>Both methods are described in more detail below.</P>
-<H2><A name="examplefw">Firewall configuration at boot</A></H2>
-<P>It is possible to set up both firewalling and IPsec with appropriate
- scripts at boot and then not use<VAR> leftupdown=</VAR> and<VAR>
- rightupdown=</VAR>, or use them only for simple up and down operations.</P>
-<P>Basically, the technique is</P>
-<UL>
-<LI>allow IPsec packets (typically, IKE on UDP port 500 plus ESP,
- protocol 50)
-<UL>
-<LI>incoming, if the destination address is your gateway (and
- optionally, only from known senders)</LI>
-<LI>outgoing, with the from address of your gateway (and optionally,
- only to known receivers)</LI>
-</UL>
-</LI>
-<LI>let<A href="glossary.html#Pluto"> Pluto</A> deal with IKE</LI>
-<LI>let<A href="glossary.html#KLIPS"> KLIPS</A> deal with ESP</LI>
-</UL>
-<P>Since Pluto authenticates its partners during the negotiation, and
- KLIPS drops packets for which no tunnel has been negotiated, this may
- be all you need.</P>
-<H3><A name="simple.rules">A simple set of rules</A></H3>
-<P>In simple cases, you need only a few rules, as in this example:</P>
-<PRE># allow IPsec
-#
-# IKE negotiations
-iptables -I INPUT -p udp --sport 500 --dport 500 -j ACCEPT
-iptables -I OUTPUT -p udp --sport 500 --dport 500 -j ACCEPT
-# ESP encryption and authentication
-iptables -I INPUT -p 50 -j ACCEPT
-iptables -I OUTPUT -p 50 -j ACCEPT
-</PRE>
-<P>This should be all you need to allow IPsec through<VAR> lokkit</VAR>,
- which ships with Red Hat 9, on its medium security setting. Once you've
- tweaked to your satisfaction, save your active rule set with:</P>
-<PRE>service iptables save</PRE>
-<H3><A name="complex.rules">Other rules</A></H3>
- You can add additional rules, or modify existing ones, to work with
- IPsec and with your network and policies. We give a some examples in
- this section.
-<P>However, while it is certainly possible to create an elaborate set of
- rules yourself (please let us know via the<A href="mail.html"> mailing
- list</A> if you do), it may be both easier and more secure to use a set
- which has already been published and tested.</P>
-<P>The published rule sets we know of are described in the<A href="#rules.pub">
- next section</A>.</P>
-<H4>Adding additional rules</H4>
- If necessary, you can add additional rules to:
-<DL>
-<DT>reject IPsec packets that are not to or from known gateways</DT>
-<DD>This possibility is discussed in more detail<A href="#unknowngate">
- later</A></DD>
-<DT>allow systems behind your gateway to build IPsec tunnels that pass
- through the gateway</DT>
-<DD>This possibility is discussed in more detail<A href="#through">
- later</A></DD>
-<DT>filter incoming packets emerging from KLIPS.</DT>
-<DD>Firewall rules can recognise packets emerging from IPsec. They are
- marked as arriving on an interface such as<VAR> ipsec0</VAR>, rather
- than<VAR> eth0</VAR>,<VAR> ppp0</VAR> or whatever.</DD>
-</DL>
-<P>It is therefore reasonably straightforward to filter these packets in
- whatever way suits your situation.</P>
-<H4>Modifying existing rules</H4>
-<P>In some cases rules that work fine before you add IPsec may require
- modification to work with IPsec.</P>
-<P>This is especially likely for rules that deal with interfaces on the
- Internet side of your system. IPsec adds a new interface; often the
- rules must change to take account of that.</P>
-<P>For example, consider the rules given in<A href="http://www.netfilter.org/documentation/HOWTO//packet-filtering-HOWTO-5.html">
- this section</A> of the Netfilter documentation:</P>
-<PRE>Most people just have a single PPP connection to the Internet, and don't
-want anyone coming back into their network, or the firewall:
-
- ## Insert connection-tracking modules (not needed if built into kernel).
- # insmod ip_conntrack
- # insmod ip_conntrack_ftp
-
- ## Create chain which blocks new connections, except if coming from inside.
- # iptables -N block
- # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
- # iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
- # iptables -A block -j DROP
-
- ## Jump to that chain from INPUT and FORWARD chains.
- # iptables -A INPUT -j block
- # iptables -A FORWARD -j block</PRE>
-<P>On an IPsec gateway, those rules may need to be modified. The above
- allows new connections from<EM> anywhere except ppp0</EM>. That means
- new connections from ipsec0 are allowed.</P>
-<P>Do you want to allow anyone who can establish an IPsec connection to
- your gateway to initiate TCP connections to any service on your
- network? Almost certainly not if you are using opportunistic
- encryption. Quite possibly not even if you have only explicitly
- configured connections.</P>
-<P>To disallow incoming connections from ipsec0, change the middle
- section above to:</P>
-<PRE> ## Create chain which blocks new connections, except if coming from inside.
- # iptables -N block
- # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
- # iptables -A block -m state --state NEW -i ppp+ -j DROP
- # iptables -A block -m state --state NEW -i ipsec+ -j DROP
- # iptables -A block -m state --state NEW -i -j ACCEPT
- # iptables -A block -j DROP</PRE>
-<P>The original rules accepted NEW connections from anywhere except
- ppp0. This version drops NEW connections from any PPP interface (ppp+)
- and from any ipsec interface (ipsec+), then accepts the survivors.</P>
-<P>Of course, these are only examples. You will need to adapt them to
- your own situation.</P>
-<H3><A name="rules.pub">Published rule sets</A></H3>
-<P>Several sets of firewall rules that work with FreeS/WAN are
- available.</P>
-<H4><A name="Ranch.trinity">Scripts based on Ranch's work</A></H4>
-<P>One user, Rob Hutton, posted his boot time scripts to the mailing
- list, and we included them in previous versions of this documentation.
- They are still available from our<A href="http://www.freeswan.org/freeswan_trees/freeswan-1.5/doc/firewall.html#examplefw">
- web site</A>. However, they were for an earlier FreeS/WAN version so we
- no longer recommend them. Also, they had some bugs. See this<A href="http://www.sandelman.ottawa.on.ca/linux-ipsec/html/2000/04/msg00316.html">
- message</A>.</P>
-<P>Those scripts were based on David Ranch's scripts for his &quot;Trinity
- OS&quot; for setting up a secure Linux. Check his<A href="http://www.ecst.csuchico.edu/~dranch/LINUX/index-linux.html">
- home page</A> for the latest version and for information on his<A href="biblio.html#ranch">
- book</A> on securing Linux. If you are going to base your firewalling
- on Ranch's scripts, we recommend using his latest version, and sending
- him any IPsec modifications you make for incorporation into later
- versions.</P>
-<H4><A name="seawall">The Seattle firewall</A></H4>
-<P>We have had several mailing lists reports of good results using
- FreeS/WAN with Seawall (the Seattle Firewall). See that project's<A href="http://seawall.sourceforge.net/">
- home page</A> on Sourceforge.</P>
-<H4><A name="rcf">The RCF scripts</A></H4>
-<P>Another set of firewall scripts with IPsec support are the RCF or
- rc.firewall scripts. See their<A href="http://jsmoriss.mvlan.net/linux/rcf.html">
- home page</A>.</P>
-<H4><A name="asgard">Asgard scripts</A></H4>
-<P><A href="http://heimdall.asgardsrealm.net/linux/firewall/">Asgard's
- Realm</A> has set of firewall scripts with FreeS/WAN support, for 2.4
- kernels and iptables.</P>
-<H4><A name="user.scripts">User scripts from the mailing list</A></H4>
-<P>One user gave considerable detail on his scripts, including
- supporting<A href="glossary.html#IPX"> IPX</A> through the tunnel. His
- message was too long to conveniently be quoted here, so I've put it in
- a<A href="user_examples.html"> separate file</A>.</P>
-<H2><A name="updown">Calling firewall scripts, named in ipsec.conf(5)</A>
-</H2>
-<P>The<A href="manpage.d/ipsec.conf.5.html"> ipsec.conf(5)</A>
- configuration file has three pairs of parameters used to specify an
- interface between FreeS/WAN and firewalling code.</P>
-<P>Note that using these is not required if you have a static firewall
- setup. In that case, you just set your firewall up at boot time (in a
- way that permits the IPsec connections you want) and do not change it
- thereafter. Omit all the FreeS/WAN firewall parameters and FreeS/WAN
- will not attempt to adjust firewall rules at all. See<A href="#examplefw">
- above</A> for some information on appropriate scripts.</P>
-<P>However, if you want your firewall rules to change when IPsec
- connections change, then you need to use these parameters.</P>
-<H3><A name="pre_post">Scripts called at IPsec start and stop</A></H3>
-<P>One pair of parmeters are set in the<VAR> config setup</VAR> section
- of the<A href="manpage.d/ipsec.conf.5.html"> ipsec.conf(5)</A> file and
- affect all connections:</P>
-<DL>
-<DT>prepluto=</DT>
-<DD>script to be called before<A href="manpage.d/ipsec_pluto.8.html">
- pluto(8)</A> IKE daemon is started.</DD>
-<DT>postpluto=</DT>
-<DD>script to be called after<A href="manpage.d/ipsec_pluto.8.html">
- pluto(8)</A> IKE daemon is stopped.</DD>
-</DL>
- These parameters allow you to change firewall parameters whenever IPsec
- is started or stopped.
-<P>They can also be used in other ways. For example, you might have<VAR>
- prepluto</VAR> add a module to your kernel for the secure network
- interface or make a dialup connection, and then have<VAR> postpluto</VAR>
- remove the module or take the connection down.</P>
-<H3><A name="up_down">Scripts called at connection up and down</A></H3>
-<P>The other parameters are set in connection descriptions. They can be
- set in individual connection descriptions, and could even call
- different scripts for each connection for maximum flexibility. In most
- applications, however, it makes sense to use only one script and to
- call it from<VAR> conn %default</VAR> section so that it applies to all
- connections.</P>
-<P>You can:</P>
-<DL>
-<DT><STRONG>either</STRONG></DT>
-<DD>set<VAR> leftfirewall=yes</VAR> or<VAR> rightfirewall=yes</VAR> to
- use our supplied default script</DD>
-<DT><STRONG>or</STRONG></DT>
-<DD>assign a name in a<VAR> leftupdown=</VAR> or<VAR> rightupdown=</VAR>
- line to use your own script</DD>
-</DL>
-<P>Note that<STRONG> only one of these should be used</STRONG>. You
- cannot sensibly use both. Since<STRONG> our default script is obsolete</STRONG>
- (designed for firewalls using<VAR> ipfwadm(8)</VAR> on 2.0 kernels),
- most users who need this service will<STRONG> need to write a custom
- script</STRONG>.</P>
-<H4><A name="fw.default">The default script</A></H4>
-<P>We supply a default script named<VAR> _updown</VAR>.</P>
-<DL>
-<DT>leftfirewall=</DT>
-<DD></DD>
-<DT>rightfirewall=</DT>
-<DD>indicates that the gateway is doing firewalling and that<A href="manpage.d/ipsec_pluto.8.html">
- pluto(8)</A> should poke holes in the firewall as required.</DD>
-</DL>
-<P>Set these to<VAR> yes</VAR> and Pluto will call our default script<VAR>
- _updown</VAR> with appropriate arguments whenever it:</P>
-<UL>
-<LI>starts or stops IPsec services</LI>
-<LI>brings a connection up or down</LI>
-</UL>
-<P>The supplied default<VAR> _updown</VAR> script is appropriate for
- simple cases using the<VAR> ipfwadm(8)</VAR> firewalling package.</P>
-<H4><A name="userscript">User-written scripts</A></H4>
-<P>You can also write your own script and have Pluto call it. Just put
- the script's name in one of these<A href="manpage.d/ipsec.conf.5.html">
- ipsec.conf(5)</A> lines:</P>
-<DL>
-<DT>leftupdown=</DT>
-<DD></DD>
-<DT>rightupdown=</DT>
-<DD>specifies a script to call instead of our default script<VAR>
- _updown</VAR>.</DD>
-</DL>
-<P>Your script should take the same arguments and use the same
- environment variables as<VAR> _updown</VAR>. See the &quot;updown command&quot;
- section of the<A href="manpage.d/ipsec_pluto.8.html"> ipsec_pluto(8)</A>
- man page for details.</P>
-<P>Note that<STRONG> you should not modify our _updown script in place</STRONG>
-. If you did that, then upgraded FreeS/WAN, the upgrade would install a
- new default script, overwriting your changes.</P>
-<H3><A name="ipchains.script">Scripts for ipchains or iptables</A></H3>
-<P>Our<VAR> _updown</VAR> is for firewalls using<VAR> ipfwadm(8)</VAR>,
- the firewall code for the 2.0 series of Linux kernels. If you are using
- the more recent packages<VAR> ipchains(8)</VAR> (for 2.2 kernels) or<VAR>
- iptables(8)</VAR> (2.4 kernels), then you must do one of:</P>
-<UL>
-<LI>use static firewall rules which are set up at boot time as described<A
-href="#examplefw"> above</A> and do not need to be changed by Pluto</LI>
-<LI>limit yourself to ipchains(8)'s ipfwadm(8) emulation mode in order
- to use our script</LI>
-<LI>write your own script and call it with<VAR> leftupdown</VAR> and<VAR>
- rightupdown</VAR>.</LI>
-</UL>
-<P>You can write a script to do whatever you need with firewalling.
- Specify its name in a<VAR> [left|right]updown=</VAR> parameter in<A href="manpage.d/ipsec.conf.5.html">
- ipsec.conf(5)</A> and Pluto will automatically call it for you.</P>
-<P>The arguments Pluto passes such a script are the same ones it passes
- to our default _updown script, so the best way to build yours is to
- copy ours and modify the copy.</P>
-<P>Note, however, that<STRONG> you should not modify our _updown script
- in place</STRONG>. If you did that, then upgraded FreeS/WAN, the
- upgrade would install a new default script, overwriting your changes.</P>
-<H2><A name="NAT">A complication: IPsec vs. NAT</A></H2>
-<P><A href="glossary.html#NAT.gloss">Network Address Translation</A>,
- also known as IP masquerading, is a method of allocating IP addresses
- dynamically, typically in circumstances where the total number of
- machines which need to access the Internet exceeds the supply of IP
- addresses.</P>
-<P>Any attempt to perform NAT operations on IPsec packets<EM> between
- the IPsec gateways</EM> creates a basic conflict:</P>
-<UL>
-<LI>IPsec wants to authenticate packets and ensure they are unaltered on
- a gateway-to-gateway basis</LI>
-<LI>NAT rewrites packet headers as they go by</LI>
-<LI>IPsec authentication fails if packets are rewritten anywhere between
- the IPsec gateways</LI>
-</UL>
-<P>For<A href="glossary.html#AH"> AH</A>, which authenticates parts of
- the packet header including source and destination IP addresses, this
- is fatal. If NAT changes those fields, AH authentication fails.</P>
-<P>For<A href="glossary.html#IKE"> IKE</A> and<A href="glossary.html#ESP">
- ESP</A> it is not necessarily fatal, but is certainly an unwelcome
- complication.</P>
-<H3><A name="nat_ok">NAT on or behind the IPsec gateway works</A></H3>
-<P>This problem can be avoided by having the masquerading take place<EM>
- on or behind</EM> the IPsec gateway.</P>
-<P>This can be done physically with two machines, one physically behind
- the other. A picture, using SG to indicate IPsec<STRONG> S</STRONG>
-ecurity<STRONG> G</STRONG>ateways, is:</P>
-<PRE> clients --- NAT ----- SG ---------- SG
- two machines</PRE>
-<P>In this configuration, the actual client addresses need not be given
- in the<VAR> leftsubnet=</VAR> parameter of the FreeS/WAN connection
- description. The security gateway just delivers packets to the NAT box;
- it needs only that machine's address. What that machine does with them
- does not affect FreeS/WAN.</P>
-<P>A more common setup has one machine performing both functions:</P>
-<PRE> clients ----- NAT/SG ---------------SG
- one machine</PRE>
-<P>Here you have a choice of techniques depending on whether you want to
- make your client subnet visible to clients on the other end:</P>
-<UL>
-<LI>If you want the single gateway to behave like the two shown above,
- with your clients hidden behind the NAT, then omit the<VAR> leftsubnet=</VAR>
- parameter. It then defaults to the gateway address. Clients on the
- other end then talk via the tunnel only to your gateway. The gateway
- takes packets emerging from the tunnel, applies normal masquerading,
- and forwards them to clients.</LI>
-<LI>If you want to make your client machines visible, then give the
- client subnet addresses as the<VAR> leftsubnet=</VAR> parameter in the
- connection description and
-<DL>
-<DT>either</DT>
-<DD>set<VAR> leftfirewall=yes</VAR> to use the default<VAR> updown</VAR>
- script</DD>
-<DT>or</DT>
-<DD>use your own script by giving its name in a<VAR> leftupdown=</VAR>
- parameter</DD>
-</DL>
- These scripts are described in their own<A href="#updown"> section</A>.
-<P>In this case, no masquerading is done. Packets to or from the client
- subnet are encrypted or decrypted without any change to their client
- subnet addresses, although of course the encapsulating packets use
- gateway addresses in their headers. Clients behind the right security
- gateway see a route via that gateway to the left subnet.</P>
-</LI>
-</UL>
-<H3><A name="nat_bad">NAT between gateways is problematic</A></H3>
-<P>We recommend not trying to build IPsec connections which pass through
- a NAT machine. This setup poses problems:</P>
-<PRE> clients --- SG --- NAT ---------- SG</PRE>
-<P>If you must try it, some references are:</P>
-<UL>
-<LI>Jean_Francois Nadeau's document on doing<A href="http://jixen.tripod.com/#NATed gateways">
- IPsec behind NAT</A></LI>
-<LI><A href="web.html#VPN.masq">VPN masquerade patches</A> to make a
- Linux NAT box handle IPsec packets correctly</LI>
-</UL>
-<H3><A name="NAT.ref">Other references on NAT and IPsec</A></H3>
-<P>Other documents which may be relevant include:</P>
-<UL>
-<LI>an Internet Draft on<A href="http://search.ietf.org/internet-drafts/draft-aboba-nat-ipsec-04.txt">
- IPsec and NAT</A> which may eventually evolve into a standard solution
- for this problem.</LI>
-<LI>an informational<A href="http://www.cis.ohio-state.edu/rfc/rfc2709.txt">
- RFC</A>,<CITE> Security Model with Tunnel-mode IPsec for NAT Domains</CITE>
-.</LI>
-<LI>an<A href="http://www.cisco.com/warp/public/759/ipj_3-4/ipj_3-4_nat.html">
- article</A> in Cisco's<CITE> Internet Protocol Journal</CITE></LI>
-</UL>
-<H2><A name="complications">Other complications</A></H2>
-<P>Of course simply allowing UDP 500 and ESP packets is not the whole
- story. Various other issues arise in making IPsec and packet filters
- co-exist and even co-operate. Some of them are summarised below.</P>
-<H3><A name="through">IPsec<EM> through</EM></A> the gateway</H3>
-<P>Basic IPsec packet filtering rules deal only with packets addressed
- to or sent from your IPsec gateway.</P>
-<P>It is a separate policy decision whether to permit such packets to
- pass through the gateway so that client machines can build end-to-end
- IPsec tunnels of their own. This may not be practical if you are using<A
-href="#NAT"> NAT (IP masquerade)</A> on your gateway, and may conflict
- with some corporate security policies.</P>
-<P>Where possible, allowing this is almost certainly a good idea. Using
- IPsec on an end-to-end basis is more secure than gateway-to-gateway.</P>
-<P>Doing it is quite simple. You just need firewall rules that allow UDP
- port 500 and protocols 50 and 51 to pass through your gateway. If you
- wish, you can of course restrict this to certain hosts.</P>
-<H3><A name="ipsec_only">Preventing non-IPsec traffic</A></H3>
- You can also filter<EM> everything but</EM> UDP port 500 and ESP or AH
- to restrict traffic to IPsec only, either for anyone communicating with
- your host or just for specific partners.
-<P>One application of this is for the telecommuter who might have:</P>
-<PRE> Sunset==========West------------------East ================= firewall --- the Internet
- home network untrusted net corporate network</PRE>
-<P>The subnet on the right is 0.0.0.0/0, the whole Internet. The West
- gateway is set up so that it allows only IPsec packets to East in or
- out.</P>
-<P>This configuration is used in AT&amp;T Research's network. For details,
- see the<A href="intro.html#applied"> papers</A> links in our
- introduction.</P>
-<P>Another application would be to set up firewall rules so that an
- internal machine, such as an employees-only web server, could not talk
- to the outside world except via specific IPsec tunnels.</P>
-<H3><A name="unknowngate">Filtering packets from unknown gateways</A></H3>
-<P>It is possible to use firewall rules to restrict UDP 500, ESP and AH
- packets so that these packets are accepted only from known gateways.
- This is not strictly necessary since FreeS/WAN will discard packets
- from unknown gateways. You might, however, want to do it for any of a
- number of reasons. For example:</P>
-<UL>
-<LI>Arguably, &quot;belt and suspenders&quot; is the sensible approach to
- security. If you can block a potential attack in two ways, use both.
- The only question is whether to look for a third way after implementing
- the first two.</LI>
-<LI>Some admins may prefer to use the firewall code this way because
- they prefer firewall logging to FreeS/WAN's logging.</LI>
-<LI>You may need it to implement your security policy. Consider an
- employee working at home, and a policy that says traffic from the home
- system to the Internet at large must go first via IPsec to the
- corporate LAN and then out to the Internet via the corporate firewall.
- One way to do that is to make<VAR> ipsec0</VAR> the default route on
- the home gateway and provide exceptions only for UDP 500 and ESP to the
- corporate gateway. Everything else is then routed via the tunnel to the
- corporate gateway.</LI>
-</UL>
-<P>It is not possible to use only static firewall rules for this
- filtering if you do not know the other gateways' IP addresses in
- advance, for example if you have &quot;road warriors&quot; who may connect from a
- different address each time or if want to do<A href="glossary.html#carpediem">
- opportunistic encryption</A> to arbitrary gateways. In these cases, you
- can accept UDP 500 IKE packets from anywhere, then use the<A href="#updown">
- updown</A> script feature of<A href="manpage.d/ipsec_pluto.8.html">
- pluto(8)</A> to dynamically adjust firewalling for each negotiated
- tunnel.</P>
-<P>Firewall packet filtering does not much reduce the risk of a<A href="glossary.html#DOS">
- denial of service attack</A> on FreeS/WAN. The firewall can drop
- packets from unknown gateways, but KLIPS does that quite efficiently
- anyway, so you gain little. The firewall cannot drop otherwise
- legitmate packets that fail KLIPS authentication, so it cannot protect
- against an attack designed to exhaust resources by making FreeS/WAN
- perform many expensive authentication operations.</P>
-<P>In summary, firewall filtering of IPsec packets from unknown gateways
- is possible but not strictly necessary.</P>
-<H2><A name="otherfilter">Other packet filters</A></H2>
-<P>When the IPsec gateway is also acting as your firewall, other packet
- filtering rules will be in play. In general, those are outside the
- scope of this document. See our<A href="web.html#firewall.linux"> Linux
- firewall links</A> for information. There are a few types of packet,
- however, which can affect the operation of FreeS/WAN or of diagnostic
- tools commonly used with it. These are discussed below.</P>
-<H3><A name="ICMP">ICMP filtering</A></H3>
-<P><A href="glossary.html#ICMP.gloss">ICMP</A> is the<STRONG> I</STRONG>
-nternet<STRONG> C</STRONG>ontrol<STRONG> M</STRONG>essage<STRONG> P</STRONG>
-rotocol. It is used for messages between IP implementations themselves,
- whereas IP used is used between the clients of those implementations.
- ICMP is, unsurprisingly, used for control messages. For example, it is
- used to notify a sender that a desination is not reachable, or to tell
- a router to reroute certain packets elsewhere.</P>
-<P>ICMP handling is tricky for firewalls.</P>
-<UL>
-<LI>You definitely want some ICMP messages to get through; things won't
- work without them. For example, your clients need to know if some
- destination they ask for is unreachable.</LI>
-<LI>On the other hand, you do equally definitely do not want untrusted
- folk sending arbitrary control messages to your machines. Imagine what
- someone moderately clever and moderately malicious could do to you,
- given control of your network's routing.</LI>
-</UL>
-<P>ICMP does not use ports. Messages are distinguished by a &quot;message
- type&quot; field and, for some types, by an additional &quot;code&quot; field. The
- definitive list of types and codes is on the<A href="http://www.iana.org">
- IANA</A> site.</P>
-<P>One expert uses this definition for ICMP message types to be dropped
- at the firewall.</P>
-<PRE># ICMP types which lack socially redeeming value.
-# 5 Redirect
-# 9 Router Advertisement
-# 10 Router Selection
-# 15 Information Request
-# 16 Information Reply
-# 17 Address Mask Request
-# 18 Address Mask Reply
-
-badicmp='5 9 10 15 16 17 18'</PRE>
-<P>A more conservative approach would be to make a list of allowed types
- and drop everything else.</P>
-<P>Whichever way you do it, your ICMP filtering rules on a FreeS/WAN
- gateway should allow at least the following ICMP packet types:</P>
-<DL>
-<DT>echo (type 8)</DT>
-<DD></DD>
-<DT>echo reply (type 0)</DT>
-<DD>These are used by ping(1). We recommend allowing both types through
- the tunnel and to or from your gateway's external interface, since
- ping(1) is an essential testing tool.
-<P>It is fairly common for firewalls to drop ICMP echo packets addressed
- to machines behind the firewall. If that is your policy, please create
- an exception for such packets arriving via an IPsec tunnel, at least
- during intial testing of those tunnels.</P>
-</DD>
-<DT>destination unreachable (type 3)</DT>
-<DD>This is used, with code 4 (Fragmentation Needed and Don't Fragment
- was Set) in the code field, to control<A href="glossary.html#pathMTU">
- path MTU discovery</A>. Since IPsec processing adds headers, enlarges
- packets and may cause fragmentation, an IPsec gateway should be able to
- send and receive these ICMP messages<STRONG> on both inside and outside
- interfaces</STRONG>.</DD>
-</DL>
-<H3><A name="traceroute">UDP packets for traceroute</A></H3>
-<P>The traceroute(1) utility uses UDP port numbers from 33434 to
- approximately 33633. Generally, these should be allowed through for
- troubleshooting.</P>
-<P>Some firewalls drop these packets to prevent outsiders exploring the
- protected network with traceroute(1). If that is your policy, consider
- creating an exception for such packets arriving via an IPsec tunnel, at
- least during intial testing of those tunnels.</P>
-<H3><A name="l2tp">UDP for L2TP</A></H3>
-<P> Windows 2000 does, and products designed for compatibility with it
- may, build<A href="glossary.html#L2TP"> L2TP</A> tunnels over IPsec
- connections.</P>
-<P>For this to work, you must allow UDP protocol 1701 packets coming out
- of your tunnels to continue to their destination. You can, and probably
- should, block such packets to or from your external interfaces, but
- allow them from<VAR> ipsec0</VAR>.</P>
-<P>See also our Windows 2000<A href="interop.html#win2k"> interoperation
- discussion</A>.</P>
-<H2><A name="packets">How it all works: IPsec packet details</A></H2>
-<P>IPsec uses three main types of packet:</P>
-<DL>
-<DT><A href="glossary.html#IKE">IKE</A> uses<STRONG> the UDP protocol
- and port 500</STRONG>.</DT>
-<DD>Unless you are using only (less secure, not recommended) manual
- keying, you need IKE to negotiate connection parameters, acceptable
- algorithms, key sizes and key setup. IKE handles everything required to
- set up, rekey, repair or tear down IPsec connections.</DD>
-<DT><A href="glossary.html#ESP">ESP</A> is<STRONG> protocol number 50</STRONG>
-</DT>
-<DD>This is required for encrypted connections.</DD>
-<DT><A href="glossary.html#AH">AH</A> is<STRONG> protocol number 51</STRONG>
-</DT>
-<DD>This can be used where only authentication, not encryption, is
- required.</DD>
-</DL>
-<P>All of those packets should have appropriate IPsec gateway addresses
- in both the to and from IP header fields. Firewall rules can check this
- if you wish, though it is not strictly necessary. This is discussed in
- more detail<A href="#unknowngate"> later</A>.</P>
-<P>IPsec processing of incoming packets authenticates them then removes
- the ESP or AH header and decrypts if necessary. Successful processing
- exposes an inner packet which is then delivered back to the firewall
- machinery, marked as having arrived on an<VAR> ipsec[0-3]</VAR>
- interface. Firewall rules can use that interface label to distinguish
- these packets from unencrypted packets which are labelled with the
- physical interface they arrived on (or perhaps with a non-IPsec virtual
- interface such as<VAR> ppp0</VAR>).</P>
-<P>One of our users sent a mailing list message with a<A href="http://www.sandelman.ottawa.on.ca/linux-ipsec/html/2000/12/msg00006.html">
- diagram</A> of the packet flow.</P>
-<H3><A name="noport">ESP and AH do not have ports</A></H3>
-<P>Some protocols, such as TCP and UDP, have the notion of ports. Others
- protocols, including ESP and AH, do not. Quite a few IPsec newcomers
- have become confused on this point. There are no ports<EM> in</EM> the
- ESP or AH protocols, and no ports used<EM> for</EM> them. For these
- protocols,<EM> the idea of ports is completely irrelevant</EM>.</P>
-<H3><A name="header">Header layout</A></H3>
-<P>The protocol numbers for ESP or AH are used in the 'next header'
- field of the IP header. On most non-IPsec packets, that field would
- have one of:</P>
-<UL>
-<LI>1 for ICMP</LI>
-<LI>4 for IP-in-IP encapsulation</LI>
-<LI>6 for TCP</LI>
-<LI>17 for UDP</LI>
-<LI>... or one of about 100 other possibilities listed by<A href="http://www.iana.org">
- IANA</A></LI>
-</UL>
-<P>Each header in the sequence tells what the next header will be. IPsec
- adds headers for ESP or AH near the beginning of the sequence. The
- original headers are kept and the 'next header' fields adjusted so that
- all headers can be correctly interpreted.</P>
-<P>For example, using<STRONG> [</STRONG><STRONG> ]</STRONG> to indicate
- data protected by ESP and unintelligible to an eavesdropper between the
- gateways:</P>
-<UL>
-<LI>a simple packet might have only IP and TCP headers with:
-<UL>
-<LI>IP header says next header --&gt; TCP</LI>
-<LI>TCP header port number --&gt; which process to send data to</LI>
-<LI>data</LI>
-</UL>
-</LI>
-<LI>with ESP<A href="glossary.html#transport"> transport mode</A>
- encapsulation, that packet would have:
-<UL>
-<LI>IP header says next header --&gt; ESP</LI>
-<LI>ESP header<STRONG> [</STRONG> says next --&gt; TCP</LI>
-<LI>TCP header port number --&gt; which process to send data to</LI>
-<LI>data<STRONG> ]</STRONG></LI>
-</UL>
- Note that the IP header is outside ESP protection, visible to an
- attacker, and that the final destination must be the gateway.</LI>
-<LI>with ESP in<A href="glossary.html#tunnel"> tunnel mode</A>, we might
- have:
-<UL>
-<LI>IP header says next header --&gt; ESP</LI>
-<LI>ESP header<STRONG> [</STRONG> says next --&gt; IP</LI>
-<LI>IP header says next header --&gt; TCP</LI>
-<LI>TCP header port number --&gt; which process to send data to</LI>
-<LI>data<STRONG> ]</STRONG></LI>
-</UL>
- Here the inner IP header is protected by ESP, unreadable by an
- attacker. Also, the inner header can have a different IP address than
- the outer IP header, so the decrypted packet can be routed from the
- IPsec gateway to a final destination which may be another machine.</LI>
-</UL>
-<P>Part of the ESP header itself is encrypted, which is why the<STRONG>
- [</STRONG> indicating protected data appears in the middle of some
- lines above. The next header field of the ESP header is protected. This
- makes<A href="glossary.html#traffic"> traffic analysis</A> more
- difficult. The next header field would tell an eavesdropper whether
- your packet was UDP to the gateway, TCP to the gateway, or encapsulated
- IP. It is better not to give this information away. A clever attacker
- may deduce some of it from the pattern of packet sizes and timings, but
- we need not make it easy.</P>
-<P>IPsec allows various combinations of these to match local policies,
- including combinations that use both AH and ESP headers or that nest
- multiple copies of these headers.</P>
-<P>For example, suppose my employer has an IPsec VPN running between two
- offices so all packets travelling between the gateways for those
- offices are encrypted. If gateway policies allow it (The admins could
- block UDP 500 and protocols 50 and 51 to disallow it), I can build an
- IPsec tunnel from my desktop to a machine in some remote office. Those
- packets will have one ESP header throughout their life, for my
- end-to-end tunnel. For part of the route, however, they will also have
- another ESP layer for the corporate VPN's encapsulation. The whole
- header scheme for a packet on the Internet might be:</P>
-<UL>
-<LI>IP header (with gateway address) says next header --&gt; ESP</LI>
-<LI>ESP header<STRONG> [</STRONG> says next --&gt; IP</LI>
-<LI>IP header (with receiving machine address) says next header --&gt; ESP</LI>
-<LI>ESP header<STRONG> [</STRONG> says next --&gt; TCP</LI>
-<LI>TCP header port number --&gt; which process to send data to</LI>
-<LI>data<STRONG> ]]</STRONG></LI>
-</UL>
-<P>The first ESP (outermost) header is for the corporate VPN. The inner
- ESP header is for the secure machine-to-machine link.</P>
-<H3><A name="dhr">DHR on the updown script</A></H3>
-<P>Here are some mailing list comments from<A href="manpage.d/ipsec_pluto.8.html">
- pluto(8)</A> developer Hugh Redelmeier on an earlier draft of this
- document:</P>
-<PRE>There are many important things left out
-
-- firewalling is important but must reflect (implement) policy. Since
- policy isn't the same for all our customers, and we're not experts,
- we should concentrate on FW and MASQ interactions with FreeS/WAN.
-
-- we need a diagram to show packet flow WITHIN ONE MACHINE, assuming
- IKE, IPsec, FW, and MASQ are all done on that machine. The flow is
- obvious if the components are run on different machines (trace the
- cables).
-
- IKE input:
- + packet appears on public IF, as UDP port 500
- + input firewalling rules are applied (may discard)
- + Pluto sees the packet.
-
- IKE output:
- + Pluto generates the packet &amp; writes to public IF, UDP port 500
- + output firewalling rules are applied (may discard)
- + packet sent out public IF
-
- IPsec input, with encapsulated packet, outer destination of this host:
- + packet appears on public IF, protocol 50 or 51. If this
- packet is the result of decapsulation, it will appear
- instead on the paired ipsec IF.
- + input firewalling rules are applied (but packet is opaque)
- + KLIPS decapsulates it, writes result to paired ipsec IF
- + input firewalling rules are applied to resulting packet
- as input on ipsec IF
- + if the destination of the packet is this machine, the
- packet is passed on to the appropriate protocol handler.
- If the original packet was encapsulated more than once
- and the new outer destination is this machine, that
- handler will be KLIPS.
- + otherwise:
- * routing is done for the resulting packet. This may well
- direct it into KLIPS for encoding or encrypting. What
- happens then is described elsewhere.
- * forwarding firewalling rules are applied
- * output firewalling rules are applied
- * the packet is sent where routing specified
-
- IPsec input, with encapsulated packet, outer destination of another host:
- + packet appears on some IF, protocol 50 or 51
- + input firewalling rules are applied (but packet is opaque)
- + routing selects where to send the packet
- + forwarding firewalling rules are applied (but packet is opaque)
- + packet forwarded, still encapsulated
-
- IPsec output, from this host or from a client:
- + if from a client, input firewalling rules are applied as the
- packet arrives on the private IF
- + routing directs the packet to an ipsec IF (this is how the
- system decides KLIPS processing is required)
- + if from a client, forwarding firewalling rules are applied
- + KLIPS eroute mechanism matches the source and destination
- to registered eroutes, yielding a SPI group. This dictates
- processing, and where the resulting packet is to be sent
- (the destinations SG and the nexthop).
- + output firewalling is not applied to the resulting
- encapsulated packet
-
-- Until quite recently, KLIPS would double encapsulate packets that
- didn't strictly need to be. Firewalling should be prepared for
- those packets showing up as ESP and AH protocol input packets on
- an ipsec IF.
-
-- MASQ processing seems to be done as if it were part of the
- forwarding firewall processing (this should be verified).
-
-- If a firewall is being used, it is likely the case that it needs to
- be adjusted whenever IPsec SAs are added or removed. Pluto invokes
- a script to do this (and to adjust routing) at suitable times. The
- default script is only suitable for ipfwadm-managed firewalls. Under
- LINUX 2.2.x kernels, ipchains can be managed by ipfwadm (emulation),
- but ipchains more powerful if manipulated using the ipchains command.
- In this case, a custom updown script must be used.
-
- We think that the flexibility of ipchains precludes us supplying an
- updown script that would be widely appropriate.</PRE>
-<HR>
-<A HREF="toc.html">Contents</A>
-<A HREF="manpages.html">Previous</A>
-<A HREF="trouble.html">Next</A>
-</BODY>
-</HTML>