2012年2月13日星期一

DHCP的问题

打开Windows下的CentOS虚拟机,ifup得不到DHCP地址了。CentOS是在VirtualBox里面用Bridge模式连网的,这种情况下虚拟机会和宿主机从同一个DHCPD(办公室路由器)获得地址。

DHCP超时失败前,屏幕上出现了ping几个地址失败的消息。在/etc目录下用grep没有找到这个地址,很奇怪。/etc/resolv.conf里面有两行nameserver,我把这两行删除后DHCP就成功了。

后来在/var/lib/dhclient/dhclient-eth1.leases里面找到了ping过的几个地址。这个文件里面有几个租约历史,有的还未过期。原来dhclient.conf(5)里面有解释:
The DHCP client may decide after some period of time (see PROTOCOL TIMING) that it is not going to succeed in contacting a server. At that time, it consults its own database of old leases and tests each one that has not yet timed out by pinging the listed router for that lease to see if that lease could work.
原来如果DHCP失败,dhclient会尝试曾经租约过但是还未过期的地址。不过只有在DHCP失败的情况下才会尝试,这也就是为什么是在出现ping的消息后ifup命令也马上回到了命令提示符。

本来我以为是resolv.conf中过期的内容导致DHCP失败,但后来却未能复现这样的判定,resolv.conf中加入错误的信息后DHCP还是可以成功的。那么,目前能得出的最可信的结论,就是办公室的无线路由器,或者Windows电脑正好出问题了,让CentOS虚拟机没能获得地址。在写这篇文章之前,我电脑就一度连不上网,这或许可以提高前面推测的可信性。

在此记录这个小小的“灵异事件”,以供日后参考。

2012年2月7日星期二

Openswan的证书认证

Openswan支持证书认证的IPSec。用OpenSSL生成CA、用户证书,然后在Windows下导入证书后连接,在服务器日志/var/log/secure中发现错误:
could not open host cert with nick name '/etc/pki/CA/private/cakey.pem' in NSS DB
Google搜索发现要把证书导入到NSS数据库中。这是Openswan 2.6.23之后改变的,要用Mozilla的Network Seurity Services管理证书。看了openswan-doc提供的README.nss,发现这个变动又引入了一堆新东西,而且不是那么容易搞定的,就暂时放弃了,还是用Preshared Key就够了。

2012年2月2日星期四

让APT不自动安装推荐包

Ubuntu里面apt-get会自动安装推荐包。如果要禁用掉自动安装推荐包,可以用apt-get--no-install-recommends参数,永久禁用可以在/etc/apt/apt.conf里面加入
APT::Install-Recommends "false";
Aptitude可以在其设置里面禁用此功能,Synaptic也可在其设置中禁用该功能。

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实例再新建一个。小小弄一下,没想到给自己挖了个大陷阱。

2011年11月28日星期一

怒斥Ubuntu

先讲个故事。你闻到家里很臭,但是不知道臭味从哪里来的。最后发现是家里的保姆偷偷在墙角拉屎了。原来这位保姆有随地大小便的习惯。甚至在小区里面也喜欢随地大小便,不过小区被物业和所有业主盯着,所以保姆很少在小区干,而且拉完后自己会立刻清理掉。恶心吧?

其实这个保姆就是Ubuntu。

今天想在软件中心找个软件,考虑到英文界面下看到的评分和评论会比较多,就想把语言从中文切换回英文。可是在设置的语言支持里面改了之后,部分locale是en了,但有几个还是zh,设置语言的图标名称还是“语言支持”中文的,而不是Language Support。

试着修改/etc/default/locale,把~/.config移除,用了locale-gen --purge把其它locale都删除,还有localepurge软件,都无效。只好又在/etc下用grep -R zh_CN *来搜索了,发现/etc/environment文件里面赫然写着中文locale的环境变量:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANGUAGE="zh_CN:en"
LANG="en_US.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
我把里面几个locale的环境变量都删除,还重启了电脑,仍然无效,上面几个locale设置还是有效。真是气愤这破玩意!

我又在家目录下用grep -R zh_CN `ls -A | grep '^\.'`搜索,愤然发现.profile的最后几行:
export LANG="en_US.UTF-8"
export LANGUAGE="zh_CN:en"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
这几行删除掉后终于干净了。你妈的,都污染到.profile文件了。好吧,拉就拉吧,谁让你住我家呢,可是你他妈的能不能拉完了清理一下啊,害老子浪费一上午时间!我已经默念无数遍Fuck Ubuntu了。

/etc下面的配置文件,系统在软件安装、删除、升级的时候一般都会考虑到配置。而家目录下的设置,软件往往只管写,软件删除了这些配置也保留,当然这是对的,这是用户数据要一直留着;软件升级了也不会对应升级,如果配置文件不兼容了那就会出问题。

Ubuntu把设置直接写到.profile这么关键的文件中,而且又是locale这种重要的系统变量,如果只管写而不考虑后面的清理工作,那就太不负责了。不知道这是哪个白痴开发者干的。甚至/etc/environment都有疑问,我把中文的各种locale都删除了,这个文件里面却还留着中文的locale,需要自己去修改。

2011-11-29更新:发现~/.dmrc也被污染了,还保留着中文语言的信息。删掉还不行,要把中文的改成英文的才可以保留下来。

2011年11月27日星期日

Supertux崩溃

在CRT显示器上开Supertux直接崩溃。看到屏幕记录里面有一条警告信息说1440x900的分辨率有问题,崩溃前的最后一条是个C++头文件的错误。想到之间在液晶显示器上还是好好的呢,可能是画面分辨率导致的问题。把~/.supertux2移走后就可以进去了。但是这样我的进度就都没有了。找到~/.supertux2/config文件,里面有fullscreen_widthfullscreen_heightwindow_widthwindow_height等配置参数,把它们改成800x600的(显示器是17寸,可以支持1024x768以下的几个分辨率)后游戏就能进去了。

有不少问题,原因可能都是配置文件过老、不兼容等问题造成的。遇到问题试试移除配置文件常常还是挺管用的。