1086 lines
31 KiB
XML
1086 lines
31 KiB
XML
<?xml version="1.0"?>
|
|
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
|
|
"http://docbook.org/xml/4.4/docbookx.dtd">
|
|
|
|
<article>
|
|
<articleinfo>
|
|
<title>Practical VPNs</title>
|
|
<subtitle>Implementing Full-scale VPNs</subtitle>
|
|
|
|
<author>
|
|
<firstname>Liran</firstname>
|
|
<surname>Tal</surname>
|
|
<affiliation>
|
|
<address>
|
|
<email>liran@enginx.com</email>
|
|
</address>
|
|
</affiliation>
|
|
</author>
|
|
|
|
<othercredit>
|
|
<firstname>Yakov</firstname>
|
|
<surname>Shtutz</surname>
|
|
<contrib>Special thanks</contrib>
|
|
</othercredit>
|
|
|
|
<othercredit>
|
|
<firstname>Shahar</firstname>
|
|
<surname>Fermon</surname>
|
|
<contrib>Testing and feedback</contrib>
|
|
</othercredit>
|
|
|
|
<abstract>
|
|
<para>
|
|
This document was compiled from the administrator's point of
|
|
view, to explain what are VPNs, how they are deployed today
|
|
and to detail the necessary steps and tools to achieve and
|
|
create a fully working VPN solution, integrated with RADIUS
|
|
systems for AAA.
|
|
</para>
|
|
|
|
<para>
|
|
I will not dwell in this document on how to compile source
|
|
packages or kernel patching, and with the same tone I'm
|
|
assuming the reader is an exprerienced Linux user.
|
|
</para>
|
|
|
|
<para>
|
|
VPNs have their share amount of gossip for being a very
|
|
complex thing, and in some cases this may be true as they tend
|
|
to be more security intenssive which require adding more and
|
|
more layers to the scheme. With this said, we'll take a look
|
|
at how fairly straight-forward it is to setup VPNs and
|
|
maintain them with varius Open-Source tools.
|
|
</para>
|
|
</abstract>
|
|
</articleinfo>
|
|
|
|
<sect1 id="overview">
|
|
<title>Overview of VPNs and IPsec</title>
|
|
<sect2 id="vpns">
|
|
<title>Virtual Private Networks</title>
|
|
<para>
|
|
The purpose of a VPN is to create a secure channel ontop of an
|
|
un-secure medium, where a computer or a device are put in each
|
|
end-point in order to establish communication, each of these
|
|
end-points are often reffered to as Point of Presense, or POP.
|
|
This kind of a communication allows the capability of creating
|
|
a Virtual Private Network, which is accesable over a medium
|
|
such as the Internet and thus, extend the physical boundaries
|
|
of an existing local network.
|
|
</para>
|
|
|
|
<para>
|
|
VPNs have three forms:
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>Site-To-Site VPNs</term>
|
|
<listitem>
|
|
<para>
|
|
these setups exist in order to extend the local network
|
|
to create a much bigger LAN over the Internet.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>Network-To-Host or Remote access VPNs</term>
|
|
<listitem>
|
|
<para>
|
|
where a central VPN server is able to achieve multiple
|
|
connections, often reffered to as RoadWarrior VPNs.
|
|
(This setup is very common among ISPs)
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>Network-To-Network</term>
|
|
<listitem>
|
|
<para>
|
|
extranet VPNs allow secure connections within branches
|
|
and business partners, they are an extension of a
|
|
Site-To-Site VPNs.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<para>
|
|
<xref linkend="site-to-site"/> shows a Site-To-Site VPN diagram.
|
|
<figure id="site-to-site">
|
|
<title>Site to Site VPN</title>
|
|
<mediaobject>
|
|
<imageobject>
|
|
<imagedata fileref="site-to-site-vpn.png"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
</figure>
|
|
</para>
|
|
|
|
<para>
|
|
IP/VPNs are connections which are based upon IP tunnels. A
|
|
tunnel is a way to encapsulate an IP packet inside another IP
|
|
packet or some other type of packet. Why do we need
|
|
tunneling? A Virtual Private Network is identified by IANA's
|
|
private IP assignments and so such packet can not go beyond
|
|
the uplink Internet interface.
|
|
</para>
|
|
|
|
<para>
|
|
<xref linkend="tunneling-process"/> shows the tunneling process.
|
|
<figure id="tunneling-process">
|
|
<title>Tunneling Process</title>
|
|
<mediaobject>
|
|
<imageobject>
|
|
<imagedata fileref="tunneling-process.png"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
</figure>
|
|
</para>
|
|
|
|
<para>
|
|
Several tunneling protocols are available for manifesting
|
|
VPNs.
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>L2F</term>
|
|
<listitem>
|
|
<para>
|
|
Layer 2 Forwarding, an older implementation which
|
|
assume position at the link layer of the OSI. It has
|
|
no encryption capabilities and hence, deprecated.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>L2TP</term>
|
|
<listitem>
|
|
<para>
|
|
Layer 2 Tunneling Protocol, still no encryption
|
|
capabilities.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>PPTP</term>
|
|
<listitem>
|
|
<para>
|
|
Point-to-Point Tunneling Protocol, and yet again, no
|
|
encryption.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<para>
|
|
As seen, the requirement of encryption enhancement is urgent
|
|
in order to assure authentication, data integrity and privacy.
|
|
IPsec solves this by providing a suite of security measures
|
|
implemented at layer 3.
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 id="ipsec">
|
|
<title>IP Security Suite (IPsec)</title>
|
|
<para>
|
|
VPN Security is now appearing, this complex things. How so?
|
|
VPN tunnels by themselves are easily maintained by
|
|
single-standalone tools like pppd, l2tpns, stunnel and others.
|
|
Involving security with VPNs though requires more:
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>authentication, data integrity and privacy</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>keying management</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
Keys are secrets being shared by two end-points to provide a
|
|
secure mean of communication against a third-party
|
|
connection from sniffing the actual data.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
Different ways to handle key management include RADIUS (Remote
|
|
Authentication Dial In User Service) systems which provide AAA
|
|
(Authentication, Authorization and Accounting). Another
|
|
solution is ISAKMP/Oackly - Internet Security Association and
|
|
Key Management Protocol. This solution requires you to posess
|
|
one of the following:
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>something you have</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>something you know</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>something you are</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>
|
|
The more requirements you meet the more secure is the medium,
|
|
once established. Let's review, something we have is like a
|
|
certificate, it proves who we are. Something we know, is a
|
|
key, a secret password which we were told in a whisper, and
|
|
something we are is our-fingerprint which identifies ourselves
|
|
from other individuals.
|
|
</para>
|
|
|
|
<sect3 id="ipsec-in-depth">
|
|
<title>IPsec in Depth</title>
|
|
<para>
|
|
IPsec consists of two main protocols, an Authentication
|
|
Header and Encapsulation Security Payload, also known as AH
|
|
and ESP. Although it is not bound to these and can be
|
|
extended (and often is) to other standarts such as
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>Data Encryption Standart (DES and 3DES)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Diffie-Hellman (DH)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Secure Hash Algorithm-1 (SHA1)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Message Digest 5 (MD5)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Internet Key Exchange (IKE)</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Certification Authorities (CA)</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>
|
|
We'll be deploying an IKE daemon to handle the key
|
|
management, which uses the Diffie- Hellman cryptography
|
|
protocol in order to allow two parties to establish a
|
|
connection based upon a shared secret key that both parties
|
|
posess. (Authentication within IKE is handled by MD5
|
|
hashing)
|
|
</para>
|
|
|
|
<para>
|
|
IKE is responsible for authentication of two IPsec parties,
|
|
negotiation of keys for encryption algorithms and security
|
|
associations. This process is commonly regarded as two
|
|
phases:
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>Phase 1: IKE Security Association</term>
|
|
<listitem>
|
|
<para>
|
|
The IKE daemon authenticates against the peers in
|
|
order to achieve a secure channel, according to the
|
|
Diffie-Hellman key agreement.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>Phase 2: IKE IPsec Negotiation</term>
|
|
<listitem>
|
|
<para>
|
|
After achieving an authenticated channel, the
|
|
parties now negotiate a secure transform (the way to
|
|
encrypt and secure the medium) where the sender is
|
|
offering his/hers transform set after which the
|
|
receiver decides upon one. An IPsec session can now
|
|
safely begin.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<para>
|
|
Just to be clear, a Security Association is an agreed
|
|
relation between two parties which describes how they will
|
|
use security services (from IPsec) to communicate.
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="ipsec-modes">
|
|
<title>IPsec Modes</title>
|
|
<para>
|
|
IPsec can operate in two different modes:
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>Transport mode</term>
|
|
<listitem>
|
|
<para>
|
|
takes place when two devices (like a station and a
|
|
gateway (now considered a host)) are establishing a
|
|
connection which upon they both support IPsec.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>Tunnel mode</term>
|
|
<listitem>
|
|
<para>
|
|
we require tunnel mode when we proxy IPsec
|
|
connetions between two stations behind the IPsec
|
|
gateway. For example, in a Site-to-Site VPN a
|
|
tunnel mode lives, since it exists in order to
|
|
provide the stations behind these gateways runing
|
|
the VPN/IPsec to communicate securely. In this
|
|
situation, both end-points are runing an IPsec
|
|
software.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<para>
|
|
In definition, a tunnel mode IPsec is better secured than
|
|
transport. Without going too deep into the ins-and-outs of
|
|
the technical side, transport mode doesn't encapsulate the
|
|
actual IP layer but only the tcp/udp (Transport layer of the
|
|
OSI) where-as a tunnel mode encapsulate both the Transport
|
|
layer and the IP layer into a new IP packet.
|
|
</para>
|
|
|
|
<para>
|
|
To summarize, we need VPNs for data-exchange methods and a
|
|
set of IPsec tools for security reasons.
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="deployment">
|
|
<title>VPN Deployment</title>
|
|
<para>
|
|
I've assembled another diagram to view the actual VPN setup.
|
|
<xref linkend="vpn-deployment"/> gives a general description of
|
|
how the network will be layed out in real-world scenario.
|
|
|
|
<figure id="vpn-deployment">
|
|
<title>VPN Deployment</title>
|
|
<mediaobject>
|
|
<imageobject>
|
|
<imagedata fileref="vpn-deployment.png"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
</figure>
|
|
</para>
|
|
|
|
<para>
|
|
We notice that a single Linux box is acting as a Gateway and has
|
|
all the services included with it. This is a bad idea from a
|
|
security prespective but it's easy to just deploy the FreeRADIUS
|
|
and MySQL servers on another machine. Of course the L2TPns and
|
|
the rest of the IPsec tools suite would have to remain on the
|
|
Gateway box (not necessarily the Firewall).
|
|
</para>
|
|
|
|
<para>
|
|
<xref linkend="vpn-process"/> attempts to explain the actual
|
|
process that the VPN takes and to detail the place that each of
|
|
that application-in-charge takes place.
|
|
|
|
<figure id="vpn-process">
|
|
<title>VPN Process</title>
|
|
<mediaobject>
|
|
<imageobject>
|
|
<imagedata fileref="vpn-process.png"/>
|
|
</imageobject>
|
|
</mediaobject>
|
|
</figure>
|
|
</para>
|
|
|
|
<sect2 id="deployment-requirements">
|
|
<title>Requirements</title>
|
|
<sect3 id="deployment-requirements-toolbox">
|
|
<title>The Toolbox</title>
|
|
<para>
|
|
Following is a description of the requirements you will
|
|
have to meet:
|
|
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>A Linux box</term>
|
|
<listitem>
|
|
<para>preferably a 2.4.27 kernel or higher.</para>
|
|
<para>
|
|
Debian is the chosen distribution which means we'll
|
|
be using apt-get for installation, but I'll also
|
|
focus on basic source tarballs installation.
|
|
</para>
|
|
|
|
<para>
|
|
Dependencies:
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>ipsec configuration in the kernel</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>L2TPns</term>
|
|
<listitem>
|
|
<para>an L2TP PPP Termination tool.</para>
|
|
<para>
|
|
Dependencies:
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>libcli 1.8.0 or greater</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
tun/tap interface compiled in the kernel or as
|
|
a module
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>FreeRADIUS</term>
|
|
<listitem>
|
|
<para>For authentication, and accounting.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>MySQL</term>
|
|
<listitem>
|
|
<para>To act as a back-end database for the RADIUS.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>OpenSwan</term>
|
|
<listitem>
|
|
<para>Provides the ipsec suite package.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
</sect3>
|
|
|
|
<sect3 id="deployment-requirements-kernel">
|
|
<title>Kernel Support</title>
|
|
<para>
|
|
Debian stock kernel 2.4.27 and up are ipsec compatible
|
|
although if you think otherwise check for the
|
|
kernel-patch-openswan package.
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 id="deployment-installation">
|
|
<title>Installation</title>
|
|
<sect3 id="deployment-installation-l2tpns">
|
|
<title>L2TPns</title>
|
|
<sect4 id="deployment-installation-l2tpns-install">
|
|
<title>Installation</title>
|
|
<blockquote>
|
|
<para>
|
|
L2TPns is a layer 2 tunneling protocol network server
|
|
(LNS). It supports up to 65535 concurrent sessions per
|
|
server/cluster plus ISP features such as rate limiting,
|
|
walled garden, usage accounting, and more.
|
|
</para>
|
|
</blockquote>
|
|
|
|
<para>
|
|
In a personal note - L2TPns is highly configurable for
|
|
many cases, and extremely reliable for
|
|
production/commerical use.
|
|
</para>
|
|
|
|
<para>
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>Step 1:</term>
|
|
<listitem>
|
|
<para>
|
|
Make sure you have libcli-1.8 development package
|
|
installed:
|
|
<screen>
|
|
# apt-cache search libcli
|
|
libcli-dev - emulates a cisco style telnet command-line interface (dev files)
|
|
libcli1 - emulates a cisco style telnet command-line interface
|
|
# apt-get install libcli-dev
|
|
</screen>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>Step 2:</term>
|
|
<listitem>
|
|
<para>
|
|
Download the source from
|
|
<ulink url="http://sourceforge.net/projects/l2tpns/">
|
|
SourceForge</ulink>.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>Step 3:</term>
|
|
<listitem>
|
|
<para>
|
|
Build and install:
|
|
<code>make && make install</code>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
Alternately, you can skip these steps and simply
|
|
<code>apt-get install l2tpns</code>.
|
|
</para>
|
|
</note>
|
|
|
|
<note>
|
|
<para>
|
|
On RPM-based distributions, you should be able to make
|
|
packages from the libcli and l2tpns source tarballs with
|
|
<code>rpmbuild -ta</code>.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
Once compiliation is done you will have l2tpns in
|
|
<filename>/usr/sbin/l2tpns</filename>, and all
|
|
configuration files can be found in
|
|
<filename>/etc/l2tpns/</filename>.
|
|
</para>
|
|
</sect4>
|
|
|
|
<sect4 id="deployment-installation-l2tpns-config">
|
|
<title>Configuration</title>
|
|
<para>
|
|
The only configuration that L2TPns takes is centralized in
|
|
the configuration file
|
|
<filename>/etc/l2tpns/startup-config</filename>.
|
|
<programlisting>
|
|
set debug 2 # Debugging level
|
|
set log_file "/var/log/l2tpns" # Log file: comment out to use stderr, use
|
|
# "syslog:facility" for syslog
|
|
set pid_file "/var/run/l2tpns.pid" # Write pid to this file
|
|
set l2tp_secret <emphasis>"secret"</emphasis> # shared secret
|
|
set primary_dns <emphasis>212.117.128.6</emphasis> # Only 2 DNS server entries are allowed
|
|
set secondary_dns <emphasis>212.117.129.3</emphasis>
|
|
set primary_radius <emphasis>192.168.0.1</emphasis> # Can have multiple radius server entries,
|
|
# but ony one radius secret
|
|
set primary_radius_port 1812
|
|
set radius_secret <emphasis>"radius_secret"</emphasis>
|
|
set radius_accounting yes
|
|
set radius_dae_port 3799
|
|
set accounting_dir "/var/run/l2tpns/acct" # Write usage accounting files into specified
|
|
# directory
|
|
set peer_address <emphasis>192.168.0.1</emphasis> # Gateway address given to clients
|
|
load plugin "sessionctl" # Drop/kill sessions
|
|
load plugin "autothrottle" # Throttle/snoop based on RADIUS
|
|
load plugin "throttlectl" # Control throttle/snoop with nsctl
|
|
load plugin "snoopctl"
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
This is the trimmed down version of probably most of
|
|
the common configuration and even some extra options.
|
|
</para>
|
|
|
|
<para>
|
|
Important configuration options are highlited and you
|
|
should adjust these to meet your network needs. We can
|
|
deploy all of the environment into one box which is of
|
|
course not a very good idea from a security point of view,
|
|
but will function just fine. Moreover, we will be using
|
|
aliased IP addresses so once you've decided to move the
|
|
FreeRADIUS daemon to another computer on the LAN it will
|
|
be fairly easy and won't take too much configuration into
|
|
it.
|
|
</para>
|
|
|
|
<para>
|
|
Next, we need to setup the IP pool that L2TPns will
|
|
provide to each VPN client. The configuration file is
|
|
located at <filename>/etc/l2tpns/ip_pool</filename> and
|
|
should look like the following:
|
|
<programlisting>172.16.21.0/24</programlisting>
|
|
</para>
|
|
|
|
<important>
|
|
<para>
|
|
Of course you can change this pool to anything else
|
|
(IANA IPs assigned for private internets only) just make
|
|
sure it is not conflicting with your current LAN network
|
|
addresses. This means that if you've assigned addresses
|
|
of 192.168.0.1 and 192.168.0.2 to your LAN boxes you
|
|
can't have a pool of 192.168.0.1/24 defined since L2TPns
|
|
will try to route those addresses from the tun device,
|
|
which is needless to say a bad idea...
|
|
</para>
|
|
</important>
|
|
|
|
<para>Next up, creating the access-list for L2TPns.</para>
|
|
|
|
<para>
|
|
Add a username and password into
|
|
<filename>/etc/l2tpns/users</filename>:
|
|
<programlisting>admin:12345</programlisting>
|
|
|
|
The password may either be plain-text as above, or
|
|
encrypted with MD5 or DES (to distinguish DES from
|
|
plain-text passwords, prefix the value with
|
|
<code>{crypt}</code>).
|
|
</para>
|
|
|
|
<para>
|
|
L2TPns utilizes a terminal connection on port 23 which you
|
|
would feel very comfortable in if you have worked with
|
|
routers and switches devices before. The terminal
|
|
provides control over the ppp termination which is why
|
|
we've created an account to log on to.
|
|
</para>
|
|
</sect4>
|
|
</sect3>
|
|
|
|
<sect3 id="deployment-installation-ipsec">
|
|
<title>IPsec</title>
|
|
<sect4 id="deployment-installation-ipsec-install">
|
|
<title>Installation</title>
|
|
<para>
|
|
User-space IPsec tools for various IPsec implementations
|
|
exist for linux, among them is the port of KAME's
|
|
libipsec, setkey, and racoon. Others are the OpenSWAN (a
|
|
successor to the FreeSWAN project).
|
|
</para>
|
|
|
|
<para>
|
|
Getting IPsec installed is fairly easy with Debian:
|
|
<screen># apt-get install openswan</screen>
|
|
</para>
|
|
|
|
<para>
|
|
The OpenSWAN project provides packages for RPM-based
|
|
distributions.
|
|
</para>
|
|
|
|
<para>
|
|
Alternately, you may download the
|
|
<ulink url="http://www.openswan.org/code/">source</ulink>
|
|
from the OpenSWAN project:
|
|
<screen>
|
|
# tar xvzf openswan-2.4.4.tar.gz
|
|
# cd openswan-2.4.4
|
|
# ./configure && make && make install
|
|
</screen>
|
|
</para>
|
|
</sect4>
|
|
|
|
<sect4 id="deployment-installation-ipsec-config">
|
|
<title>Configuration</title>
|
|
<para>
|
|
OpenSWAN acts as the IKE daemon (remember IKE? it's job
|
|
is to authenticate between the two peers and negotiate a
|
|
secure medium). We will be setting up the IKE daemon as a
|
|
RoadWarrior configuration, a term for remote access
|
|
VPNs.
|
|
</para>
|
|
|
|
<para>
|
|
We desire this approach for compatibilty because after our
|
|
VPN solution will be complete any user from a Windows
|
|
machine will be easily ready to connect without any 3rd
|
|
party applications, same for Linux.
|
|
</para>
|
|
|
|
<para>
|
|
Configuration files are placed in
|
|
<filename>/etc/ipsec.d/</filename>,
|
|
<filename>/etc/ipsec.conf</filename> and
|
|
<filename>/etc/ipsec.secrets</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
Let's start by choosing the remote client and it's PSK
|
|
(Private Shared Key) <filename>/etc/ipsec.secrets</filename>:
|
|
<programlisting>
|
|
hostname_or_ipaddress %any : PSK "mysecretkeyisverylong"
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
This is an IP/key pair. The IP or FQDN defines the local
|
|
peer (like a SOHO branch), then the remote host. Here we
|
|
defined %any for all hosts, though it's possible to define
|
|
only a specific IP. At last, we define the key associated
|
|
with it.
|
|
</para>
|
|
|
|
<para>
|
|
A better way to create a key is to utilize /dev/random for
|
|
creating a unique key.
|
|
<screen># dd if=/dev/random count=16 bs=1 2>/dev/null | xxd -ps</screen>
|
|
</para>
|
|
|
|
<para>
|
|
Next, let's prepare the configuration file
|
|
<filename>/etc/ipsec.conf</filename>:
|
|
<programlisting>
|
|
version 2.0
|
|
config setup
|
|
nat_traversal=yes
|
|
|
|
conn l2tp
|
|
authby=secret
|
|
pfs=no
|
|
keyingtries=3
|
|
left=real_ip_address
|
|
leftnexthop=%defaultroute
|
|
leftprotoport=17/%any
|
|
right=%any
|
|
rightprotoport=17/%any
|
|
auto=add
|
|
|
|
include /etc/ipsec.d/examples/no_oe.conf
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
In this file we have first defined version 2 which is a
|
|
must, then enabled NAT Traversal. To understand the
|
|
importance of this feature think of the following
|
|
scenario: A remote user attempts to connect while he's
|
|
behind a router and therefore NATed. The router has to
|
|
de-encapsulate the packet, change things and then build it
|
|
up again and send it. IPsec doesn't like other people
|
|
messing with it's packet. That's why we solve this issue
|
|
with NAT Traversal.
|
|
</para>
|
|
|
|
<para>
|
|
Next up we configure authentication type (certificates,
|
|
psk, rsa keys, etc) then the left and right peers. The
|
|
default mode OpenSWAN takes is tunnel unless told
|
|
otherwise. I won't go into in-depth explanation of every
|
|
method, you can take a quick look at
|
|
<filename>/etc/ipsec.d/examples</filename> for more
|
|
explanation and other variations of working with RSA keys,
|
|
Certificates, host-to-host, and more.
|
|
</para>
|
|
|
|
<para>
|
|
In summary:
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>
|
|
We've configured an almost complete IPsec VPN setup.
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
We've installed and configured a VPN server (L2TPns)
|
|
and our IPsec security suite.
|
|
</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>
|
|
To control both of them we use:
|
|
<filename>/etc/init.d/l2tpns</filename> and
|
|
<filename>/etc/init.d/racoon</filename> (location
|
|
of start-up scripts may vary on non-Debian systems,
|
|
or if you've installed from
|
|
source).
|
|
</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
</sect4>
|
|
</sect3>
|
|
|
|
<sect3 id="deployment-installation-freeradius">
|
|
<title>FreeRADIUS</title>
|
|
<para>
|
|
The VPN setup needs to authenticate against something, that
|
|
is the users database which we chose to be a FreeRADIUS
|
|
server backed with a MySQL database.
|
|
</para>
|
|
|
|
<sect4 id="deployment-installation-freeradius-install">
|
|
<title>Installation</title>
|
|
<blockquote>
|
|
<para>
|
|
FreeRADIUS is the premiere open source RADIUS server.
|
|
While detailed statistics are not available, we believe
|
|
that FreeRADIUS is well within the top 5 RADIUS servers
|
|
world-wide, in terms of the number of people who use it
|
|
daily for authentication. It scales from embedded
|
|
systems with small amounts of memory, to systems with
|
|
millions of users. It is fast, flexible, configurable,
|
|
and supports more authentication protocols than many
|
|
commercial servers.
|
|
</para>
|
|
</blockquote>
|
|
|
|
<para>
|
|
Installing on Debian:
|
|
<screen># apt-get install freeradius freeradius-mysql</screen>
|
|
</para>
|
|
|
|
<para>
|
|
From source: Download the latest freeradius package from
|
|
<ulink url="http://freeradius.org/getting.html">freeradius.org
|
|
</ulink>
|
|
<screen>
|
|
# tar xvzf freeradius.tar.gz
|
|
# cd freeradius
|
|
# ./configure && make && make install
|
|
</screen>
|
|
</para>
|
|
</sect4>
|
|
|
|
<sect4 id="deployment-installation-freeradius-config">
|
|
<title>Configuration</title>
|
|
<para>
|
|
This will appear a bit complex but it isn't, it's just a
|
|
lot of configuration.
|
|
</para>
|
|
|
|
<para>
|
|
Following are the configurations you need to have in your
|
|
<filename>/etc/freeradius/</filename> files.
|
|
</para>
|
|
|
|
<para>
|
|
In this section I will not give you a dump of the
|
|
configuration since they are very long and mostly default.
|
|
I'll just post which changes to make.
|
|
</para>
|
|
|
|
<para>
|
|
We haven't yet configured MySQL, but it'll come
|
|
afterwards, don't worry.
|
|
</para>
|
|
|
|
<para>
|
|
Make the following changes to the file
|
|
<filename>/etc/freeradius/sql.conf</filename>:
|
|
<programlisting>
|
|
server = "192.168.0.1"
|
|
login = "radius"
|
|
password = "12345678"
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
Add the following to the file
|
|
<filename>/etc/freeradius/clients.conf</filename>:
|
|
<programlisting>
|
|
client 192.168.0.1 {
|
|
secret = my_secret
|
|
shortname = localhost
|
|
nastype = other
|
|
}
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
Don't confuse the secret directive there with IPsec.
|
|
RADIUS server are using secret keys also to identify their
|
|
allowed NAS (Network Access Servers), these are the
|
|
clients that talk to the RADIUS server.
|
|
</para>
|
|
|
|
<para>
|
|
Also, change the <code>client 127.0.0.1 {}</code>
|
|
directive to hold the secret "my_secret" like we
|
|
configured for 192.168.0.1 to avoid conflicts.
|
|
</para>
|
|
|
|
<para>
|
|
Uncomment the <code>sql</code> directive in the
|
|
<code>authorize</code>, <code>accounting</code>, and
|
|
<code>session</code> sections of
|
|
<filename>/etc/freeradius/radiusd.conf</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
Now for populating FreeRADIUS with MySQL. If you don't
|
|
know or haven't set root password for MySQL you can do it
|
|
now with:
|
|
<screen># mysqladmin -u root password password_here</screen>
|
|
|
|
Then add the following to
|
|
<filename>/root/.my.cnf</filename>:
|
|
|
|
<programlisting>
|
|
[mysqladmin]
|
|
user = root
|
|
password = password_here
|
|
</programlisting>
|
|
</para>
|
|
|
|
<para>
|
|
Create the <code>radius</code> database, using the
|
|
schema given in
|
|
<filename>/usr/share/doc/freeradius/examples/db_mysql.sql.gz
|
|
</filename>.
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
It may be necessary to modify the column definition of
|
|
<code>id</code> in the <code>nas</code> table, removing
|
|
<code>DEFAULT '0'</code> such that the definition reads:
|
|
|
|
<programlisting>id int(10) NOT NULL auto_increment,</programlisting>
|
|
</para>
|
|
</note>
|
|
|
|
<screen>
|
|
# mysqladmin create radius
|
|
# mysql radius
|
|
mysql> source db_mysql.sql
|
|
mysql> GRANT ALL ON * TO 'radius'@'localhost' IDENTIFIED BY 'radius_password';
|
|
</screen>
|
|
<para>
|
|
All the configuration is now done. Let's add a user to
|
|
our VPN database.
|
|
<screen>
|
|
# mysql radius
|
|
mysql> INSERT INTO radcheck values (0, "test", "User-Password", "==", "1234");
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
We have now created a user in the database of username
|
|
<code>test</code> and password <code>1234</code>.
|
|
</para>
|
|
|
|
<para>
|
|
Testing the RADIUS setup is simple using the radtest
|
|
utility provided with it.
|
|
<screen>
|
|
# radtest
|
|
Usage: radtest user passwd radius-server[:port] nas-port-number secret [ppphint] [nasname]
|
|
# radtest test 1234 192.168.0.1 1812 my_secret
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
radtest sends an Access-Request to the RADIUS server and
|
|
expects an Access-Accept back from it. If you're not
|
|
getting an Access-Accept from the RADIUS you're advised to
|
|
check the configuration again and see what you might have
|
|
missed.
|
|
</para>
|
|
</sect4>
|
|
</sect3>
|
|
|
|
<sect3 id="deployment-installation-firewall">
|
|
<title>Firewall Configuration</title>
|
|
<para>
|
|
We need to apply a few things to iptables configuration and
|
|
kernel networking.
|
|
</para>
|
|
|
|
<para>
|
|
First off, we need to accept VPN-specific packets through
|
|
the firewall. Of course you will have to adjust the rules
|
|
to fits you needs, in this case, ppp0 is the Internet
|
|
interface.
|
|
<screen>
|
|
# iptables --append INPUT --in-interface ppp0 -p udp --dport 1701 -j ACCEPT
|
|
# iptables --append INPUT --in-interface ppp0 -p udp --dport 500 -j ACCEPT
|
|
# iptables --append INPUT --in-interface ppp0 -p udp --dport 4500 -j ACCEPT
|
|
# iptables --append INPUT --in-interface ppp0 -p 50 -j ACCEPT
|
|
</screen>
|
|
</para>
|
|
|
|
<para>
|
|
If you haven't setup your Linux box as a gateway yet then
|
|
you have to allow forwarding/masqing for the boxes on
|
|
the LAN (and therefore for the VPN clients):
|
|
<screen>
|
|
# iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
|
|
# iptables --append FORWARD --in-interface eth0 -j ACCEPT
|
|
# echo 1 > /proc/sys/net/ipv4/ip_forward
|
|
</screen>
|
|
</para>
|
|
</sect3>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="references">
|
|
<title>References</title>
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term>VPN Reference</term>
|
|
<listitem>
|
|
<para>
|
|
<ulink url="http://www.jacco2.dds.nl/networking/freeswan-l2tp.html"></ulink>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>L2TPns Project</term>
|
|
<listitem>
|
|
<para><ulink url="http://l2tpns.sourceforge.net"></ulink></para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>OpenSWAN Project</term>
|
|
<listitem>
|
|
<para><ulink url="http://www.openswan.org"></ulink></para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</sect1>
|
|
</article>
|