Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Jun 2006 23:09:39 -0500
From:      David DeSimone <fox@verio.net>
To:        freebsd-net@freebsd.org
Subject:   Re: VPN with FAST_IPSEC and ipsec tools
Message-ID:  <20060626040939.GA25367@verio.net>
In-Reply-To: <449F52AA.8080504@thebeastie.org>
References:  <449228FA.50303@thebeastie.org> <20060616122855.GA29279@uk.tiscali.com> <20060616154306.GA18578@verio.net> <449B5D50.8000700@thebeastie.org> <20060623062221.GA23272@verio.net> <449F52AA.8080504@thebeastie.org>

next in thread | previous in thread | raw e-mail | index | archive | help
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Michael Vince <mv@thebeastie.org> wrote:
>
> After reloading ipsec and racoon I tried to do a traceroute from a
> client behind the local gateway to a client behind the remote gateway,
> it went off and did a typical traceroute through the gateway out over
> the Internet like a regular traceroute, completely being missed by the
> kernel/ipsec rules, nothing stopped it or tried to tunnel it or
> trigger racoon IKE activity.

I didn't really include a section on troubleshooting, so I suppose I
could mention some things about that.

Traceroute is a very helpful tool.  As you noticed, the traceroute
proceeded out to the Internet, whereas in a normal tunnel you should
never see the internet at all, it should proceed from one hop being the
near gateway, to the next hop being the far gateway.  What this
indicates is that your SA definition is not triggering.

To be more specific, your SPD does not match the output traffic and
trigger the creation of a SAD.

You can examine these with "setkey -D" (for SA's) or "setkey -DP" (for
SPD's).

When you run "setkey -DP" you should see an outbound definition
containing your source network, followed by the destination, like so:

    192.168.1.0/24[any] 192.168.11.0/24[any] any
        out ipsec
        esp/tunnel/1.2.3.4-5.6.7.8/unique#16756
        created: Jun 23 16:12:51 2006  lastused: Jun 23 16:12:51 2006
        lifetime: 0(s) validtime: 0(s)
        spid=16851 seq=5 pid=89388
        refcnt=1

This is a SPD declaring that if traffic sourced from 192.168.1.0/24 ever
tries to route to 192.168.11.0/24, traveling in an outbound direction,
then it will trigger the creation of a SAD (though I usually just call
it SA).

The SA will be in tunnel mode, using esp, with 1.2.3.4 as the source
gateway (here) and 5.6.7.8 as the destination gateway (there).  The
keyword "unique" specifies that no other existing SA's will be
leveraged, or "piggybacked," a real unique SA specifying only these two
subnets must be negotiated.

That is just an explanation for what the descriptor says.  You must
validate:  Is this true for your network?  Is the network 192.168.1.0/24
really located behind gateway 1.2.3.4, and is 192.168.11.0/24 behind
5.6.7.8?  Just a quick sanity check, you must be certain you've set it
up right.

If your traffic routes right past this SPD without being matched, it
makes me wonder:  Is the traffic being NAT'd before it has a chance to
be matched by the kernel?  I am using PF on FreeBSD 6.0, and in my setup
I did not have to add any special "no nat" rules in order to make this
work.  However, if you use some other method of NAT, there may be some
interference.

> I tried putting 'require' in my ipsec rules, didn't change anything.

Yes, as I mentioned, 'require' is just a less-strict form of 'unique'. 
You can get things working well with 'require' but you will find
interoperational problems with other gateways (like Cisco) that expect
unique SA's to be negotiated.

> Did you have any special routes to tell the ipsec/kernel to start
> encrypting the traffic?

It is not completely clear to me at what "stage" of traffic handling
IPSEC is matched.  Is the packet matched as soon as it heads inbound? 
Before the routing table check?  After the routing table?  When it tries
to flow outbound?  The "-P out" seems to imply that it would be checked
at that stage... and if so, that means your NAT must not be applied
until then.

My typical NAT rule looks like this:

    nat on $EXT from $INT:network to any -> $EXTIP

This causes NAT to be applied when the packet has already been routed
and is about to leave through the external interface.  However, if you
had a different rule:

    nat on $INT to any -> $EXTIP

This is a pathological example, but if you used this example, I wonder
if it would apply NAT too soon and prevent the packet from being matched?

> Are you using FAST_IPSEC or the other IPsec?  If so I will have to
> change.  Which version of FreeBSD are you using?

Hmm...  In examining my kernel configuration I found these options:

    options     IPSEC
    options     IPSEC_ESP
    options     IPSEC_DEBUG
    # options   IPSEC_FILTERGIF
    # options   FAST_IPSEC

So it appears that I am NOT using FAST_IPSEC.  For some reason I thought
that I was, but now I see I was mistaken.  I wonder if someone can
explain the difference between the two?

- -- 
David DeSimone == Network Admin == fox@verio.net
  "It took me fifteen years to discover that I had no
   talent for writing, but I couldn't give it up because
   by that time I was too famous.  -- Robert Benchley
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFEn14DFSrKRjX5eCoRAlXFAJ0d2Mw4FynFEAudHtjhlN+Gdgu2fgCgohU0
zGALTWBULzzRjDhTDJrw4IM=
=K/j5
-----END PGP SIGNATURE-----



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060626040939.GA25367>