*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->OpenBSD man pages -> vpn (8)              
Title
Content
Arch
Section
 

VPN(8)

Contents


NAME    [Toc]    [Back]

     vpn - configuring the system for virtual private networks

DESCRIPTION    [Toc]    [Back]

     A virtual private network is used to securely connect two or
more subnets
     over  the  internet.   For  each  subnet there is a security
gateway which is
     linked via a cryptographically secured tunnel to the security gateway of
     the other subnet.  ipsec(4) is used to provide the necessary
network-layer
 cryptographic services.  This document describes the configuration
     process for setting up a VPN.

     Briefly, creating a VPN consists of the following steps:

     1.   Choose a key exchange method: manual keyed, or automated via
          isakmpd(8).
     2.   For manual keying,  create  the  Security  Associations
(SA), one for
          each endpoint.
     3.    For manual keying, create the appropriate IPsec flows.
     4.   For automated keying, create a configuration  file  for
the keying
          daemon.
     5.   Configure your firewall rules appropriately.

   Choosing a key exchange method    [Toc]    [Back]
     There are currently two key exchange methods available:

     +o   manual (symmetric shared secret)
     +o   isakmpd(8)

   Enabling Packet Forwarding    [Toc]    [Back]
     For security gateways, proper operation often requires packet forwarding
     to be enabled using sysctl(8):

           # sysctl net.inet.ip.forwarding=1
           # sysctl net.inet6.ip6.forwarding=1

     Packet forwarding defaults to 'off'.

     For more  permanent  operation,  the  appropriate  option(s)
should be enabled
     in your sysctl.conf(5).

   Generating Manual Keys [manual keying]
     The shared secret symmetric keys used to create a VPN can be
any hexadecimal
 value, so long as both sides of the connection use  the
same values.
     Since  the  security of the VPN is based on these keys being
unguessable,
     it is very important that the keys be chosen using a  strong
random
     source.  One practical method of generating them is by using
the
     random(4) device.  To produce 160 bits (20 bytes) of randomness, for example,
 do:

           # openssl rand 20 | hexdump -e '20/1 "%02x"'

     or:

           # openssl rand 20 | perl -pe 's/./unpack("H2",$&)/ges'

     Different cipher types may require different sized keys.

           Cipher    Key Length
           DES       56 bits
           3DES      168 bits
           AES       Variable (128 bits recommended)
           BLF       Variable (160 bits recommended)
           CAST      Variable (128 bits maximum and recommended)
           SKIPJACK  80 bits

     Use of DES or SKIPJACK as an  encryption  algorithm  is  not
recommended (except
  for  backwards  compatibility)  due to their short key
length.  Furthermore,
 recent attacks on SKIPJACK have shown severe weaknesses in its
     structure.

     Note that DES requires 8 bytes to form a 56-bit key and 3DES
requires 24
     bytes to form its 168-bit key.  This  is  because  the  most
significant bit
     of each byte is ignored by both algorithms.

   Creating Security Associations [manual keying]
     Before the IPsec flows can be defined, two Security Associations (SAs)
     must be defined on each end of the VPN, e.g.:

           #  ipsecadm  new  esp  -spi  $SPI_AB  -src  $GATEWAY_A
-dst    $GATEWAY_B    -forcetunnel    -enc    3des   -auth   sha1
-keyfile  $ENCRYPTION_KEY_FILE                 -authkeyfile  $AUTHENTICATION_KEY_FILE
           #  ipsecadm  new  esp  -spi  $SPI_BA  -src  $GATEWAY_B
-dst   $GATEWAY_A   -forcetunnel    -enc    3des    -auth    sha1
-keyfile  $ENCRYPTION_KEY_FILE                 -authkeyfile  $AUTHENTICATION_KEY_FILE

     Note that the -key and -authkey options may be used to specify the keys
     directly  in the ipsecadm(8) command line.  However, another
user could
     view the keys by using the ps(1) command at the  appropriate
time (or use
     a program for doing so).

   Creating IPsec Flows [manual keying]
     Both  IPsec  gateways need to configure ipsec(4) routes with
the
     ipsecadm(8) tool:

     On the security gateway of subnet A:

           #   ipsecadm   flow   -out   -require    -proto    esp
-src  $GATEWAY_A  -dst $GATEWAY_B                -addr $NETWORK_A
$NETWORK_B
           #   ipsecadm   flow   -in    -require    -proto    esp
