Support for IPSec VPN's: some patches for netipsec/key.c

Andreas Longwitz longwitz at incore.de
Wed Sep 5 15:47:23 UTC 2012


Hi,

>> The following patches are all for netipsec/key.c:
>>
>> I use parameter "generate_policy on" in racoon.conf. This works for
>> clients with NAT-T, but direct connected clients need the following
>> patch (likewise in ipsec-tools/roadwarrior/client/phase1-up.sh):
>>
>> @@ -1927,19 +1930,27 @@
>>  #if 1
>>         if (newsp->req && newsp->req->saidx.src.sa.sa_family) {
>>               struct sockaddr *sa;
>> +             uint16_t *pport;
>>               sa = (struct sockaddr *)(src0 + 1);
>>               if (sa->sa_family != newsp->req->saidx.src.sa.sa_family) {
>>                       _key_delsp(newsp);
>>                       return key_senderror(so, m, EINVAL);
>>               }
>> +             pport = (uint16_t *)newsp->req->saidx.src.sa.sa_data;
>> +             if ( *pport == htons(500) ) /* UDP_ENCAP_ESPINUDP_PORT */
>> +                *pport = 0;
>>         }
>>         if (newsp->req && newsp->req->saidx.dst.sa.sa_family) {
>>               struct sockaddr *sa;
>> +             uint16_t *pport;
>>               sa = (struct sockaddr *)(dst0 + 1);
>>               if (sa->sa_family != newsp->req->saidx.dst.sa.sa_family) {
>>                       _key_delsp(newsp);
>>                       return key_senderror(so, m, EINVAL);
>>               }
>> +             pport = (uint16_t *)newsp->req->saidx.dst.sa.sa_data;
>> +             if ( *pport == htons(500) ) /* UDP_ENCAP_ESPINUDP_PORT */
>> +                *pport = 0;
>>         }
>>  #endif
> 
> I'm not sure it will happen in real life configurations, but if
> someones does really want to setup a SP entry for port 500 (tunnel
> mode, or anything else which may need that), your patch will prevent
> it from working.

Yes, I agree.

> It may be cleaner to have racoon generate the good SP entry, rather
> than kernel trying to guess what is right in a SPDADD command.

The SPDADD command is done by racoon because I have generate_policy on,
but racoon sets ports to 500 for direct connected clients. If this would
be fixed in racoon, then the above kernel patch is superfluous.


>> The last patch makes it possible for a transport mode client to open a
>> new connection to the server immediately after closing an old
>> connection. Without this patch the client must wait for the routers to
>> forget all there NAT entries.
>>
>> @@ -4065,10 +4084,12 @@
>>           /*
>>            * If NAT-T is enabled, check ports for tunnel mode.
>>            * Do not check ports if they are set to zero in the SPD.
>> -          * Also do not do it for transport mode, as there is no
>> +          * Also do not do it for native transport mode, as there is no
>>            * port information available in the SP.
>>            */
>> -         if (saidx1->mode == IPSEC_MODE_TUNNEL &&
>> +         if ((saidx1->mode == IPSEC_MODE_TUNNEL ||
>> +             (saidx1->mode == IPSEC_MODE_TRANSPORT &&
>> +             saidx1->proto == IPPROTO_ESP)) &&
>>               saidx1->src.sa.sa_family == AF_INET &&
>>               saidx1->dst.sa.sa_family == AF_INET &&
>>               ((const struct sockaddr_in *)(&saidx1->src))->sin_port &&
> 
> Right, I'll commit it on HEAD ASAP.

Good news, thanks !


Andreas Longwitz



More information about the freebsd-net mailing list