Strongswan+L2TP配置

由于需要给VPN添加IKEv2,而OpenSwan对于IKEv2的支持只有最基本的部分,更重要的是OpenSwan没有像 Strongswan一样的EAP-RADIUS插件可以实现Stongswan和Freeradius之间的直接通信(IKEv2必须),所以将服务器 上面的OpenSwan换成了Strongswan。

平台是Debian Squeeze,Strongswan的软件包安装自Debian Squeeze Backports,其余的来自于Debian Stable。Debian Backports的作用是给稳定版本的Debian提供一些只有在Tesing/sid里面才有的新版本的软件包,而这些软件又是在stable的环境 下编译的,所以不用担心包依赖方面的问题。

从Backports安装软件的方法参照这里:http://backports-master.debian.org/Instructions/

Strongswan需要使用新版本的原因是Stable(Squeeze)里面的版本编译时没有–enable-nat-transport参数,这样的话Strongswan由于默认的安全特性(http://wiki.strongswan.org/projects/strongswan/wiki/FAQ)不允许进行NAT转发,从而无公网IP的客户端是无法与服务器建立连接的。

服务器结构依然是xl2tpd+swan,只是把OpenSwan换成了Strongswan。xl2tpd的配置跟上一篇 (/2011/04/577)是一样的,但是Strongswan的配置稍有不同,而错误信息又不是很 informative,花了几个小时才调试成功,所以写下来为后面的作参考。

几个常见的错误:

1. client.ip.address:4500 #8: NAT-Traversal: Transport mode disabled due to security concerns pluto[21315]: "l2tp"[3] client.ip.address:4500 #8: sending encrypted notification BAD_PROPOSAL_SYNTAX to client.ip.address:4500

这个是由于Strongswan没有编译`--enable-nat-transport`,因而无法进行NAT传输。

解决方法:重新编译,加上`--enable-nat-transport`。

2. pluto[30735]: packet from client.ip.address:500: initial Main Mode message received on server.ip.address:500 but no connection has been authorized with policy=PSK

这个一般来说是IPSec的secrets错误,但是我在确认Secrets无误的情况下也遇到了这个,[http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/](http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/)评论里面的某位仁兄也遇到了这个问题。在几番折腾无果的情况下注意到log里面有这么一行:

```
pluto[8384]: packet from client.ip.address:500: ignoring Vendor ID payload [IKE CGA version 1]
```

突然意识到Windows的L2TP使用的是IKEv1,而Strongswan默认使用的是IKEv2,会不会是这个问题?试之果然。

解决:在Strongswan的L2TP的配置段里面加上`keyexchange=ikev1`。

3. pluto[1243]: "L2TP-PSK-noNAT"[2] client.ip.address:4500 #1: cannot respond to IPsec SA request because no connection is known for server.ip.address:4500[server.ip.address]:17/1701...client.ip.address:4500[client.ip.nat.address]:17/%any===client.ip.nat.address/32 pluto[1243]: "L2TP-PSK-noNAT"[2] client.ip.address:4500 #1: sending encrypted notification INVALID_ID_INFORMATION to client.ip.address:4500

这个乍看之下也像是PSK的设置错误,实际上不是。问题出在`virtual_network`的设置上面。

解决:Strongswan的setup段里面加上`virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12`。

配置文件范例:

```
# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
# plutodebug=all
# crlcheckinterval=600
# strictcrlpolicy=yes
# cachecrls=yes
nat_traversal=yes
charonstart=yes
plutostart=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12

# Add connections here.

conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
keyexchange=ikev1
authby=secret
pfs=no
auto=add
rekey=no
type=tunnel
keyingtries=3
left=server.ip.address
leftnexthop=%defaultroute
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
```