-src  $GATEWAY_A  -dst $GATEWAY_B                -addr $NETWORK_B
$NETWORK_A

     and on the security gateway of subnet B:

           #   ipsecadm   flow   -out   -require    -proto    esp
-src  $GATEWAY_B  -dst $GATEWAY_A                -addr $NETWORK_B
$NETWORK_A
           #   ipsecadm   flow   -in    -require    -proto    esp
-src  $GATEWAY_B  -dst $GATEWAY_A                -addr $NETWORK_A
$NETWORK_B

   Configure and run the keying daemon [automated keying]
     Unless manual keying is used, both security gateways need to
start the
     isakmpd(8)  key  management daemon.  To make sure the daemon
is properly
     configured to provide the required security services  (typically, encryption
  and authentication) start the daemon with debugging or
verbose output.


     isakmpd(8) implements  security  policy  using  the  KeyNote
trust management
     system.

   Configuring Firewall Rules    [Toc]    [Back]
     pf(4)  needs to be configured such that all packets from the
outside are
     blocked by default.  Only successfully IPsec-processed packets (from the
     enc(4)  interface),  or  key  management packets (for isakmpd(8), UDP packets
     with source and destination ports of 500) should be  allowed
to pass.

     The pf.conf(5) rules for a tunnel which uses encryption (the
ESP IPsec
     protocol) and isakmpd(8) on security gateway  A  might  look
like this:

     GATEWAY_A = "192.168.1.254/32"
     GATEWAY_B = "192.168.2.1/32"
     NETWORK_A = "10.0.50.0/24"
     NETWORK_B = "10.0.99.0/24"

     # default deny
     # ne0 is the only interface going to the outside.
     block in log on { enc0, ne0 } all
     block out log on { enc0, ne0 } all

     # Passing in encrypted traffic from security gateways
     pass in proto esp from $GATEWAY_B to $GATEWAY_A
     pass out proto esp from $GATEWAY_A to $GATEWAY_B

     # Need to allow ipencap traffic on enc0.
     pass in on enc0 proto ipencap all

     # Passing in traffic from the designated subnets.
     pass in on enc0 from $NETWORK_B to $NETWORK_A
     pass out on enc0 from $NETWORK_A to $NETWORK_B

     # Passing in isakmpd(8) traffic from the security gateways
     pass  in  on  ne0  proto  udp  from $GATEWAY_B port = 500 to
$GATEWAY_A port = 500
     pass out on ne0 proto udp from  $GATEWAY_A  port  =  500  to
$GATEWAY_B port = 500

     If  there  are no other pf.conf(5) rules, the "quick" clause
can be added
     to the last four rules.  NAT rules can also be used  on  the
enc(4) interface.
   Note  that it is strongly encouraged that instead of
detailed PF
     rules, the SPD (IPsec flow database) be utilized to  specify
security policy,
 if only to avoid filtering conflicts.

FILES    [Toc]    [Back]

     /usr/share/ipsec/rc.vpn    Sample VPN configuration file
     /etc/isakmpd/isakmpd.conf  isakmpd(8) configuration file
     /etc/pf.conf               Firewall configuration file

EXAMPLES    [Toc]    [Back]

   Manual keying
     To  create  a  manual keyed VPN between two class C networks
using 3DES encryption
 and the following IP addresses:

            GATEWAY_A  = 192.168.1.254
            NETWORK_A = 10.0.50.0/24
            GATEWAY_B  = 192.168.2.1
            NETWORK_B = 10.0.99.0/24

     1.   Choose the  shared  secrets  using  a  suitably  random
method.  The 3DES
          encryption key needs 192 bits (3x64), or 24 bytes.  The
SHA-1 authentication
 key for needs 160 bits, or 20 bytes.

          # openssl rand 24 | hexdump -e '24/1 "%02x"' > enc_key
          # openssl rand 20 | hexdump -e '20/1 "%02x"' > auth_key

     2.   Create the Security Associations (on both endpoints):

          #   /sbin/ipsecadm   new   esp  -src  192.168.2.1  -dst
192.168.1.254              -forcetunnel -spi 1000 -enc 3des -auth
sha1              -keyfile enc_key -authkeyfile auth_key

          #   /sbin/ipsecadm  new  esp  -src  192.168.1.254  -dst
