L2TP Over IPSec On Ubuntu(Debian,CentOS) With OpenSwan

Ubuntu 10.04 LTS(Lucid)自带的OpenSwan有NAT的BUG。10.10 openswan无此问题(但是10.10的xl2tpd有问题,不分配IP,需要手动指定,解决方案见下文,本文都是指使用Ubuntu 10.04 LTS)可以从OpenSWAN下载最新版本(2.6.24+)才可以。也可以使用非官方PPA源

[bash]sudo apt-get install python-software-properties
sudo add-apt-repository ppa:openswan/ppa
sudo apt-get update[/bash]

查查看是否是已经跟更新到最新

[bash]apt-cache policy openswan
openswan:
已安装:(无)
候选软件包:1:2.6.31-1xelerance1
版本列表:
1:2.6.31-1xelerance1 0
500 http://ppa.launchpad.net/openswan/ppa/ubuntu/ lucid/main Packages
1:2.6.23+dfsg-1ubuntu1 0
500 http://cn.archive.ubuntu.com/ubuntu/ lucid/universe Packages
100 /var/lib/dpkg/status
[/bash]

可见源里面已经获得2.6.31+的版本
apt-get install openswan就可以可以开始配置了
安装的时候一律回车即可


配置系统sysctl和iptables参数

[bash]for devs in /proc/sys/net/ipv4/conf/*
do
echo 0 > $devs/accept_redirects
echo 0 > $devs/send_redirects
done[/bash]

可以把这个加入rc.local
我测试下来好像写道sysctrl没用。因为/proc/sys/net/ipv4/conf/有好多接口。sysctrl只能写all,其他写不了
iptables开NAT和ipV4转发不说了


配置IPSec参数
vim打开/etc/ipsec.conf,dG删除所有内容,然后insert模式写入如下配置

[bash]version 2.0
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey

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

conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=服务器IP
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
[/bash]

编制预共享密钥

[bash]nano /etc/ipsec.secrets
[/bash]

#
服务器IP %any: PSK "test"

这里的test就是预共享密钥
%any可以换成其他指定的IP地址达到限制拨入或者不同IP使用不同密钥的目的
目标IP地址为0.0.0.0时也表示接受任何IP地址
比如

#
服务器IP %any: PSK "test"
服务器IP 123.111.111.111: PSK "anotherKEY"

[bash]ipsec verify
service ipsec restart[/bash]

可以使用预共享密钥进行一次尝试连接。

[bash]cat /var/log/auth.log |grep 'IPsec SA established transport mode'
[/bash]

就表示IPSec部分OK了


配置L2TP 部分

[bash]apt-get install xl2tpd ppp
vim /etc/xl2tpd/xl2tpd.conf
#dG删除所有内容,粘贴如下配置
[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.255
local ip = 10.1.2.1
;require chap = yes
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
[/bash]

vim /etc/ppp/options.xl2tpd(不存在则创建) dG删除所有内容

[bash]require-mschap-v2
ms-dns 8.8.8.8
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
[/bash]

然后

[bash]sudo /etc/init.d/xl2tpd restart[/bash]

编辑/etc/ppp/chap-secrets进行帐户创建
例如

test l2tpd tesd *

格式和pptp一样,参见http://ihipop.info/2010/06/1265.html#chap-secrets

使用预共享密钥进行连接测试试试


参考:http://riobard.com/blog/2010-04-30-l2tp-over-ipsec-ubuntu/


补遗:

1.Maverick中xl2tpd的问题

如果你使用最新的发行版本 Ubuntu 10.10 Maverick Meerkat,openswan的BUG被修复了,但是使用xl2tpd又会有问题了
一开始我用我的Android拨号。没有详细的错误代码,后来在XP上面测试下才发现问题原因,因为不分配IP.
我在ppp认证的/etc/ppp/chap-secrets里面指定一个IP就OK了。起初怀疑是ppp和openswan的问题折腾半天搞不好,后来看
看log是这样的提示:

[bash]tail -200 /var/log/daemon.log |grep l2tp[/bash]

[text]Dec 7 21:05:33 ihipop-Lenovo xl2tpd[2577]: control_finish: Peer requested tunnel 50272 twice, ignoring second one.
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: Connection established to 172.16.156.238, 51492. Local: 23884, Remote: 50272 (ref=0/0). LNS session is 'default'
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: start_pppd: I'm running:
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "/usr/sbin/pppd"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "passive"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "nodetach"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "10.1.2.1:0.0.0.0"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "refuse-pap"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "refuse-chap"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "auth"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "debug"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "file"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "/etc/ppp/options.xl2tpd"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: "/dev/pts/1"
Dec 7 21:05:34 ihipop-Lenovo xl2tpd[2577]: Call established with 172.16.156.238, Local: 16744, Remote: 38184, Serial: -2060201465
Dec 7 21:05:44 ihipop-Lenovo xl2tpd[2577]: result_code_avp: avp is incorrect size. 8 < 10
Dec 7 21:05:44 ihipop-Lenovo xl2tpd[2577]: handle_avps: Bad exit status handling attribute 1 (Result Code) on mandatory packet.
Dec 7 21:05:44 ihipop-Lenovo xl2tpd[2577]: Terminating pppd: sending TERM signal to pid 2629
Dec 7 21:05:44 ihipop-Lenovo xl2tpd[2577]: pppd 2629 successfully terminated
Dec 7 21:05:44 ihipop-Lenovo xl2tpd[2577]: Connection 50272 closed to 172.16.156.238, port 51492 (Result Code: expected at least 10, got 8)
Dec 7 21:05:49 ihipop-Lenovo xl2tpd[2577]: Unable to deliver closing message for tunnel 23884. Destroying anyway.[/text]

看PPP的日志

[bash]tail -120 /var/log/messages |grep ppp[/bash]

[text]Dec 7 21:06:35 ihipop-Lenovo pppd[2758]: pppd 2.4.5 started by root, uid 0
Dec 7 21:06:35 ihipop-Lenovo pppd[2758]: Using interface ppp0
Dec 7 21:06:35 ihipop-Lenovo pppd[2758]: Connect: ppp0 &lt;--&gt; /dev/pts/1
Dec 7 21:06:37 ihipop-Lenovo pppd[2758]: Deflate (15) compression enabled
Dec 7 21:06:42 ihipop-Lenovo pppd[2758]: Could not determine remote IP address: defaulting to 10.64.64.64
Dec 7 21:06:42 ihipop-Lenovo pppd[2758]: local IP address 10.1.2.1
Dec 7 21:06:42 ihipop-Lenovo pppd[2758]: remote IP address 10.64.64.64
Dec 7 21:06:43 ihipop-Lenovo pppd[2758]: IPCP terminated by peer (Could not determine local IP address)
Dec 7 21:06:43 ihipop-Lenovo pppd[2758]: Connect time 0.1 minutes.
Dec 7 21:06:43 ihipop-Lenovo pppd[2758]: Sent 0 bytes, received 40 bytes.
Dec 7 21:06:44 ihipop-Lenovo pppd[2758]: LCP terminated by peer (No network protocols running)
Dec 7 21:06:45 ihipop-Lenovo pppd[2758]: Terminating on signal 15
Dec 7 21:06:45 ihipop-Lenovo pppd[2758]: Modem hangup
Dec 7 21:06:45 ihipop-Lenovo pppd[2758]: Connection terminated.
Dec 7 21:06:45 ihipop-Lenovo pppd[2758]: Connect time 0.1 minutes.
Dec 7 21:06:45 ihipop-Lenovo pppd[2758]: Sent 4 bytes, received 40 bytes.
Dec 7 21:06:46 ihipop-Lenovo pppd[2758]: Exit.[/text]

看,是0.0.0.0,IP没了,而PPP日志里面是remote IP address 10.64.64.64。怀疑是xl2tp的问题。果断降级到10.04 lucid源里面的xl2tpd。问题立马解决。

这个教训告诉我们,软件不是越新越好。偶数版本不一定比奇数版本好。

当然也有可能是新版地址池配置语法变了。这个下次再研究。

2.完美安全传送(PFS:Perfect Forward Secrecy)

“完美安全传送”提供特佳的安全。当你启用了PFS,你的敌人(黑客、竞争者等)就不能破解通过IPsec连接传送的数据包,就是他们可以监听加密后的连接并且他们拥有你的密钥(通过黑客、法院指令、第三者等)也不可以。PFS的这个属性就是著名的“阻止第三者”(escrow- foilage)。

虽然Openswan默认是启用PFS的,但是我们在配置文件里面把它关闭了。因为配置文件里面有这样一行

pfs=no

因为苹果和微软的L2TP/IPsec客户没有启用PFS,需要编辑注册表。至于为什么没有启用。有人说是因为要为将来国家特工考虑。因为太安全了。国家害怕不受自己控制的东西(老美原话)。
幸运的是,如果客户端支持并且在连接时候启用了PFS,即使在openswan中禁用了PFS,连接的时候也会使用PFS连接。

3.关于L2TP认证和ACL

IPsec支持通过“预共享密钥”和证书方式进行认证。PPP也提供了认证,比如通过口令。生产出来的L2TP也支持认证。问题是,在 Windows/Mac的L2TP客户中,你不能在任何地方指定这些口令。可能没有哪个厂商认为L2TP认证是必要的。并且正因为如此,它看起不是那么有用。对于任何人来说,IPsec和PPP认证应该足够了。
在l2tpd.conf中,require authentication参数容易引起误会。这个参数在启用L2TP认证后没有任何作用。它实际上PPP认证(也就是PAP/CHAP)。Windows客户端会默认这样使用,因此你需要在l2tpd.conf配置文件中包含 require authentication来启用PPP认证。
在另一方面,指定参数auth file和challenge后,可以启用L2TP认证。但就像上边说的那样,一般情况不需要L2TP认证。

L2TP也可以根据IP地址进行访问控制
例如:
l2tpd访问限制为一个IP地址为1.1.1.1的客户连接,conf中设定

[global]
access control = yes
[lns default]
lac = 1.1.1.1

4.PPP认证、压缩和加密

PPP有几种认证方法。最常用的是PAP(不加密口令)和CHAP(基于认证的挑战/回应)。你可以自由地选择两者,最好是CHAP。如果你用PAP,Windows客户会提示口令没有加密。(可以在设置里面去掉要求数据加密的选项)

使用不同加密方式,口令文件相应指定为/etc/ppp/chap-secrets或者 /etc/ppp/pap-secrets(分别对应于PAP Or CHAP/MS-CHAP)

5.proxyarp参数

这个参数将在内网接口(示例中的eth1)为远程用户打开一个代理ARP入口。如果这个关键字没有指定,Windows客户端发出的数据包将到达内网服务器,但这些服务器不知道向哪儿发出回应,因为没有人回答它的ARP请求。用 proxyarp参数,内网机器被到远程Windows客户到网关发送进来的数据包欺骗。网关让IP继续向前,因此它知道如何发送数据到Windows客户端。

6.手动编译OpenSwan

由于部分debian上面的OpenSwan有各种问题,比如有的人反应OpenSwan的2.6.26和xl2tpd存在严重兼容性 bug,有人反应Debian lenny自带的OpenSwan版本有Bug会导致用户连接不上等。有人建议在Debian5.0上就使用2.6.24版本。我觉得没有必要墨守成规,于是就使用最新版好了。
到OpenSwan的网站上面看了一下,最新版本是2.6.32(测试下来与debian lenny里面的xl2tpd-1.2.0工作良好)
安装依赖和工具:
deb系列
[bash]apt-get install libgmp3-dev bison flex[/bash]
RPM系列
[bash]yum install gmp-devel bison flex[/bash]
编译
[bash]cd /usr/src
wget http://www.openswan.org/download/openswan-2.6.32.tar.gz
tar zxvf openswan-*
cd openswan-*
make programs install[/bash]
后面的事情不说了,非常简单,配置文件和方法是一样的。

Author Info :
  • From:L2TP Over IPSec On Ubuntu(Debian,CentOS) With OpenSwan
  • URL:https://blog.ihipop.com/2010/12/1906.html
  • Please Reserve This Link,Thanks!
  • 《L2TP Over IPSec On Ubuntu(Debian,CentOS) With OpenSwan》上有11条评论

    1. 我把openswan降级到2.6.24后仍然PSK无法使用,提示
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): WARNING: enc alg=0 not found in constants.c:oakley_enc_names
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): Activating : Ok (ret=0)
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): WARNING: enc alg=0 not found in constants.c:oakley_enc_names
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_add(): ERROR: Algorithm already exists
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): Activating : FAILED (ret=-17)
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): WARNING: enc alg=0 not found in constants.c:oakley_enc_names
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_add(): ERROR: Algorithm already exists
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): Activating : FAILED (ret=-17)
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): WARNING: enc alg=0 not found in constants.c:oakley_enc_names
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_add(): ERROR: Algorithm already exists
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): Activating : FAILED (ret=-17)
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): WARNING: enc alg=0 not found in constants.c:oakley_enc_names
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_add(): ERROR: Algorithm already exists
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): Activating : FAILED (ret=-17)
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): WARNING: enc alg=0 not found in constants.c:oakley_enc_names
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_add(): ERROR: Algorithm already exists
      Jul 8 16:34:48 s2 pluto[17844]: ike_alg_register_enc(): Activating : FAILED (ret=-17)

    2. 博主,您好,我现在遇到一个问题,就是在连接的时候PSK无论输入什么都可以连接成功,不输也可以的,不知道哪里有问题,配置应该是没问题的,我看到日志里面有下面两条提示,我觉得是在PSK进行加密或者解密的模块没有安装,不知道该如何下手了,请给些提示。
      Jul 8 11:24:02 s2 pluto[5380]: ike_alg_add(): ERROR: Algorithm already exists
      Jul 8 11:24:02 s2 pluto[5380]: ike_alg_register_enc(): Activating aes_gcm_16: FAILED (ret=-17)

    3. 降级到10.04 lucid源里面的xl2tpd
      大哥,这个如何降,我现在的问题是第一次连没问题,断了,第二次就连不上去了,重启又可以了,我用的方法是您说得那个,指定了一个ip。

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用*标注