Ubuntu 10.04 LTS(Lucid)自带的OpenSwan有NAT的BUG。10.10 openswan无此问题(但是10.10的xl2tpd有问题,不分配IP,需要手动指定,解决方案见下文,本文都是指使用Ubuntu 10.04 LTS)可以从OpenSWAN下载最新版本(2.6.24+)才可以。也可以使用非官方PPA源
1 2 3 |
sudo apt-get install python-software-properties sudo add-apt-repository ppa:openswan/ppa sudo apt-get update |
查查看是否是已经跟更新到最新
1 2 3 4 5 6 7 8 9 10 |
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 |
可见源里面已经获得2.6.31+的版本
apt-get install openswan就可以可以开始配置了
安装的时候一律回车即可
配置系统sysctl和iptables参数
1 2 3 4 5 |
for devs in /proc/sys/net/ipv4/conf/* do echo 0 > $devs/accept_redirects echo 0 > $devs/send_redirects done |
可以把这个加入rc.local
我测试下来好像写道sysctrl没用。因为/proc/sys/net/ipv4/conf/有好多接口。sysctrl只能写all,其他写不了
iptables开NAT和ipV4转发不说了
配置IPSec参数
vim打开/etc/ipsec.conf,dG删除所有内容,然后insert模式写入如下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 |
编制预共享密钥
1 |
nano /etc/ipsec.secrets |
#
服务器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"
1 2 |
ipsec verify service ipsec restart |
可以使用预共享密钥进行一次尝试连接。
1 |
cat /var/log/auth.log |grep 'IPsec SA established transport mode' |
就表示IPSec部分OK了
配置L2TP 部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 |
vim /etc/ppp/options.xl2tpd(不存在则创建) dG删除所有内容
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
然后
1 |
sudo /etc/init.d/xl2tpd restart |
编辑/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是这样的提示:
1 |
tail -200 /var/log/daemon.log |grep l2tp |
[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
Dec 7 21:05:49 ihipop-Lenovo xl2tpd[2577]: Unable to deliver closing message for tunnel 23884. Destroying anyway.[/text]
看PPP的日志
1 |
tail -120 /var/log/messages |grep ppp |
[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 <--> /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系列
1 |
apt-get install libgmp3-dev bison flex |
RPM系列
1 |
yum install gmp-devel bison flex |
编译
1 2 3 4 5 |
cd /usr/src wget http://www.openswan.org/download/openswan-2.6.32.tar.gz tar zxvf openswan-* cd openswan-* make programs install |
后面的事情不说了,非常简单,配置文件和方法是一样的。
真是笑死人,误人子弟,测试下mac os 就知道为什么叫你不要用openswan2.6.25+了。
啥意思?谁叫我不要用?
@liva
客户端是Linux还是Windows?以前是不是打过关闭IPsec的注册表补丁?
我把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)
博主,您好,我现在遇到一个问题,就是在连接的时候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)
@RuGao.biz 最笨的办法 卸载源里面的l2tp,然后到package.Ubuntu.com搜索到
10.04的l2tp程序手动按装之,最后用dpk设置xl2tp的包状态为hold,不升级即可
降级到10.04 lucid源里面的xl2tpd
大哥,这个如何降,我现在的问题是第一次连没问题,断了,第二次就连不上去了,重启又可以了,我用的方法是您说得那个,指定了一个ip。