192.168.2.1              -forcetunnel -spi 1001 -enc  3des  -auth
sha1              -keyfile enc_key -authkeyfile auth_key

     3.    Create  the IPsec flows on machine A (the first is for
outbound
          flows, the latter is the ingress filter for the  incoming security
          association):

          #    ipsecadm    flow    -out   -require   -proto   esp
-src   192.168.1.254   -dst    192.168.2.1                  -addr
10.0.50.0/24 10.0.99.0/24
          #    ipsecadm    flow    -in    -require   -proto   esp
-src   192.168.1.254   -dst    192.168.2.1                  -addr
10.0.99.0/24 10.0.50.0/24

     4.   Create the matching IPsec flows on machine B:

          #    ipsecadm    flow    -out   -require   -proto   esp
-src   192.168.1.254   -dst    192.168.2.1                  -addr
10.0.50.0/24 10.0.99.0/24
          #    ipsecadm    flow    -in    -require   -proto   esp
-src   192.168.1.254   -dst    192.168.2.1                  -addr
10.0.99.0/24 10.0.50.0/24

     5.    Configure  the  firewall  rules on machine A using the
previously defined
 ruleset:

          GATEWAY_A = "192.168.1.254/32"
          GATEWAY_B = "192.168.2.1/32"
          NETWORK_A = "10.0.50.0/24"
          NETWORK_B = "10.0.99.0/24"

          (rest of ruleset)

     6.   Configure the firewall rules on  machine  B,  modifying
the definitions
          as appropriate:

          GATEWAY_B = "192.168.1.254/32"
          GATEWAY_A = "192.168.2.1/32"
          NETWORK_B = "10.0.50.0/24"
          NETWORK_A = "10.0.99.0/24"

          (rest of ruleset)

   Automated keying    [Toc]    [Back]
     To create a VPN between the same two C class networks as the
example
     above, using isakmpd(8):

     1.   Create /etc/isakmpd/isakmpd.conf for machine A:


          # Incoming phase 1 negotiations are multiplexed on  the
source IP
          #  address. Phase 1 is used to set up a protected channel just
          # between the two gateway  machines.  This  channel  is
then used for
          # the phase 2 negotiation traffic (i.e. encrypted & authenticated).

          [Phase 1]
          192.168.2.1=            peer-machineB

          # 'Phase 2' defines which connections the daemon should
establish.
          #  These connections contain the actual "IPsec VPN" information.

          [Phase 2]
          Connections=            VPN-A-B

          # ISAKMP phase 1 peers (from [Phase 1])

          [peer-machineB]
          Phase=                  1
          Transport=              udp
          Address=                192.168.2.1
          Configuration=          Default-main-mode
          Authentication=         yoursharedsecret

          # IPSEC phase 2 connections (from [Phase 2])

          [VPN-A-B]
          Phase=                  2
          ISAKMP-peer=            peer-machineB
          Configuration=          Default-quick-mode
          Local-ID=               machineA-internal-network
          Remote-ID=              machineB-internal-network

          # ID sections (as used in [VPN-A-B])

          [machineA-internal-network]
          ID-type=                IPV4_ADDR_SUBNET
          Network=                10.0.50.0
          Netmask=                255.255.255.0

          [machineB-internal-network]
          ID-type=                IPV4_ADDR_SUBNET
          Network=                10.0.99.0
          Netmask=                255.255.255.0

          # Main and Quick Mode descriptions (as  used  by  peers
and connections)

          [Default-main-mode]
          DOI=                    IPSEC
          EXCHANGE_TYPE=          ID_PROT
          Transforms=             3DES-SHA,BLF-SHA

          [Default-quick-mode]
          DOI=                    IPSEC
          EXCHANGE_TYPE=          QUICK_MODE
          Suites=                 QM-ESP-3DES-SHA-SUITE

     2.   Create /etc/isakmpd/isakmpd.conf for machine B:


          #  Incoming phase 1 negotiations are multiplexed on the
source IP
          # address. Phase 1 is used to set up a protected  channel just
          #  between  the  two  gateway machines. This channel is
then used for
          # the phase 2 negotiation traffic (i.e. encrypted & authenticated).

          [Phase 1]
          192.168.1.254=          peer-machineA

          # 'Phase 2' defines which connections the daemon should
