diff options
Diffstat (limited to 'doc/src/adv_config.html')
-rw-r--r-- | doc/src/adv_config.html | 1412 |
1 files changed, 0 insertions, 1412 deletions
diff --git a/doc/src/adv_config.html b/doc/src/adv_config.html deleted file mode 100644 index ab6901b5e..000000000 --- a/doc/src/adv_config.html +++ /dev/null @@ -1,1412 +0,0 @@ -<html> -<head> - <meta http-equiv="Content-Type" content="text/html"> - <title>Advanced FreeS/WAN configuration</title> - <meta name="keywords" - content="Linux, IPsec, VPN, security, FreeSWAN, configuration"> - <!-- - - Written by Sandy Harris for the Linux FreeS/WAN project - Maintained by Claudia Schmeing for same. - Freely distributable under the GNU General Public License - - More information at www.freeswan.org - Feedback to users@lists.freeswan.org - - CVS information: - RCS ID: $Id: adv_config.html,v 1.1 2004/03/15 20:35:24 as Exp $ - Last changed: $Date: 2004/03/15 20:35:24 $ - Revision number: $Revision: 1.1 $ - - CVS revision numbers do not correspond to FreeS/WAN release numbers. - --> -</head> - -<body> -<h1><a name="adv_config">Other configuration possibilities</a></h1> - -<p>This document describes various options for FreeS/WAN configuration which -are less used or more complex (often both) than the standard cases described -in our <a href="config.html#config">config</a> and -<a href="quickstart.html#quick_guide">quickstart</a> documents.</p> - -<h2><a name="thumb">Some rules of thumb about configuration</a></h2> - -<h3><a name="cheap.tunnel">Tunnels are cheap</a></h3> - -<p>Nearly all of the overhead in IPsec processing is in the encryption and -authentication of packets. Our <a href="performance.html">performance</a> -document discusses these overheads.</p> - -<p>Beside those overheads, the cost of managing additional tunnels is -trivial. Whether your gateway supports one tunnel or ten just does not -matter. A hundred might be a problem; there is a <a -href="performance.html#biggate">section</a> on this in the performance -document.</p> - -<p>So, in nearly all cases, if using multiple tunnels gives you a reasonable -way to describe what you need to do, you should describe it that way in your -configuration files.</p> - -<p>For example, one user recently asked on a mailing list about this network -configuration:</p> -<pre> netA---gwA---gwB---netB - |----netC - - netA and B are secured netC not. - netA and gwA can not access netC</pre> - -<p>The user had constructed only one tunnel, netA to netB, and wanted to know -how to use ip-route to get netC packets into it. This is entirely -unnecessary. One of the replies was:</p> -<pre> The simplest way and indeed the right way to - solve this problem is to set up two connections: - - leftsubnet=NetA - left=gwA - right=gwB - rightsubnet=NetB - and - leftsubnet=NetA - left=gwA - right=gwB - rightsubnet=NetC</pre> - -<p>This would still be correct even if we added nets D, E, F, -... to the above diagram and needed twenty tunnels.</p> - -<p>Of course another possibility would be to just use one tunnel, with a -subnet mask that includes both netB and netC (or B, C, D, ...). See next -section.</p> - -<p>In general, you can construct as many tunnels as you need. Networks like -netC in this example that do not connect directly to the gateway are fine, as -long as the gateway can route to them.</p> - -<p>The number of tunnels can become an issue if it reaches 50 or so. This is -discussed in the <a href="performance.html#biggate">performance</a> document. -Look there for information on supporting hundreds of Road Warriors from one -gateway.</p> - -<p>If you find yourself with too many tunnels for some reason like having -eight subnets at one location and nine at another so you end up with -9*8=72 tunnels, read the next section here.</p> - -<h3><a name="subnet.size">Subnet sizes</a></h3> - -<p>The subnets used in <var>leftsubnet</var> and <var>rightsubnet</var> can -be of any size that fits your needs, and they need not correspond to physical -networks.</p> - -<p>You adjust the size by changing the <a href="glossary.html#subnet">subnet -mask</a>, the number after the slash in the subnet description. For -example</p> -<ul> - <li>in 192.168.100.0/24 the /24 mask says 24 bits are used to designate the - network. This leave 8 bits to label machines. This subnet has 256 - addresses. .0 and .255 are reserved, so it can have 254 machines.</li> - <li>A subnet with a /23 mask would be twice as large, 512 addresses.</li> - <li>A subnet with a /25 mask would be half the size, 128 addresses.</li> - <li>/0 is the whole Internet</li> - <li>/32 is a single machine</li> -</ul> - -<p>As an example of using these in connection descriptions, suppose your -company's head office has four physical networks using the address ranges:</p> -<dl> - <dt>192.168.100.0/24</dt> - <dd>development</dd> - <dt>192.168.101.0/24</dt> - <dd>production</dd> - <dt>192.168.102.0/24</dt> - <dd>marketing</dd> - <dt>192.168.103.0/24</dt> - <dd>administration</dd> -</dl> - -<p>You can use exactly those subnets in your connection descriptions, or use -larger subnets to grant broad access if required:</p> -<dl> - <dt>leftsubnet=192.168.100.0/24</dt> - <dd>remote hosts can access only development</dd> - <dt>leftsubnet=192.168.100.0/23</dt> - <dd>remote hosts can access development or production</dd> - <dt>leftsubnet=192.168.102.0/23</dt> - <dd>remote hosts can access marketing or administration</dd> - <dt>leftsubnet=192.168.100.0/22</dt> - <dd>remote hosts can access any of the four departments</dd> -</dl> - -<p>or use smaller subnets to restrict access:</p> -<dl> - <dt>leftsubnet=192.168.103.0/24</dt> - <dd>remote hosts can access any machine in administration</dd> - <dt>leftsubnet=192.168.103.64/28</dt> - <dd>remote hosts can access only certain machines in administration.</dd> - <dt>leftsubnet=192.168.103.42/32</dt> - <dd>remote hosts can access only one particular machine in - administration</dd> -</dl> - -<p>To be exact, 192.68.103.64/28 means all addresses whose top 28 bits match -192.168.103.64. There are 16 of these because there are 16 possibilities for -the remainingg 4 bits. Their addresses are 192.168.103.64 to -192.168.103.79.</p> - -<p>Each connection description can use a different subnet if required.</p> - -<p>It is possible to use all the examples above on the same FreeS/WAN -gateway, each in a different connection description, perhaps for different -classes of user or for different remote offices.</p> - -<p>It is also possible to have multiple tunnels using different -<var>leftsubnet</var> descriptions with the same <var>right</var>. For -example, when the marketing manager is on the road he or she might have -access to:</p> -<dl> - <dt>leftsubnet=192.168.102.0/24</dt> - <dd>all machines in marketing</dd> - <dt>192.168.101.32/29</dt> - <dd>some machines in production</dd> - <dt>leftsubnet=192.168.103.42/32</dt> - <dd>one particular machine in administration</dd> -</dl> - -<p>This takes three tunnels, but tunnels are cheap. If the laptop is set up -to build all three tunnels automatically, then he or she can access all these -machines concurrently, perhaps from different windows.</p> - -<h3><a name="example.more">Other network layouts</a></h3> - -<p>Here is the usual network picture for a site-to-site VPN::</p> -<pre> Sunset==========West------------------East=========Sunrise - local net untrusted net local net</pre> - -<p>and for the Road Warrior::</p> -<pre> telecommuter's PC or - traveller's laptop - Sunset==========West------------------East - corporate LAN untrusted net</pre> - -<p>Other configurations are also possible.</p> - -<h4><a name="internet.subnet">The Internet as a big subnet</a></h4> - -<p>A telecommuter might have:</p> -<pre> Sunset==========West------------------East ================= firewall --- the Internet - home network untrusted net corporate network</pre> - -<p>This can be described as a special case of the general subnet-to-subnet -connection. The subnet on the right is 0.0.0.0/0, the whole Internet.</p> - -<p>West (the home gateway) can have its firewall rules set up so that only -IPsec packets to East are allowed out. It will then behave as if its only -connection to the world was a wire to East.</p> - -<p>When machines on the home network need to reach the Internet, they do so -via the tunnel, East and the corporate firewall. From the viewpoint of the -Internet (perhaps of some EvilDoer trying to break in!), those home office -machines are behind the firewall and protected by it.</p> - -<h4><a name="wireless.config">Wireless</a></h4> - -<p>Another possible configuration comes up when you do not trust the local -network, either because you have very high security standards or because your -are using easily-intercepted wireless signals.</p> - -<p>Some wireless networks have built-in encryption called <a -href="glossary.html#WEP">WEP</a>, but its security is dubious. It is a fairly -common practice to use IPsec instead.</p> - -<p>In this case, part of your network may look like this:</p> -<pre> West-----------------------------East == the rest of your network - workstation untrusted wireless net</pre> - -<p>Of course, there would likely be several wireless workstations, each with -its own IPsec tunnel to the East gateway.</p> - -<p>The connection descriptions look much like Road Warrior descriptions:</p> -<ul> - <li>each workstation should have its own unique - <ul> - <li>identifier for IPsec</li> - <li>RSA key</li> - <li>connection description.</li> - </ul> - </li> - <li>on the gateway, use <var>left=%any</var>, or the workstation IP - address</li> - <li>on workstations, <var>left=%defaultroute</var>, or the workstation IP - address</li> - <li><var>leftsubnet=</var> is not used.</li> -</ul> - -<p>The <var>rightsubnet=</var> parameter might be set in any of several -ways:</p> -<dl> - <dt>rightsubnet=0.0.0.0/0</dt> - <dd>allowing workstations to access the entire Internet (see <a - href="#internet.subnet">above</a>)</dd> - <dt>rightsubnet=a.b.c.0/24</dt> - <dd>allowing access to your entire local network</dd> - <dt>rightsubnet=a.b.c.d/32</dt> - <dd>restricting the workstation to connecting to a particular server</dd> -</dl> - -<p>Of course you can mix and match these as required. For example, a -university might allow faculty full Internet access while letting student -laptops connect only to a group of lab machines.</p> - -<h2><a name="choose">Choosing connection types</a></h2> - -<p>One choice you need to make before configuring additional connections is -what type or types of connections you will use. There are several options, -and you can use more than one concurrently.</p> - -<h3><a name="man-auto">Manual vs. automatic keying</a></h3> - -<p>IPsec allows two types of connections, with manual or automatic keying. -FreeS/WAN starts them with commands such as:</p> -<pre> ipsec manual --up <var>name</var> - ipsec auto --up <var>name</var></pre> - -<p>The difference is in how they are keyed.</p> -<dl> - <dt><a href="glossary.html#manual">Manually keyed</a> connections</dt> - <dd>use keys stored in <a - href="manpage.d/ipsec.conf.5.html">ipsec.conf</a>.</dd> - <dt><a href="glossary.html#auto">Automatically keyed</a> connections</dt> - <dd>use keys automatically generated by the Pluto key negotiation daemon. - The key negotiation protocol, <a href="glossary.html#IKE">IKE</a>, must - authenticate the other system. (It is vulnerable to a <a - href="glossary.html#middle">man-in-the-middle attack</a> if used - without authentication.) We currently support two authentication - methods: - <ul> - <li>using shared secrets stored in <a - href="manpage.d/ipsec.secrets.5.html">ipsec.secrets</a>.</li> - <li>RSA <a href="glossary.html#public">public key</a> authentication, - with our machine's private key in <a - href="manpage.d/ipsec.secrets.5.html">ipsec.secrets</a>. Public - keys for other machines may either be placed in <a - href="manpage.d/ipsec.conf.5.html">ipsec.conf</a> or provided via - DNS.</li> - </ul> - <p>A third method, using RSA keys embedded in <a - href="glossary.html#X509">X.509</a> certtificates, is provided by - user <a href="web.html#patch">patches</a>.</p> - </dd> -</dl> - -<p><a href="glossary.html#manual">Manually keyed</a> connections provide -weaker security than <a href="glossary.html#auto">automatically keyed</a> -connections. An opponent who reads ipsec.secrets(5) gets your encryption key -and can read all data encrypted by it. If he or she has an archive of old -messages, all of them back to your last key change are also readable.</p> - -<p>With automatically-(re)-keyed connections, an opponent who reads -ipsec.secrets(5) gets the key used to authenticate your system in IKE -- the -shared secret or your private key, depending what authentication mechanism is -in use. However, he or she does not automatically gain access to any -encryption keys or any data.</p> - -<p>An attacker who has your authentication key can mount a <a -href="glossary.html#middle">man-in-the-middle attack</a> and, if that -succeeds, he or she will get encryption keys and data. This is a serious -danger, but it is better than having the attacker read everyting as soon as -he or she breaks into ipsec.secrets(5).. Moreover, the keys change often so -an opponent who gets one key does not get a large amount of data. To read all -your data, he or she would have to do a man-in-the-middle attack at every key -change.</p> - -<p>We discuss using <a href="#prodman">manual keying in production</a> below, -but this is <strong>not recommended</strong> except in special circumstances, -such as needing to communicate with some implementation that offers no -auto-keyed mode compatible with FreeS/WAN.</p> - -<p>Manual keying may also be useful for testing. There is some discussion of -this in our <a href="faq.html#man4debug">FAQ</a>.</p> - -<h3><a name="auto-auth">Authentication methods for auto-keying</a></h3> - -<p>The IKE protocol which Pluto uses to negotiate connections between -gateways must use some form of authentication of peers. A gateway must know -who it is talking to before it can create a secure connection. We support two -basic methods for this authentication:</p> -<ul> - <li>shared secrets, stored in <a - href="manpage.d/ipsec.secrets.5.html">ipsec.secrets(5)</a></li> - <li>RSA authentication</li> -</ul> - -<p>There are, howver, several variations on the RSA theme, using different -methods of managing the RSA keys:</p> -<ul> - <li>our RSA private key in <a - href="manpage.d/ipsec.secrets.5.html">ipsec.secrets(5)</a> with other - gateways' public keys - <dl> - <dt>either</dt> - <dd>stored in <a - href="manpage.d/ipsec.conf.5.html">ipsec.conf(5)</a></dd> - <dt>or</dt> - <dd>looked up via <a href="glossary.html#DNS">DNS</a></dd> - </dl> - </li> - <li>authentication with <a href="glossary.html#x509">x.509</a> - certificates.; See our <a href="web.html#patch">links section</a> for - information on user-contributed patches for this.:</li> -</ul> - -<p>Public keys in <a href="manpage.d/ipsec.conf.5.html">ipsec.conf(5</a>) -give a reasonably straightforward method of specifying keys for explicitly -configured connections.</p> - -<p>Putting public keys in DNS allows us to support <a -href="glossary.html#carpediem">opportunistic encryption</a>. Any two -FreeS/WAN gateways can provide secure communication, without either of them -having any preset information about the other.</p> - -<p>X.509 certificates may be required to interface to various <a -href="glossary.html#PKI">PKI</a>s.</p> - -<h3><a name="adv-pk">Advantages of public key methods</a></h3> - -<p>Authentication with a <a href="glossary.html#public">public key</a> method -such as <a href="glossary.html#RSA">RSA</a> has some important advantages -over using shared secrets.</p> -<ul> - <li>no problem of secure transmission of secrets - <ul> - <li>A shared secret must be shared, so you have the problem of - transmitting it securely to the other party. If you get this wrong, - you have no security.</li> - <li>With a public key technique, you transmit only your public key. The - system is designed to ensure that it does not matter if an enemy - obtains public keys. The private key never leaves your machine.</li> - </ul> - </li> - <li>easier management - <ul> - <li>Suppose you have 20 branch offices all connecting to one gateway at - head office, and all using shared secrets. Then the head office admin - has 20 secrets to manage. Each of them must be kept secret not only - from outsiders, but also from 19 of the branch office admins. The - branch office admins have only one secret each to manage. - <p>If the branch offices need to talk to each other, this becomes - problematic. You need another 20*19/2 = 190 secrets for - branch-to-branch communication, each known to exactly two branches. - Now all the branch admins have the headache of handling 20 keys, each - shared with exactly one other branch or with head office.</p> - <p>For larger numbers of branches, the number of connections and - secrets increases quadratically and managing them becomes a - nightmare. A 1000-gateway fully connected network needs 499,500 - secrets, each known to exactly two players. There are ways to reduce - this problem, for example by introducing a central key server, but - these involve additional communication overheads, more administrative - work, and new threats that must be carefully guarded against.</p> - </li> - <li>With public key techniques, the <em>only</em> thing you have to - keep secret is your private key, and <em>you keep that secret from - everyone</em>. - <p>As network size increaes, the number of public keys used increases - linearly with the number of nodes. This still requires careful - administration in large applications, but is nothing like the - disaster of a quadratic increase. On a 1000-gateway network, you have - 1000 private keys, each of which must be kept secure on one machine, - and 1000 public keys which must be distributed. This is not a trivial - problem, but it is manageable.</p> - </li> - </ul> - </li> - <li>does not require fixed IP addresses - <ul> - <li>When shared secrets are used in IPsec, the responder must be able - to tell which secret to use by looking at the IP address on the - incoming packets. When the other parties do not have a fixed IP - address to be identified by (for example, on nearly all dialup ISP - connections and many cable or ADSL links), this does not work well -- - all must share the same secret!</li> - <li>When RSA authentication is in use, the initiator can identify - itself by name before the key must be determined. The responder then - checks that the message is signed with the public key corresponding - to that name.</li> - </ul> - </li> -</ul> - -<p>There is also a disadvantage:</p> -<ul> - <li>your private key is a single point of attack, extremely valuable to an - enemy - <ul> - <li>with shared secrets, an attacker who steals your ipsec.secrets file - can impersonate you or try <a - href="glossary.html#middle">man-in-the-middle</a> attacks, but can - only attack connections described in that file</li> - <li>an attacker who steals your private key gains the chance to attack - not only existing connections <em>but also any future - connections</em> created using that key</li> - </ul> - </li> -</ul> - -<p>This is partly counterbalanced by the fact that the key is never -transmitted and remains under your control at all times. It is likely -necessary, however, to take account of this in setting security policy. For -example, you should change gateway keys when an administrator leaves the -company, and should change them periodically in any case.</p> - -<p>Overall, public key methods are <strong>more secure, more easily managed -and more flexible</strong>. We recommend that they be used for all -connections, unless there is a compelling reason to do otherwise.</p> - -<h2><a name="prodsecrets">Using shared secrets in production</a></h2> - -<p>Generally, public key methods are preferred for reasons given above, but -shared secrets can be used with no loss of security, just more work and -perhaps more need to take precautions.</p> - -<p>What I call "shared secrets" are sometimes also called "pre-shared keys". -They are used only for for authentication, never for encryption. Calling them -"pre-shared keys" has confused some users into thinking they were encryption -keys, so I prefer to avoid the term..</p> - -<p>If you are interoperating with another IPsec implementation, you may find -its documentation calling them "passphrases".</p> - -<h3><a name="secrets">Putting secrets in ipsec.secrets(5)</a></h3> - -<p>If shared secrets are to be used to <a -href="glossary.html#authentication">authenticate</a> communication for the <a -href="glossary.html#DH">Diffie-Hellman</a> key exchange in the <a -href="glossary.html#IKE">IKE</a> protocol, then those secrets must be stored -in <var>/etc/ipsec.secrets</var>. For details, see the <a -href="manpage.d/ipsec.secrets.5.html">ipsec.secrets(5)</a> man page.</p> - -<p>A few considerations are vital:</p> -<ul> - <li>make the secrets long and unguessable. Since they need not be - remembered by humans, very long ugly strings may be used. We suggest - using our <a href="manpage.d/ipsec_ranbits.8.html">ipsec_ranbits(8)</a> - utility to generate long (128 bits or more) random strings.</li> - <li>transmit secrets securely. You have to share them with other systems, - but you lose if they are intercepted and used against you. Use <a - href="glossary.html#PGP">PGP</a>, <a href="glossary.html#SSH">SSH</a>, - hand delivery of a floppy disk which is then destroyed, or some other - trustworthy method to deliver them.</li> - <li>store secrets securely, in root-owned files with permissions - rw------.</li> - <li>limit sharing of secrets. Alice, Bob, Carol and Dave may all talk to - each other, but only Alice and Bob should know the secret for an - Alice-Bob link.</li> - <li><strong>do not share private keys</strong>. The private key for RSA - authentication of your system is stored in <a - href="manpage.d/ipsec.secrets.5.html">ipsec.secrets(5)</a>, but it is a - different class of secret from the pre-shared keys used for the "shared - secret" authentication. No-one but you should have the RSA private - key.</li> -</ul> - -<p>Each line has the IP addresses of the two gateways plus the secret. It -should look something like this:</p> -<pre> 10.0.0.1 11.0.0.1 : PSK "jxTR1lnmSjuj33n4W51uW3kTR55luUmSmnlRUuWnkjRj3UuTV4T3USSu23Uk55nWu5TkTUnjT"</pre> - -<p><var>PSK</var> indicates the use of a -<strong>p</strong>re-<strong>s</strong>hared <strong>k</strong>ey. The quotes -and the whitespace shown are required.</p> - -<p>You can use any character string as your secret. For security, it should -be both long and extremely hard to guess. We provide a utility to generate -such strings, <a -href="manpage.d/ipsec_ranbits.8.html">ipsec_ranbits(8)</a>.</p> - -<p>You want the same secret on the two gateways used, so you create a line -with that secret and the two gateway IP addresses. The installation process -supplies an example secret, useful <em>only</em> for testing. You must change -it for production use.</p> - -<h3><a name="securing.secrets">File security</a></h3> - -<p>You must deliver this file, or the relevant part of it, to the other -gateway machine by some <strong>secure</strong> means. <em>Don't just FTP or -mail the file!</em> It is vital that the secrets in it remain secret. An -attacker who knew those could easily have <em>all the data on your "secure" -connection</em>.</p> - -<p>This file must be owned by root and should have permissions -<var>rw-------</var>.</p> - -<h3><a name="notroadshared">Shared secrets for road warriors</a></h3> - -<p>You can use a shared secret to support a single road warrior connecting to -your gateway, and this is a reasonable thing to do in some circumstances. -Public key methods have advantages, discussed <a href="#choose">above</a>, -but they are not critical in this case.</p> - -<p>To do this, the line in ipsec.secrets(5) is something like:</p> -<pre> 10.0.0.1 0.0.0.0 : PSK "jxTR1lnmSjuj33n4W51uW3kTR55luUmSmnlRUuWnkjRj3UuTV4T3USSu23Uk55nWu5TkTUnjT"</pre> -where the <var>0.0.0.0</var> means that any IP address is acceptable. - -<p><strong>For more than one road warrior, shared secrets are <em>not</em> -recommended.</strong> If shared secrets are used, then when the responder -needs to look up the secret, all it knows about the sender is an IP address. -This is fine if the sender is at a fixed IP address specified in the config -file. It is also fine if only one road warrior uses the wildcard -<var>0.0.0.0</var> address. However, if you have more than one road warrior -using shared secret authentication, then they must all use that wildcard and -therefore <strong>all road warriors using PSK autentication must use the same -secret</strong>. Obviously, this is insecure.</p> - -<p><strong>For multiple road warriors, use public key -authentication.</strong> Each roadwarrior can then have its own identity (our -<var>leftid=</var> or <var>rightid=</var> parameters), its own public/private -key pair, and its own secure connection.</p> - -<h2><a name="prodman">Using manual keying in production</a></h2> - -<p>Generally, <a href="glossary.html#auto">automatic keying</a> is preferred -over <a href="glossary.html#manual">manual keying</a> for production use -because it is both easier to manage and more secure. Automatic keying frees -the admin from much of the burden of managing keys securely, and can provide -<a href="glossary.html#PFS">perfect forward secrecy</a>. This is discussed in -more detail <a href="#man-auto">above</a>.</p> - -<p>However, it is possible to use manual keying in production if that is what -you want to do. This might be necessary, for example, in order to -interoperate with some device that either does not provide automatic keying -or provides it in some version we cannot talk to.</p> - -<p>Note that with manual keying <strong>all security rests with the -keys</strong>. If an adversary acquires your keys, you've had it. He or she -can read everything ever sent with those keys, including old messages he or -she may have archived.</p> - -<p>You need to <strong>be really paranoid about keys</strong> if you're going -to rely on manual keying for anything important.</p> -<ul> - <li>keep keys in files with 600 permissions, owned by root</li> - <li>be extremely careful about security of your gateway systems. Anyone who - breaks into a gateway and gains root privileges can get all your keys and - read everything ever encrypted with those keys, both old messages he has - archived and any new ones you may send.</li> - <li>change keys regularly. This can be a considerable bother, (and provides - an excellent reason to consider automatic keying instead), but it is - <em>absolutely essential</em> for security. Consider a manually keyed - system in which you leave the same key in place for months: - <ul> - <li>an attacker can have a very large sample of text sent with that key - to work with. This makes various cryptographic attacks much more - likely to succeed.</li> - <li>The chances of the key being compromised in some non-cryptographic - manner -- a spy finds it on a discarded notepad, someone breaks into - your server or your building and steals it, a staff member is bribed, - tricked, seduced or coerced into revealing it, etc. -- also increase - over time.</li> - <li>a successful attacker can read everything ever sent with that key. - This makes any successful attack extremely damaging.</li> - </ul> - It is clear that you must change keys often to have any useful security. - The only question is how often.</li> - <li>use <a href="glossary.html#PGP">PGP</a> or <a - href="glossary.html#SSH">SSH</a> for all key transfers</li> - <li>don't edit files with keys in them when someone can look over your - shoulder</li> - <li>worry about network security; could someone get keys by snooping - packets on the LAN between your X desktop and the gateway?</li> - <li>lock up your backup tapes for the gateway system</li> - <li>... and so on</li> -</ul> - -<p>Linux FreeS/WAN provides some facilities to help with this. In particular, -it is good policy to <strong>keep keys in separate files</strong> so you can -edit configuration information in /etc/ipsec.conf without exposing keys to -"shoulder surfers" or network snoops. We support this with the -<var>also=</var> and <var>include</var> syntax in <a -href="manpage.d/ipsec.conf.5.html">ipsec.conf(5)</a>.</p> - -<p>See the last example in our <a href="examples">examples</a> file. In the -/etc/ipsec.conf <var>conn samplesep</var> section, it has the line:</p> -<pre> also=samplesep-keys</pre> - -<p>which tells the "ipsec manual" script to insert the configuration -description labelled "samplesep-keys" if it can find it. The /etc/ipsec.conf -file must also have a line such as:</p> -<pre>include ipsec.*.conf</pre> - -<p>which tells it to read other files. One of those other files then might -contain the additional data:</p> -<pre>conn samplesep-keys - spi=0x200 - esp=3des-md5-96 - espenckey=0x01234567_89abcdef_02468ace_13579bdf_12345678_9abcdef0 - espauthkey=0x12345678_9abcdef0_2468ace0_13579bdf</pre> - -<p>The first line matches the label in the "also=" line, so the indented -lines are inserted. The net effect is exactly as if the inserted lines had -occurred in the original file in place of the "also=" line.</p> - -<p>Variables set here are:</p> -<dl> - <dt>spi</dt> - <dd>A number needed by the manual keying code. Any 3-digit hex number - will do, but if you have more than one manual connection then - <strong>spi must be different</strong> for each connection.</dd> - <dt>esp</dt> - <dd>Options for <a href="glossary.html#ESP">ESP</a> (Encapsulated - Security Payload), the usual IPsec encryption mode. Settings here are - for <a href="glossary.html#encryption">encryption</a> using <a - href="glossary.html#3DES">triple DES</a> and <a - href="glossary.html#authentication">authentication</a> using <a - href="glossary.html#MD5">MD5</a>. Note that encryption without - authentication should not be used; it is insecure.</dd> - <dt>espenkey</dt> - <dd>Key for ESP encryption. Here, a 192-bit hex number for triple - DES.</dd> - <dt>espauthkey</dt> - <dd>Key for ESP authentication. Here, a 128-bit hex number for MD5.</dd> -</dl> - -<p><strong>Note</strong> that the <strong>example keys we supply</strong> are -intended <strong>only for testing</strong>. For real use, you should go to -automatic keying. If that is not possible, create your own keys for manual -mode and keep them secret</p> - -<p>Of course, any files containing keys <strong>must</strong> have 600 -permissions and be owned by root.</p> - -<p>If you connect in this way to multiple sites, we recommend that you keep -keys for each site in a separate file and adopt some naming convention that -lets you pick them all up with a single "include" line. This minimizes the -risk of losing several keys to one error or attack and of accidentally giving -another site admin keys which he or she has no business knowing.</p> - -<p>Also note that if you have multiple manually keyed connections on a single -machine, then the <var>spi</var> parameter must be different for each one. -Any 3-digit hex number is OK, provided they are different for each -connection. We reserve the range 0x100 to 0xfff for manual connections. Pluto -assigns SPIs from 0x1000 up for automatically keyed connections.</p> - -<p>If <a href="manpage.d/ipsec.conf.5.html">ipsec.conf(5)</a> contains keys -for manual mode connections, then it too must have permissions -<var>rw-------</var>. We recommend instead that, if you must manual keying in -production, you keep the keys in separate files.</p> - -<p>Note also that <a href="manpage.d/ipsec.conf.5.html">ipsec.conf</a> is -installed with permissions <var>rw-r--r--</var>. If you plan to use manually -keyed connections for anything more than initial testing, you <b>must</b>:</p> -<ul> - <li>either change permissions to <var>rw-------</var></li> - <li>or store keys separately in secure files and access them via include - statements in <a href="manpage.d/ipsec.conf.5.html">ipsec.conf</a>.</li> -</ul> - -<p>We recommend the latter method for all but the simplest configurations.</p> - -<h3><a name="ranbits">Creating keys with ranbits</a></h3> - -<p>You can create new <a href="glossary.html#random">random</a> keys with the -<a href="manpage.d/ipsec_ranbits.8.html">ranbits(8)</a> utility. For example, -the commands:</p> -<pre> umask 177 - ipsec ranbits 192 > temp - ipsec ranbits 128 >> temp</pre> - -<p>create keys in the sizes needed for our default algorithms:</p> -<ul> - <li>192-bit key for <a href="glossary.html#3DES">3DES</a> encryption <br> - (only 168 bits are used; parity bits are ignored)</li> - <li>128-bit key for keyed <a href="glossary.html#MD5">MD5</a> - authentication</li> -</ul> - -<p>If you want to use <a href="glossary.html#SHA">SHA</a> instead of <a -href="glossary.html#MD5">MD5</a>, that requires a 160-bit key</p> - -<p>Note that any <strong>temporary files</strong> used must be kept -<strong>secure</strong> since they contain keys. That is the reason for the -umask command above. The temporary file should be deleted as soon as you are -done with it. You may also want to change the umask back to its default value -after you are finished working on keys.</p> - -<p>The ranbits utility may pause for a few seconds if not enough entropy is -available immediately. See ipsec_ranbits(8) and random(4) for details. You -may wish to provide some activity to feed entropy into the system. For -example, you might move the mouse around, type random characters, or do -<var>du /usr > /dev/null</var> in the background.</p> - -<h2><a name="boot">Setting up connections at boot time</a></h2> - -<p>You can tell the system to set up connections automatically at boot time -by putting suitable stuff in /etc/ipsec.conf on both systems. The relevant -section of the file is labelled by a line reading <var>config setup</var>.</p> - -<p>Details can be found in the <a -href="manpage.d/ipsec.conf.5.html">ipsec.conf(5)</a> man page. We also -provide a file of <a href="examples">example configurations</a>.</p> - -<p>The most likely options are something like:</p> -<dl> - <dt>interfaces="ipsec0=eth0 ipsec1=ppp0"</dt> - <dd>Tells KLIPS which interfaces to use. Up to four interfaces numbered - ipsec[0-3] are supported. Each interface can support an arbitrary - number of tunnels. - <p>Note that for PPP, you give the ppp[0-9] device name here, not the - underlying device such as modem (or eth1 if you are using PPPoE).</p> - </dd> - <dt>interfaces=%defaultroute</dt> - <dd>Alternative setting, useful in simple cases. KLIPS will pick up both - its interface and the next hop information from the settings of the - Linux default route.</dd> - <dt>forwardcontrol=no</dt> - <dd>Normally "no". Set to "yes" if the IP forwarding option is disabled - in your network configuration. (This can be set as a kernel - configuration option or later. e.g. on Redhat, it's in - /etc/sysconfig/network and on SuSE you can adjust it with Yast.) Linux - FreeS/WAN will then enable forwarding when starting up and turn it off - when going down. This is used to ensure that no packets will be - forwarded before IPsec comes up and takes control.</dd> - <dt>syslog=daemon.error</dt> - <dd>Used in messages to the system logging daemon (syslogd) to specify - what type of software is sending the messages. If the settings are - "daemon.error" as in our example, then syslogd treats the messages as - error messages from a daemon. - <p>Note that <a href="glossary.html#Pluto">Pluto</a> does not currently - pay attention to this variable. The variable controls setup messages - only.</p> - </dd> - <dt>klipsdebug=</dt> - <dd>Debug settings for <a href="glossary.html#KLIPS">KLIPS</a>.</dd> - <dt>plutodebug=</dt> - <dd>Debug settings for <a href="glossary.html#Pluto">Pluto</a>.</dd> - <dt>... for both the above DEBUG settings</dt> - <dd>Normally, leave empty as shown above for no debugging output.<br> - Use "all" for maximum information.<br> - See ipsec_klipsdebug(8) and ipsec_pluto(8) man page for other options. - Beware that if you set /etc/ipsec.conf to enable debug output, your - system's log files may get large quickly.</dd> - <dt>dumpdir=/safe/directory</dt> - <dd>Normally, programs started by ipsec setup don't crash. If they do, by - default, no core dump will be produced because such dumps would contain - secrets. If you find you need to debug such crashes, you can set - dumpdir to the name of a directory in which to collect the core - file.</dd> - <dt>manualstart=</dt> - <dd>List of manually keyed connections to be automatically started at - boot time. Useful for testing, but not for long term use. Connections - which are automatically started should also be automatically - re-keyed.</dd> - <dt>pluto=yes</dt> - <dd>Whether to start <a href="glossary.html#Pluto">Pluto</a> when ipsec - startup is done.<br> - This parameter is optional and defaults to "yes" if not present. - <p>"yes" is strongly recommended for production use so that the keying - daemon (Pluto) will automatically re-key the connections regularly. The - ipsec-auto parameters ikelifetime, ipseclifetime and reykeywindow give - you control over frequency of rekeying.</p> - </dd> - <dt>plutoload="reno-van reno-adam reno-nyc"</dt> - <dd>List of tunnels (by name, e.g. fred-susan or reno-van in our - examples) to be loaded into Pluto's internal database at startup. In - this example, Pluto loads three tunnels into its database when it is - started. - <p>If plutoload is "%search", Pluto will load any connections whose - description includes "auto=add" or "auto=start".</p> - </dd> - <dt>plutostart="reno-van reno-adam reno-nyc"</dt> - <dd>List of tunnels to attempt to negotiate when Pluto is started. - <p>If plutostart is "%search", Pluto will start any connections whose - description includes "auto=start".</p> - <p>Note that, for a connection intended to be permanent, <strong>both - gateways should be set try to start</strong> the tunnel. This allows - quick recovery if either gateway is rebooted or has its IPsec - restarted. If only one gateway is set to start the tunnel and the other - gateway restarts, the tunnel may not be rebuilt.</p> - </dd> - <dt>plutowait=no</dt> - <dd>Controls whether Pluto waits for one tunnel to be established before - starting to negotiate the next. You might set this to "yes" - <ul> - <li>if your gateway is a very limited machine and you need to - conserve resources.</li> - <li>for debugging; the logs are clearer if only one connection is - brought up at a time</li> - </ul> - For a busy and resource-laden production gateway, you likely want "no" - so that connections are brought up in parallel and the whole process - takes less time.</dd> -</dl> - -<p>The example assumes you are at the Reno office and will use IPsec to -Vancouver, New York City and Amsterdam.</p> - -<h2><a name="multitunnel">Multiple tunnels between the same two -gateways</a></h2> - -<p>Consider a pair of subnets, each with a security gateway, connected via -the Internet:</p> -<pre> 192.168.100.0/24 left subnet - | - 192.168.100.1 - North Gateway - 101.101.101.101 left - | - 101.101.101.1 left next hop - [Internet] - 202.202.202.1 right next hop - | - 202.202.202.202 right - South gateway - 192.168.200.1 - | - 192.168.200.0/24 right subnet</pre> - -<p>A tunnel specification such as:</p> -<pre>conn northnet-southnet - left=101.101.101.101 - leftnexthop=101.101.101.1 - leftsubnet=192.168.100.0/24 - leftfirewall=yes - right=202.202.202.202 - rightnexthop=202.202.202.1 - rightsubnet=192.168.200.0/24 - rightfirewall=yes</pre> -will allow machines on the two subnets to talk to each other. You might test -this by pinging from polarbear (192.168.100.7) to penguin (192.168.200.5). - -<p>However, <strong>this does not cover other traffic you might want to -secure</strong>. To handle all the possibilities, you might also want these -connection descriptions:</p> -<pre>conn northgate-southnet - left=101.101.101.101 - leftnexthop=101.101.101.1 - right=202.202.202.202 - rightnexthop=202.202.202.1 - rightsubnet=192.168.200.0/24 - rightfirewall=yes - -conn northnet-southgate - left=101.101.101.101 - leftnexthop=101.101.101.1 - leftsubnet=192.168.100.0/24 - leftfirewall=yes - right=202.202.202.202 - rightnexthop=202.202.202.1</pre> - -<p>Without these, neither gateway can do IPsec to the remote subnet. There is -no IPsec tunnel or eroute set up for the traffic.</p> - -<p>In our example, with the non-routable 192.168.* addresses used, packets -would simply be discarded. In a different configuration, with routable -addresses for the remote subnet, <strong>they would be sent -unencrypted</strong> since there would be no IPsec eroute and there would be -a normal IP route.</p> - -<p>You might also want:</p> -<pre>conn northgate-southgate - left=101.101.101.101 - leftnexthop=101.101.101.1 - right=202.202.202.202 - rightnexthop=202.202.202.1</pre> - -<p>This is required if you want the two gateways to speak IPsec to each -other.</p> - -<p>This requires a lot of duplication of details. Judicious use of -<var>also=</var> and <var>include</var> can reduce this problem.</p> - -<p>Note that, while FreeS/WAN supports all four tunnel types, not all -implementations do. In particular, some versions of Windows 2000 and the -freely downloadable version of PGP provide only "client" functionality. You -cannot use them as gateways with a subnet behind them. To get that -functionality, you must upgrade to Windows 2000 server or the commercially -available PGP products.</p> - -<h3><a name="advroute">One tunnel plus advanced routing</a></h3> -It is also possible to use the new routing features in 2.2 and later kernels -to avoid most needs for multple tunnels. Here is one mailing list message on -the topic: -<pre>Subject: Re: linux-ipsec: IPSec packets not entering tunnel? - Date: Mon, 20 Nov 2000 - From: Justin Guyett <jfg@sonicity.com> - -On Mon, 20 Nov 2000, Claudia Schmeing wrote: - -> Right Left -> "home" "office" -> 10.92.10.0/24 ---- 24.93.85.110 ========= 216.175.164.91 ---- 10.91.10.24/24 -> -> I've created all four tunnels, and can ping to test each of them, -> *except* homegate-officenet. - -I keep wondering why people create all four tunnels. Why not route -traffic generated from home to 10.91.10.24/24 out ipsec0 with iproute2? -And 99% of the time you don't need to access "office" directly, which -means you can eliminate all but the subnet<->subnet connection.</pre> -and FreeS/WAN technical lead Henry Spencer's comment: -<pre>> I keep wondering why people create all four tunnels. Why not route -> traffic generated from home to 10.91.10.24/24 out ipsec0 with iproute2? - -This is feasible, given some iproute2 attention to source addresses, but -it isn't something we've documented yet... (partly because we're still -making some attempt to support 2.0.xx kernels, which can't do this, but -mostly because we haven't caught up with it yet). - -> And 99% of the time you don't need to access "office" directly, which -> means you can eliminate all but the subnet<->subnet connection. - -Correct in principle, but people will keep trying to ping to or from the -gateways during testing, and sometimes they want to run services on the -gateway machines too.</pre> - - -<!-- Is this in the right spot in this document? --> -<H2><A name="opp.gate">An Opportunistic Gateway</A></H2> - -<H3>Start from full opportunism</H3> - -<P>Full opportunism -allows you to initiate and receive opportunistic connections on your -machine. The remaining instructions in this section assume -you have first set up full opportunism on your gateway using -<A HREF="quickstart.html#opp.incoming">these instructions</A>. -Both sets of instructions require mailing DNS records to your ISP. Collect -DNS records for both the gateway (above) and the -subnet nodes (below) before contacting your ISP.</P> - - -<H3>Reverse DNS TXT records for each protected machine</H3> - -<P>You need these so that your Opportunistic peers can: -<UL> -<LI>discover the gateway's address, knowing only the IP address - that packets are bound for</LI> -<LI>verify that the gateway is authorised to encrypt for that endpoint</LI> -</UL> - -<P>On the gateway, generate a TXT record with: -<PRE> ipsec showhostkey --txt 192.0.2.11</PRE> -<P>Use your gateway address in place of 192.0.2.11.</P> - -<P>You should see (keys are trimmed for clarity throughout our example):</P> -<PRE> ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/"</PRE> - -<P><B>This MUST BE the same key as in your gateway's TXT record, or nothing -will work.</B></P> - -<P>In a text file, make one copy of this TXT record for each subnet - node:</P> -<PRE> ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/" - - ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/" - - ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/"</PRE> - -<P>Above each entry, insert a line like this:</P> -<PRE> 98.2.0.192.in-addr.arpa. IN PTR arthur.example.com.</PRE> - -<P>It must include:</P> -<UL> -<LI>The subnet node's address in reverse map format. For example, 192.0.2.120 -becomes <VAR>120.2.0.192.in-addr.arpa.</VAR>. Note the final period.</LI> -<LI><VAR>IN PTR</VAR></LI> -<LI>The node's name, ie. <VAR>arthur.example.com.</VAR>. Note -the final period.</LI> -</UL> - -<P>The result will be a file of TXT records, like this:</P> -<PRE> 98.2.0.192.in-addr.arpa. IN PTR arthur.example.com. - ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/" - - 99.2.0.192.in-addr.arpa. IN PTR ford.example.com. - ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/" - - 100.2.0.192.in-addr.arpa. IN PTR trillian.example.com. - ; RSA 2048 bits gateway.example.com Sat Apr 15 13:53:22 2000 - IN TXT "X-IPsec-Server(10)=192.0.2.11" " AQOF8tZ2...+buFuFn/"</PRE> - - -<H3>Publish your records</H3> - -<P>Ask your ISP to publish all the reverse DNS records you have collected. -There may be a delay of up to 48 hours as the records propagate.</P> - - -<H3>...and test them</H3> - -<P>Check a couple of records with commands like this one:</P> - -<PRE> ipsec verify --host ford.example.com - ipsec verify --host trillian.example.com</PRE> - -<P>The <var>verify</var> command checks for TXT records for both the -subnet host and its gateway. You should see output like:</P> -<PRE> ... - Looking for TXT in reverse map: 99.2.0.192.in-addr.arpa [OK] - ... - Looking for TXT in reverse map: 11.2.0.192.in-addr.arpa [OK] - ... - Looking for TXT in reverse map: 100.2.0.192.in-addr.arpa [OK] - ... - Looking for TXT in reverse map: 11.2.0.192.in-addr.arpa [OK] - ...</PRE> -<H3>No Configuration Needed</H3> - -<P>FreeS/WAN 2.x ships with a built-in, automatically -enabled OE connection <VAR>conn packetdefault</VAR> -which applies OE, if possible, to all outbound traffic routed -through the FreeS/WAN box. - -The -<A HREF="manpage.d/ipsec.conf.5.html">ipsec.conf(5) manual</A> -describes this connection in detail. -While the effect is much the same as <VAR>private-or-clear</VAR>, -the implementation is different: notably, it does not use policy -groups.</P> - -<P>You can create more complex OE configurations -for traffic forwarded through a FreeS/WAN box, as explained in our -<A HREF="policygroups.html#policygroups">policy groups document</A>, -or disable OE using -<A HREF="policygroups.html#disable_policygroups">these instructions</A>.</P> - - - -<h2><a name="extruded.config">Extruded Subnets</a></h2> - -<p>What we call <a href="glossary.html#extruded">extruded subnets</a> are a -special case of <a href="glossary.html#VPN.gloss">VPNs</a>.</p> - -<p>If your buddy has some unused IP addresses, in his subnet far off at the -other side of the Internet, he can loan them to you... provided that the -connection between you and him is fast enough to carry all the traffic -between your machines and the rest of the Internet. In effect, he "extrudes" -a part of his address space over the network to you, with your Internet -traffic appearing to originate from behind his Internet gateway.</p> - -<p>As far as the Internet is concerned, your new extruded net is behind your -buddy's gateway. You route all your packets for the Internet at large -out his gateway, and receive return packets the same way. You route your -local packets locally.</p> - -<p>Suppose your friend has a.b.c.0/24 and wants to give you a.b.c.240/28. The -initial situation is:</p> -<pre> subnet gateway Internet - a.b.c.0/24 a.b.c.1 p.q.r.s</pre> -where anything from the Internet destined for any machine in a.b.c.0/24 is -routed via p.q.r.s and that gateway knows what to do from there. - -<p>Of course it is quite normal for various smaller subnets to exist behind -your friend's gateway. For example, your friend's company might have -a.b.c.16/28=development, a.b.c.32/28=marketing and so on. The Internet -neither knows not cares about this; it just delivers packets to the p.q.r.s -and lets the gateway do whatever needs to be done from there.</p> - -<p>What we want to do is take a subnet, perhaps a.b.c.240/28, out of your -friend's physical location <em>while still having your friend's gateway route -to it</em>. As far as the Internet is concerned, you remain behind that -gateway.</p> -<pre> subnet gateway Internet your gate extruded - - a.b.c.0/24 a.b.c.1 p.q.r.s d.e.f.g a.b.c.240/28 - - ========== tunnel ==========</pre> - -<p>The extruded addresses have to be a complete subnet.</p> - -<p>In our example, the friend's security gateway is also his Internet -gateway, but this is not necessary. As long as all traffic from the Internet -to his addresses passes through the Internet gate, the security gate could be -a machine behind that. The IG would need to route all traffic for the -extruded subnet to the SG, and the SG could handle the rest.</p> - -<p>First, configure your subnet using the extruded addresses. Your security -gateway's interface to your subnet needs to have an extruded address -(possibly using a Linux <a href="glossary.html#virtual">virtual -interface</a>, if it also has to have a different address). Your gateway -needs to have a route to the extruded subnet, pointing to that interface. The -other machines at your site need to have addresses in that subnet, and -default routes pointing to your gateway.</p> - -<p>If any of your friend's machines need to talk to the extruded subnet, -<em>they</em> need to have a route for the extruded subnet, pointing at his -gateway.</p> - -<p>Then set up an IPsec subnet-to-subnet tunnel between your gateway and his, -with your subnet specified as the extruded subnet, and his subnet specified -as "0.0.0.0/0".</p> - -<p>The tunnel description should be:</p> -<pre>conn extruded - left=p.q.r.s - leftsubnet=0.0.0.0/0 - right=d.e.f.g - rightsubnet=a.b.c.0/28</pre> - -<p>If either side was doing firewalling for the extruded subnet before the -IPsec connection is set up, you'll need to poke holes in your -<A HREF="firewall.html#firewall">firewall</A> to allow packets through. -</p> - -<p>And it all just works. Your SG routes traffic for 0.0.0.0/0 -- that is, -the whole Internet -- through the tunnel to his SG, which then sends it -onward as if it came from his subnet. When traffic for the extruded subnet -arrives at his SG, it gets sent through the tunnel to your SG, which passes -it to the right machine.</p> - -<p>Remember that when ipsec_manual or ipsec_auto takes a connection down, it -<em>does not undo the route</em> it made for that connection. This lets you -take a connection down and bring up a new one, or a modified version of the -old one, without having to rebuild the route it uses and without any risk of -packets which should use IPsec accidentally going out in the clear. Because -the route always points into KLIPS, the packets will always go there. Because -KLIPS temporarily has no idea what to do with them (no eroute for them), they -will be discarded.</p> - -<p>If you <em>do</em> want to take the route down, this is what the "unroute" -operation in manual and auto is for. Just do an unroute after doing the -down.</p> - -<p>Note that the route for a connection may have replaced an existing -non-IPsec route. Nothing in Linux FreeS/WAN will put that pre-IPsec route -back. If you need it back, you have to create it with the route command.</p> - -<h2><a name="roadvirt">Road Warrior with virtual IP address</a></h2> - -<p>Please note that <A HREF="http://www.freeswan.ca/download.php">Super -FreeS/WAN</A> now features DHCP-over-IPsec, which is an alternate procedure -for Virtual IP address assignment. -<p> - -<p>Here is a mailing list message about another way to configure for road -warrior support:</p> -<pre>Subject: Re: linux-ipsec: understanding the vpn - Date: Thu, 28 Oct 1999 10:43:22 -0400 - From: Irving Reid <irving@nevex.com> - -> local-------linux------internet------mobile -> LAN box user -> ... - -> now when the mobile user connects to the linux box -> it is given a virtual IP address, i have configured it to -> be in the 10.x.x.x range. mobile user and linux box -> have a tunnel between them with these IP addresses. - -> Uptil this all is fine. - -If it is possible to configure your mobile client software *not* to -use a virtual IP address, that will make your life easier. It is easier -to configure FreeS/WAN to use the actual address the mobile user gets -from its ISP. - -Unfortunately, some Windows clients don't let you choose. - -> what i would like to know is that how does the mobile -> user communicate with other computers on the local -> LAN , of course with the vpn ? - -> what IP address should the local LAN -> computers have ? I guess their default gateway -> should be the linux box ? and does the linux box need -> to be a 2 NIC card box or one is fine. - -As someone else stated, yes, the Linux box would usually be the default -IP gateway for the local lan. - -However... - -If you mobile user has software that *must* use a virtual IP address, -the whole picture changes. Nobody has put much effort into getting -FreeS/WAN to play well in this environment, but here's a sketch of one -approach: - -Local Lan 1.0.0.0/24 - | - +- Linux FreeS/WAN 1.0.0.2 - | - | 1.0.0.1 - Router - | 2.0.0.1 - | -Internet - | - | 3.0.0.1 -Mobile User - Virtual Address: 1.0.0.3 - -Note that the Local Lan network (1.0.0.x) can be registered, routable -addresses. - -Now, the Mobile User sets up an IPSec security association with the -Linux box (1.0.0.2); it should ESP encapsulate all traffic to the -network 1.0.0.x **EXCEPT** UDP port 500. 500/udp is required for the key -negotiation, which needs to work outside of the IPSec tunnel. - -On the Linux side, there's a bunch of stuff you need to do by hand (for -now). FreeS/WAN should correctly handle setting up the IPSec SA and -routes, but I haven't tested it so this may not work... - -The FreeS/WAN conn should look like: - -conn mobile - right=1.0.0.2 - rightsubnet=1.0.0.0/24 - rightnexthop=1.0.0.1 - left=0.0.0.0 # The infamous "road warrior" - leftsubnet=1.0.0.3/32 - -Note that the left subnet contains *only* the remote host's virtual -address. - -Hopefully the routing table on the FreeS/WAN box ends up looking like -this: - -% netstat -rn -Kernel IP routing table -Destination Gateway Genmask Flags MSS Window irtt Iface -1.0.0.0 0.0.0.0 255.255.255.0 U 1500 0 0 eth0 -127.0.0.0 0.0.0.0 255.0.0.0 U 3584 0 0 lo -0.0.0.0 1.0.0.1 0.0.0.0 UG 1500 0 0 eth0 -1.0.0.3 1.0.0.1 255.255.255.255 UG 1433 0 0 ipsec0 - -So, if anybody sends a packet for 1.0.0.3 to the Linux box, it should -get bundled up and sent through the tunnel. To get the packets for -1.0.0.3 to the Linux box in the first place, you need to use "proxy -ARP". - -How this works is: when a host or router on the local Ethernet segment -wants to send a packet to 1.0.0.3, it sends out an Ethernet level -broadcast "ARP request". If 1.0.0.3 was on the local LAN, it would -reply, saying "send IP packets for 1.0.0.3 to my Ethernet address". - -Instead, you need to set up the Linux box so that _it_ answers ARP -requests for 1.0.0.3, even though that isn't its IP address. That -convinces everyone else on the lan to send 1.0.0.3 packets to the Linux -box, where the usual FreeS/WAN processing and routing take over. - -% arp -i eth0 -s 1.0.0.3 -D eth0 pub - -This says, if you see an ARP request on interface eth0 asking for -1.0.0.3, respond with the Ethernet address of interface eth0. - -Now, as I said at the very beginning, if it is *at all* possible to -configure your client *not* to use the virtual IP address, you can avoid -this whole mess.</pre> - -<h2><a name="dynamic">Dynamic Network Interfaces</a></h2> - -<p>Sometimes you have to cope with a situation where the network interface(s) -aren't all there at boot. The common example is notebooks with PCMCIA.</p> - -<h3><a name="basicdyn">Basics</a></h3> - -<p>The key issue here is that the <var>config setup</var> section of the -<var>/etc/ipsec.conf</var> configuration file lists the connection between -ipsecN and hardware interfaces, in the <var>interfaces=</var> variable. At -any time when <var>ipsec setup start</var> or <var>ipsec setup restart</var> -is run this variable <strong>must</strong> correspond to the current real -situation. More precisely, it <strong>must not</strong> mention any hardware -interfaces which don't currently exist. The difficulty is that an <var>ipsec -setup start</var> command is normally run at boot time so interfaces that are -not up then are mis-handled.</p> - -<h3><a name="bootdyn">Boot Time</a></h3> - -<p>Normally, an <var>ipsec setup start</var> is run at boot time. However, if -the hardware situation at boot time is uncertain, one of two things must be -done.</p> -<ul> - <li>One possibility is simply not to have IPsec brought up at boot time. To - do this: - <pre> chkconfig --level 2345 ipsec off</pre> - That's for modern Red Hats or other Linuxes with chkconfig. Systems which - lack this will require fiddling with symlinks in /etc/rc.d/rc?.d or the - equivalent.</li> - <li>Another possibility is to bring IPsec up with no interfaces, which is - less aesthetically satisfying but simpler. Just put - <pre> interfaces=</pre> - in the configuration file. KLIPS and Pluto will be started, but won't do - anything.</li> -</ul> - -<h3><a name="changedyn">Change Time</a></h3> - -<p>When the hardware *is* in place, IPsec has to be made aware of it. Someday -there may be a nice way to do this.</p> - -<p>Right now, the way to do it is to fix the <var>/etc/ipsec.conf</var> file -appropriately, so <var>interfaces</var> reflects the new situation, and then -restart the IPsec subsystem. This does break any existing IPsec -connections.</p> - -<p>If IPsec wasn't brought up at boot time, do</p> -<pre> ipsec setup start</pre> -while if it was, do -<pre> ipsec setup restart</pre> -which won't be as quick. - -<p>If some of the hardware is to be taken out, before doing that, amend the -configuration file so interfaces no longer includes it, and do</p> -<pre> ipsec setup restart</pre> - -<p>Again, this breaks any existing connections.</p> - -<h2><a name="unencrypted">Unencrypted tunnels</a></h2> - -<p>Sometimes you might want to create a tunnel without encryption. Often this -is a bad idea, even if you have some data which need not be private. See this -<a href="ipsec.html#traffic.resist">discussion</a>.</p> - -<p>The IPsec protocols provide two ways to do build such tunnels:</p> -<dl> - <dt>using ESP with null encryption</dt> - <dd>not supported by FreeS/WAN</dd> - <dt>using <a href="glossary.html#AH">AH</a> without <a - href="glossary.html#ESP">ESP</a></dt> - <dd>supported for manually keyed connections</dd> - <dd>possible with explicit commands via <a - href="manpage.d/ipsec_whack.8.html">ipsec_whack(8)</a> (see this <a - href="http://www.sandelman.ottawa.on.ca/linux-ipsec/html/2001/02/msg00190.html">list - message</a>)</dd> - <dd>not supported in the <a - href="manpage.d/ipsec_auto.8.html">ipsec_auto(8)</a> scripts.</dd> -</dl> -One situation in which this comes up is when otherwise some data would be -encrypted twice. Alice wants a secure tunnel from her machine to Bob's. Since -she's behind one security gateway and he's behind another, part of the tunnel -that they build passes through the tunnel that their site admins have built -between the gateways. All of Alice and Bob's messages are encrypted twice. - -<p>There are several ways to handle this.</p> -<ul> - <li>Just accept the overhead of double encryption. The site admins might - choose this if any of the following apply: - <ul> - <li>policy says encrypt everything (usually, it should)</li> - <li>they don't entirely trust Alice and Bob (usually, if they don't - have to, they shouldn't)</li> - <li>if they don't feel the saved cycles are worth the time they'd need - to build a non-encrypted tunnel for Alice and Bob's packets (often, - they aren't)</li> - </ul> - </li> - <li>Use a plain IP-in-IP tunnel. These are not well documented. A good - starting point is in the Linux kernel source tree, in - /usr/src/linux/drivers/net/README.tunnel.</li> - <li>Use a manually-keyed AH-only tunnel.</li> -</ul> - -<p>Note that if Alice and Bob want end-to-end security, they must build a -tunnel end-to-end between their machines or use some other end-to-end tool -such as PGP or SSL that suits their data. The only question is whether the -admins build some special unencrypted tunnel for those already-encrypted -packets.</p> -</body> -</html> |