2012年1月20日星期五

VPN故障排除

在Linux上配置了L2TP/IPSec,用 Android手机连上去,不能访问因特网。后来想到服务器内核的ip_forward没有打开,这样手机的请求在ppp0上可以看到,但是内核不会转发 给默认网关网卡。开了后,在服务器的默认网关网卡上可捕捉到手机对Internet的访问,但是收不到回复包。连DNS都不通,先搞定这个。

直接在服务器上查询dig @8.8.8.8 ebay.com是成功的:
11:11:26.994869 IP 10.146.18.213.50984 > 8.8.8.8.domain: 17471+ A? ebay.com. (26)
11:11:26.997250 IP 8.8.8.8.domain > 10.146.18.213.50984: 17471 4/0/0 A 66.135.205.13, A 66.135.205.14, A 66.211.160.87, A 66.211.160.88 (90)
该包的源地址10.146.18.213eth0的inet地址。而手机上的DNS查询,在服务器eth0抓的包如下:
11:16:11.133115 IP 192.168.1.128.58100 > 8.8.8.8.domain: 57041+ A? www.ebay.com. (30) 
eth0上出发的包,地址却是VPN上客户端的地址192.168.1.128,这应该是失败的原因,这样的包到都到不了DNS服务器(内核会丢弃吗?)。

后来才想到要做SNAT的,要让VPN用户访问外网这是必须的一步:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.146.18.213
以后一定要记得了。虽然忘记了这一步,但是通过冷静分析,通过抓包搞清了问题的原因。

2012年1月7日星期六

自挖陷阱

刚刚进去AWS EC2,执行了个sudo命令竟然没有要密码。visudo一看sudoers文件最后写着:
ec2-user ALL = NOPASSWD: ALL
默认用户sudo不用密码太危险了,立刻改成了
ec2-user ALL = (ALL): ALL
这样sudo需要密码。然后就傻了。默认用户ec2-user的密码我不知道,不能sudo,也不能改密码,root密码更不知道了。

这云端系统也不能像常规系统一样设置init=/bin/bash的内核参数启动到单用户,也不能用LiveCD解决。网上搜了一下试图找到默认密码无果,最简单的办法就是停用这个EC2实例再新建一个。小小弄一下,没想到给自己挖了个大陷阱。