establish.
          # These connections contain the actual "IPsec VPN"  information.

          [Phase 2]
          Connections=            VPN-B-A

          # ISAKMP phase 1 peers (from [Phase 1])

          [peer-machineA]
          Phase=                  1
          Transport=              udp
          Address=                192.168.1.254
          Configuration=          Default-main-mode
          Authentication=         yoursharedsecret

          # IPSEC phase 2 connections (from [Phase 2])

          [VPN-B-A]
          Phase=                  2
          ISAKMP-peer=            peer-machineA
          Configuration=          Default-quick-mode
          Local-ID=               machineB-internal-network
          Remote-ID=              machineA-internal-network

          # ID sections (as used in [VPN-A-B])

          [machineA-internal-network]
          ID-type=                IPV4_ADDR_SUBNET
          Network=                10.0.50.0
          Netmask=                255.255.255.0

          [machineB-internal-network]
          ID-type=                IPV4_ADDR_SUBNET
          Network=                10.0.99.0
          Netmask=                255.255.255.0

          #  Main  and  Quick Mode descriptions (as used by peers
and connections)

          [Default-main-mode]
          DOI=                    IPSEC
          EXCHANGE_TYPE=          ID_PROT
          Transforms=             3DES-SHA,BLF-SHA

          [Default-quick-mode]
          DOI=                    IPSEC
          EXCHANGE_TYPE=          QUICK_MODE
          Suites=                 QM-ESP-3DES-SHA-SUITE

     3.   Read through the configuration one more time.  The only
real differences
 between the two files in this example are the IPaddresses,
          and ordering of Local- and Remote-ID for  the  VPN  itself.  Note that
          the  shared  secret (the Authentication tag) must match
between machineA
 and machineB.

          Due to the shared secret information in the  configuration file, it
          must  be  installed without any permissions for "group"
or "other".

                # chmod og-rwx /etc/isakmpd/isakmpd.conf

     4.   Create a simple  /etc/isakmpd/isakmpd.policy  file  for
machineA:

                Keynote-version: 2
                Authorizer: "POLICY"
                Conditions: app_domain == "IPsec policy" &&
                            esp_present == "yes" &&
                            esp_enc_alg != "null" -> "true";

     5.    Create  a  simple /etc/isakmpd/isakmpd.policy file for
machineB:

                Keynote-version: 2
                Authorizer: "POLICY"
                Conditions: app_domain == "IPsec policy" &&
                            esp_present == "yes" &&
                            esp_enc_alg != "null" -> "true";

     6.   Configure the firewall rules on machines A and B:

          Use the same ruleset as the manual keying example,  but
add permission
  for  the  isakmpd(8) control traffic, on UDP port
500.

          For machineA, add:

          # Permit ISAKMPD control traffic between A and B
          pass   in   proto   udp    from    192.168.2.1/32    to
193.127.1.254/32 port = 500
          pass   out   proto   udp   from   192.168.1.254/32   to
193.127.2.1/32 port = 500

          For machineB, add:

          # Permit ISAKMPD control traffic between A and B
          pass   in   proto   udp   from   192.168.1.254/32    to
193.127.2.1/32 port = 500
          pass    out    proto   udp   from   192.168.2.1/32   to
193.127.1.254/32 port = 500

     7.   Start isakmpd(8)

          On both machines, run:

                # /sbin/isakmpd

          To run with verbose debugging  enabled,  instead  start
with:

                # /sbin/isakmpd -d -DA=99

SEE ALSO    [Toc]    [Back]

      
      
     openssl(1), enc(4), ipsec(4), keynote(4), options(4), isakmpd.conf(5),
     isakmpd.policy(5),  pf.conf(5),   ipsecadm(8),   isakmpd(8),
pfctl(8),
     sysctl(8)

BUGS    [Toc]    [Back]

     In  situations  where  the  gateway IPs are outside the tunnelled network
     range, such as when tunnelling private (RFC  1918)  networks
over the Internet,
 isakmpd(8) or manual keying must be used.

OpenBSD      3.6                         February     9,     1999
[ Back ]
 Similar pages
Name OS Title
dhcp OpenBSD configuring OpenBSD for DHCP
calcomp Tru64 Configuring a CalComp graphics tablet
tablet Tru64 Configuring a CalComp graphics tablet
IL IRIX configuring the ImageVision Library runtime environment
IFL IRIX configuring the Image Format Library runtime environment
opieaccess FreeBSD OPIE database of trusted networks
fingerd Tru64 The user information server for networks
rhost IRIX set the attributes of remote hosts and networks.
endnetent Tru64 Open, rewind, or close the networks file
setnetent Tru64 Open, rewind, or close the networks file
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service