debian linux 配置ipsec l2tp PSK

PSK=windows中说的预共享密钥

折腾了一天多,总结一下。一个字:日!

pptp的配置比较简单,三两个就折腾出来了。l2tp配置文章较少,大都说得很轻松的样子。实际上如果环境顺利,也不需要折腾这么久,只是。。。。。

先说下总结出来的步骤:(实验环境debian 192.168.163.133  xp 192.168.1.200 都在vm里)

编辑 /etc/sysctl.conf 启用 ipv4 forward.  
sysctl –p 应用

安装组件
apt-get install pptpd l2tpd openswan ipsec-tools

修改 /etc/ipsec.secrets,设置PSK。
192.168.163.133  %any: PSK “12345678″

修改 ipsec.conf

Copy /etc/ipsec.d/examples/l2tp-psk.conf 的两个conn段配置

修改:

gateway
….
rightprotoport=17/%any

修改/etc/xl2tp/xl2tp.conf

[global]
port = 1701
[lns default]
ip range = 192.168.254.20-192.168.254.255
local ip = 192.168.254.2
require chap = yes
refuse pap = yes
require authentication = yes
name = pandora
pppoptfile = /etc/ppp/options.l2tpd.lns
flow bit = yes

创建 /etc/ppp/options.l2tpd.lns

ms-dns 8.8.8.8
ms-dns 208.67.222.222

重启服务。以上实际上就是顺利情况下要做的事情了。

但我折腾了一天多!因为….

rightprotoport=17/%any这一句,默认是rightprotoport=17/0

此时会出错,啥也连不上,改成%any,折腾了好久想到要改这里,改成%any,还是不行,改成17/1701,好,终于行了。

换到正式环境,还是不行。最终tcpdump发现,写成17/1701,则只有公网IP才能连上服务器!

准确的说,也不是公网IP,而是服务器的包要发回到源IP的1701端口,发得通才能连上。所以实验环境的两相同子网虚拟机可连。

正式环境里用公网IP不用家里路由器拨号可连。但在内网就不可连。所以写成17/1701是太不好用了。但写成%any或0都不可以。

实验环境的debian和正式环境的ubuntu都验证了这一现象。

改了配置查了错误数据,是这样的提示:

control_finish: Peer requested tunnel 56 twice, ignoring second one.

搜一下这个错误,网上有很多难兄难弟,但基本都没个结论。比如这位仁兄:http://bbs.chinaunix.net/viewthread.php?action=printable&tid=1422551

为什么?不得不怀疑是BUG!apt-get remove  openswan。下载最终版编译安装。17/%any好了。也就是说:

debian和unbuntu的openswan 2.6.23+dfsg-1 有严重bug, rightprotoport=17/0和rightprotoport=17/%any不能用!

 绝大多数时间就耗在斗争这个问题了。而且换成最新版的openswan 2.6.25之后,rightprotoport=17/0还是不能工作!只是17/%any可以了。

中间还出现过别的问题 ,在配置 /etc/ppp/options.l2tpd.lns 时,win7突然连不上服务器了,XP可以。怎么配来配去甚至配回去都不行。无耐重启WIN7,还是不行。再重启了服务,终于行了。看来这个鬼服务一点鲁棒性也没有。

不过,即使是最终配到现在,也还是有一个问题没有解决。那就是,同一个内网里,只有一个设备可以连接。WIN7上去了,XP就上不去了,反之同样。还好我的目的是给手机用,此问题暂时忽略。不过还是很不爽,这意味着在公司,我不能把这个设置告诉别人了,因为大家在同一内网,别人一连L2tp,我就连不了了。只能让别人连pptp。如果有哪位知晓,请回复告之。

todo:view this.

在linux下,更新域内的主机名/IP映射关系

域内,windows的机器可以通过 ping直接获得IP地址。

比如,ping computerA 可以得到机器名为computerA的IP地址。

linux机器如果在域内动态分配IP地址,那么,如何根据其主机名,取得其IP地址呢?

一般情况下,配好了 hostname为xxx.test.com 的机器是自然可以这样得到IP地址的。

但如果不行的话,就有两种方案:

A. 通过nsupdate来使域内的DNS服务器更新自己的IP。

$ nsupdate
> update add xxx.test.com 9999 A 192.168.1.20
>
>quit

B. 注册自己在 WINS服务器上的名字。

这一项还没有找到现成程序,可能要自己编程解决。也许有吧,谁知道的留 言告诉我。

编程不麻烦,假设linux的IP是192.168.1.4 ,找一台windows,设IP为192.168.1.10

在linux上面运行命令

tcpdump -X -s 300 “src host 192.168.1.10″

然后在 win上,把wins服务器设为 192.168.1.4

这样,win就会去linux注册自己,看到相应的二进制包,仿照着就可以开始开发了。

当然要开发,光有二进制包还不行,可以参照着 rfc1002 先把包弄懂。rfc1001也可先看看。

弄懂后,写个程序就易于反掌了!

 

顺便说一下,在dns上注册名字后,windows 可能还不能马上ping到,ping会报告找不到名字。这是因为windows有缓存。可以用下面这条命令手动清掉windows的DNS缓存(DNS Cache)。

ipconfig /flushdns

 

 

debian 修复记

家里用来装debian的电脑是一台很老的电脑,老到它有一个毛病,就是硬盘经常掉线。以前用windows是这样,现在拿它改装linux,当然,也是这样了。这不,掉了几次,debian坏了。

首先是修复文件系统,用光盘rescue启动,fsck.ext3 /dev/hda4,修复了一下,报了很多错,坏了一堆文件。

进去后又发现dpkg坏了,使得apt-get ,apt-cache等无法用,报 /var/lib/dpkg/status 错。网上找了下这个错,还真是一堆一堆的,有的人说用status-old复制回去,但不幸,这个文件一起坏了。

用recover, repair等找了一下,最终装于找到一个能修得的bash文件:

http://tuxx-home.at/projects/restore-dpkg-status.sh

运行后会在tmp目录生成个新的status文件,换回去。

OK,然后又说 /var/lib/dpkg/available 坏了。靠,找了一下,这回好像没有修复的脚本了,找到一个说这样可以修复的:

dpkg –clear-avail
apt-get update

运行了一下,第一句把available 这个文件清空了,update完,还是0字节,被骗了,靠。

不过发现清空了之后,apt-get是可以用了。但是它也以为我装的很多包是没有装的状态。

只好再慢慢装回去了,反正是覆盖安装,不会多占空间。

比如运行apt-get install openssh-server

它就以为我没有装这个openssh,帮我重新装一下,这样处理了很多个包,后面还要慢慢处理一堆。碰到再说了。

最后查了一下,结合一直以来观察到的现象,感觉这台破电脑硬盘掉线的原因是电源问题,可能当电源带不动的时候硬件就歇菜了。过几天整个新电源试试。