Shell's Home

openwrt配置——路由规则

Jun 16, 2011 - 1 minute read - Comments

路由其实是个很简单的事情,不知道为什么在实际运用中被很多人误解。首先,路由规则是个纯IP层的事情,和TCP没有关系。其次,路由和NAT没有关系。实际上,和这两个有关系的都是iptables。 路由表的大概概念就是,你家门口有三条路,有一张路径表。到上海市,走左边,北京市,走右边,西安市,走中间。因此路由表的概念是发出规则。当你收到一个包,如果目的地址是本地,那么就交给监听程序处理。如果没有监听程序,那么就拒绝报文。(注意,下文讨论的时候都略去了iptables)如果目的地址不是本地,则看是否允许转发。不允许,丢弃,允许,加入发出队列。路由表就是发出队列的选择规则。这个规则之所以存在,主要是因为多头主机的存在。如果一台机器只有一个发出设备,路由表是没有任何用处的。 发出规则计算很简单,首先取目标网络地址,还有包网络地址,然后分别和子网掩码求与(AND)。如果两者相等,那么就转发到这个规则所指定的接口上,如果不等,继续匹配。规则顺序也很简单,子网掩码距离越长,子网越小,规则越靠上。其中有两种特殊的子网掩码,一种是255.255.255.255,或者叫/32,用于指定主机。一种是0.0.0.0,或者叫/0。这个子网只有一个,叫做default。因为按照规则用这个掩码计算的结果,任何目标地址都可以匹配这一规则。 当然,根据上面的解释我们可以知道,路由表只管发出报文。如果目标设备需要返回一个报文,他必须保证返回路由的正确。因此在下面的openvpn讲解中,你在vps也必须配置路由。很幸运,这个问题openvpn已经帮我们做好了。 通常而言,我们拨号上网后应当有三条路由规则,第一条不解释。第二条通常是内网IP通过内网端口发出——这是当然的,否则内网包就暴露了。第三条通常是其他IP通过外网发出。当内网需要向外网发送数据的时候,会设定路由器作为网关。路由器会转发内网的包到他的上级路由器上。而当外网有数据要发送给内网的时候,情况则正好相反。注意,实际中一般是要进行NAT的,不是这么直接收发。 如果当你使用了openvpn的routed模式,那么你就有了两个内网——常规内网和虚拟内网。我们可以想像,首先需要配置的是两个内网的互通问题。在你本地的网关上,需要配置虚拟网络段发送到tun0设备上。而在远程,需要配置常规内网段发送到拨号上来的这个IP上。大致要配置这些东西。 -----------------vps-server.conf------------------- client-config-dir /etc/openvpn/ccd route 192.168.x.0 255.255.255.0 --------------------ccd/openwrt--------------------- iroute 192.168.x.0 255.255.255.0 这样,当openwrt这个用户拨号上来后,vps上就会添加一条路由,192.168.1.0网段通过刚刚拨号的地址来转发。 其次,哪些数据发送到拨号网络,哪些需要通过虚拟内网呢?这规则通常由你来定。不过千万注意,不要用tun0这个设备来发送到服务器的数据——这会引发循环。这个问题一个不是那么明显的例子是,你设定使用tun0来发送default,但是又没有特别指定vps的地址使用ppp0发送。

openwrt配置——openvpn的基础配置

Jun 15, 2011 - 1 minute read - Comments

在openwrt下面配置openvpn是非常简单的事情,当然我假定你有linux下面配置openvpn的经验。 首先,将配置文件,证书等等复制到/etc/openvpn下面。我的配置大概是这样。 client dev tun proto udp remote ipaddr port resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/ca.crt cert /etc/openvpn/openwrt.crt key /etc/openvpn/openwrt.key ns-cert-type server tls-auth /etc/openvpn/ta.key 1 cipher DES-EDE3-CBC comp-lzo verb 3 script-security 3 up /etc/openvpn/dftup down /etc/openvpn/dftdown 注意,其中的路径必须写完整,貌似测试下来不支持相对目录。其中的up和down是指在启动和关闭时会自动执行的两个脚本。根据贝壳的测试,redirect-gateway是无效的,不知道为什么。具体的路由配置方法,会在下一章中具体介绍。 然后,你需要将这个配置启用,方法是修改/etc/config/openvpn,在其中加入以下内容。 config openvpn name option enable 1 option config /etc/openvpn/name.conf name是你的配置名,下面的路径和配置文件路径吻合。 然后,你可以这样启动vpn。 /etc/init.d/openvpn restart

openwrt配置——extroot使用U盘配置规则

Jun 14, 2011 - 1 minute read - Comments

贝壳入手了一个DIR-825路由器,机器不错,可惜存储太小。所以要用extroot做成U盘启动。 首先,你需要安装kmod-usb2,kmod-usb-uhci,kmod-usb-ohci,kmod-usb-storage,kmod-usb-storage-extras这几个包,以保证系统可以正常访问你的USB key。而后安装block-mount block-hotplug block-extroot这几个包,来启用U盘启动。最后不要忘记安装kmod-fs-ext3,驱动文件系统。 当你搞定这几步后,修改/etc/config/fstab这个文件,如下配置。 config mount option device /dev/sda1 option fstype ext3 option options rw,sync option enabled 1 option enabled\_fsck 1 option is\_rootfs 1 config swap option device /dev/sda2 option enabled 1 然后,恭喜你,你就拥有一个可以从U盘引导的路由器设备了。当然,如果不从U盘引导,那么还是可以正常使用目前有路由拥有的普通功能。在使用U盘后,路由器的包和设定就完全存储在了U盘上。如果配置错误,拔下U盘就可以还原。你也可以复制自己的U盘给别人,在同样型号,并且安装了同样上述包和配置的路由器上继续使用(当然,会沿用你的配置)。 下面,是如何创建可被openwrt引导的U盘。 mkdir /tmp/sda1 mkdir /tmp/root mount /dev/sda1 /tmp/sda1 mount -o bind / /tmp/root cp -a /tmp/root/\* /tmp/sda1 上面几步,更详细的可以参考这篇文章(http://ddnas.org:88/blog/index.php/archives/2.html)。 下面说一下使用U盘启动后,你很可能需要的一些包。 bash 当有了空间,你可以修改/etc/passwd来使用bash作为你的默认sh,这样比较习惯。 ifstat 非常常用的软件,监控各个网卡设备上的吞吐。 iftop 监控各个IP的访问情况。 iperf 测试路由器到各个节点的速度。 openssh-server sshd openvpn vpn软件 screen 一个ssh中运行多个bash的玩意。 注意,openssh使用~/.ssh/authorized_keys作为验证文件,并且该文件必须是600以下权限。而dropbear不使用这个文件。因此必须先产生该文件,再禁用openssh的password验证模式,不要想当然直接以为dropbear已经产生了这个文件。

从毒奶粉到塑化剂

Jun 10, 2011 - 1 minute read - Comments

大陆出毒奶粉的时候,大家纷纷指责,怎么这种东西都不检验?好了,现在可以说明这不是大陆质检部门的独门失误了。因为台湾质检也没有想到有人会给食品内添加塑化剂,说明要检测一种你根本想不到会被添加到食物中的物质时,还是比较困难的。 忘记从哪里看到了,欧洲的食品要求是可追查添加的。就是从源头开始,每一步加工技术对食品的影响都要求可控。例如挤奶,然后得到牛奶。牛奶内的成分就检验一遍,得到一个基准值。然后每个环节如何加工都是需要填报的,这样就可以追查某个环节上产生的异常变化是如何来的。例如后续突然发生了蛋白质含量上升,就要说明如何发生。到底是加入了添加剂,是否合法。还是进行了浓缩,浓缩比例多少。 这个方法对于监控添加剂是比较有效的,可惜的是,在中国(包括台湾)的体制内都很难实施。一方面,这种做法耗费很大,需要大量的生化技术人员参与到每个环节的检验校对中。另一方面,中国文化是个关系社会。很多问题往往不是简简单单的技术问题,而是关系问题影响技术。当然,后者在欧美国家也有类似表现,就是各种化工原料公司游说国会,将他们的产品列入非监管,无害的名录。 事情如何收尾?台湾方面的做法比大陆高明的多,也许是吸收了教训。大陆方面拼命掩饰,甚至不惜提高牛奶中添加剂含量的标准,降低牛奶质量,使得大部分的牛奶能够安全过关。但是几年下来,情况越来越糟。牛奶贩子知道政府不敢管,于是越来越嚣张。结果牛奶质量每况愈下,标准一降再降。弄到现在中国人跑到香港澳门去带奶粉,已经造成香港和澳门奶粉严重缺货。两地政府限制销售,同时海关对奶粉抽重税。这说明中国奶粉已经彻底完蛋了,未来十年内都不会恢复元气。而台湾方面的做法则是惩罚有问题的公司,无论涉及多少,一概严惩,标准只能升不能降。剔除了有问题的公司后,好的公司可以继续存活,甚至因为市场的真空茁壮成长。而不负责任的公司则是彻底完蛋,对未来其他想加入添加剂的公司也是个警告。

无题

Jun 9, 2011 - 1 minute read - Comments

鲁迅原来是去日本学医的,某日学校里面放处决犯人的影片。片中的中国人被日本人抓住处决,说是俄国人的间谍。周围围了很多中国人,体格强壮,精神麻木,前来鉴赏盛举。 原来百年来,我们从未变过。

纯C和纯C++都不是好选择

Jun 8, 2011 - 1 minute read - Comments

其实严格说来,纯C是门好语言,我很欣赏纯C。但是作为程序设计,C用起来让人觉得很不方便。 在标准C规范中,变量必须在块的头部声明。当然,在近代C编译器中已经取消了这个限制。 我提到过的,C中缺乏高级数据结构支持,导致一些简单问题的实现变得异常复杂。例如我需要解析表达式,生成lisp样子的前缀表达式。这在很多高级语言中是个很简答的事情,但是C中,你不得不自行管理内存和结构,虽然这并不算复杂。 还有一些缺点不能尽述,但是经过时间的考验,C无疑是强大而具有生命力的一种语言。 C++就比较搞笑了,纯C++是一个非常糟糕的东西。我们列举其缺点: 函数指针是C中常用的概念,在C++中应当使用抽象接口-实现的方式,或者使用仿函。从技术上说,在C++中使用函数指针是一个落后而没有C++特色的行为。然而无论使用哪种,生成一个新的函数就必须生成一个新的类。你当自己是java么? 太多internal操作,导致代码隐性错误和思考心智负荷大幅上升。例如某个类可以定义一个单参的构造函数,constructor(int c);这等于定义了一个隐性转换函数,允许将int转换为类。或者使用T operator T();算符函数,将类转换到T。如果此时错误的将类实例当作int来操作,就会产生编译通过但是运行时出错的问题。更严重的是,转换函数严重的消耗性能。在这种情况下,编译和运行都不会出错,只是莫名其妙的性能很差。要避免这个问题,可以用explicit关键字。具体可以看这里(http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html)。但是这就需要额外的知识,和随时关心自己是否会犯下这个错误的小心。 强大到啰嗦的模板系统。那位有信心看懂所有stl编译时报错的?反正effactive C++的作者举过一个缺陷,打印了1500个左右的字符。大部分都是符号,望之犹如天书。 为了支持多重继承,导致指针类型转换可能导致指针地址变换。这是一个很扯淡的缺陷,转换指针类型不会引发指针的地址转换是一个C中的基础常识。然而C++为了支持多重继承,导致这个常识被破坏。 thiscall和non-thiscall指针无法转换。类成员函数和普通函数指针是无法转换的。这个破坏了所有代码都可获得地址的常识。 其实C++的致命缺陷,就是过度设计。每一步都是很必要很有道理的改进,在最后就组合成了让人望之生畏的复杂系统。 要使用C++,关键就是克制自己的过度设计欲望。C++可以很容易的使用类,模板,友元系统写的很强大,而且看起来很自然。例如你可以定义自己的BioTree,使用+做合并,可以使用|运算符做输出等。然而到最后,就会变成另一种语法。并且,如果合并上大数运算库之类的库,做一个BioTree,其中元素是大数的结构。当这个结构内发生错误的时候,你觉得你能够在里面找到正确的调试方向么? 要克制自己觉得很自然的想法,使用传统C中的一些做法,哪怕他们看起来很古怪,但是这是有道理的。

版权的态度

Jun 7, 2011 - 1 minute read - Comments

如果你读过RMS的书,你会发现这位老先生对版权的态度很有意思,他压根不认为copy这个东西居然还有right。copy要是有right的话,数学公式应该有right么?你那里算火箭弹道呢,有一张传票发过来,说牛顿的后裔发现你在用牛顿法求根公式求解方程,要求你支付权利金。你觉得不觉得很崩溃?就是因为数学公式是人类进步的基石,所以我们不允许任何人声明对它拥有权利,也不允许任何人阻断他人学习和使用数学公式。 然而如果数学公式没有权利的话,软件有权利就是一件很扯淡的事情。例如,你解决了一个数学问题,能够以最小代价将字符序列中的无效信息压缩到最小。然后,有人针对这个算法写了一个文本压缩程序。由于你的解是数学最优的,就是说,根据你的论文写出来的程序,如果没有什么大的实现瑕疵的话,压缩率和压缩速度是最高的,没有之一。所以,写程序那个家伙就申请了一个专利,天天收入不菲花天酒地。然而,你,这个论文作者,居然TMD还在吃糠咽菜。 当然,这个例子本身太过特殊,数学家一般也有过得去的计算机水准,所以针对算法写程序的人多数是数学家本人或者合作伙伴。但是这种问题不时刺激人们,对于我们最重要的东西,我们不能设置权限。然而我们却允许做出不重要发明的人享受特权,和特权带来的利益。所以RMS为代表的一小撮人,主要是老嬉皮士,强烈的反对版权。作为代表,他们搞出了GPL——反对版权的版权。你要基于使用GPL的代码写程序,好,你就必须放弃你的版权,同意GPL。 甚至,他们更激进的认为,不应当阻碍人类获得知识的渠道,知识是人类所共有的。所谓共有,是指,任何人都可以自行获得和学习知识,而不应当为此付出代价,例如金钱。当你上学时,你是为教师付钱,而不是为你学到的知识付钱。而且,当你想学,你就应当可以学到,而不是被禁止学习。因此,美国禁止向海外出售高强度加密软件的事情,在他们看来是邪恶的。将知识垄断,阻碍他人学习,他们看来是邪恶的。甚至你自己用来开发的机器上,设定个密码禁止其他人浏览你的代码,他们也认为是邪恶的。 这种观点当然很不讨好,甚至从他们的运动中获益的一些人——包括中国,都不欢迎他们的想法。我研究获得的知识,却无法用来牟利?劳有所得,这在很多人眼中是天经地义的,因此RMS等人的思想才显得那么格格不入。然而不可否认,RMS等人并不能算是扯大旗为自己牟利的伪君子或者邪恶教主,他们是真的信仰这种人类大同的观点。RMS年近50,无车无房,未婚,孑然一身,到处宣传自己的GNU思想。他自称自己连电脑都没有,不过出名的唯一好处是,现在他很容易借到一台电脑来收邮件。 国外的情况而言,是版权发展过剩。就是说版权现在已经成了大公司跑马圈地的法律武器。而国内的情况,则是版权发展不足。国内的人说认同版权观点,但是却仍旧使用盗版的winrar。而反对版权观点,也不是因为他是个嬉皮士,同意不应当阻碍人类获得信息和学习知识。纯粹是懒得付钱而已。

如何参与一个开源项目

Jun 2, 2011 - 1 minute read - Comments

最近很多人在问如何参与一个开源项目。其实个人觉得这是一个非常傻的问题,不过还是回答一下,期望这帮人记得用google搜到这个角落,免去论坛上月经一样的天天看到这种傻问题。 为什么说傻?因为这个问题和“如何捐钱”一样,是个没法直接回答的问题。你总要有一个明确的捐献目标,或者是明确的目标项目。世界上没有一个组织,名叫“开源软件”。无论你的目标是什么,你必须找到一个确定的开源项目进行参与。 在哪里能够找到开源项目?这很不好说。一方面,你可以在sf.net(需要翻墙)和code.google.com(最好翻墙)找到相当多的开源项目,也可以在github之类的地方寻找。另一方面,你也可以在debian里面找。很多包里面附带了项目的主页,如果你觉得这个包很不错,希望做贡献,可以按照链接找过去。 如何挑选合适的开源项目?首先要和你的兴趣相符合,或者能够满足你参与开源的目标。例如你对算法非常感兴趣,让你加入一个ERP系统的定制,成天修正繁琐的业务问题,可能就会让你觉得兴趣全无。其次最好参与一些中等复杂程度,具有活力的,比较缺人的项目。像linux kernel这种规模巨大,参与人员众多的项目,本身就是一个非常巨大的工程。你要了解这个工程需要很长时间,但是大部分你觉得有价值的事情都已经有人在做了。 如何开始?具体可以先给项目管理者发一封邮件,说明自己的目标,兴趣,能力,时间,然后问问他们是否需要自己的贡献。 大多数项目最缺的人才,不是程序员。通常一个开源项目,有几个程序员在做是不成问题的。但是大部分的开源项目缺乏一些周边人员,例如到各个组织中推广项目,获得反馈。和各种dist和开源平台协调,负责收集bug,控制项目发行,进行打包。负责项目的测试和文档工作,以及英文文档的翻译工作。这些工作并不需要专业知识,但是琐碎而且费时,程序员并不大乐意做。而且控制项目的release,还有进行协调要有一定的经验,也不是程序员擅长的领域。所以相当多的开源项目,就是程序员拍脑袋写,然后用户两眼一摸黑的用。没有合适的文档,没有各种系统的适用包,没有bug和用户意见反馈。 因此贝壳也请求,所有看到文章,且有志于贡献自己的力量的人,都可以考虑参与开源项目。你不需要会写程序,也不需要精通电脑。你需要做的可能就是将文档从英文翻译成中文,或者不断使用一个软件并找出其中不合理的地方。在中国,捐献金钱是容易的,但是却不透明,也不自由。你不确定你的金钱捐献给谁,他收到多少,是否真的需要。然而如果你选择某个开源软件做捐献,你可以选择自己为谁做出贡献,也会受到全体开源软件用户的感激。

HR该干吗

Jun 1, 2011 - 1 minute read - Comments

这个帖子(http://www.douban.com/people/March_Liu/miniblog/446401835/)里,蘑菇叔(好吧,现在该叫牛柳叔了)和别人在争论一个问题。其实我对他们的争论没什么兴趣,但是有几个论点挺有意思的。 面试题不应该拿回家做。面试题是即时抽查对方个人程序能力的一种测试,要是拿回家,就变成测试亲友团能力了。七大姑八大姨的儿子面试,知道你是个程序员,让帮忙做题,难道还能不做?我曾经也帮人做过面试题,不过做之前我都会和他们说。你可想好了,这些题目不算简单,我做没什么问题,没意外你应该能进去。但是这些题目比你能力超出太多,进去后你能不能呆的住,有什么后果自行负责。对方多半是一脸不在乎的说,先进去慢慢学吧。我知道结果的两个,一个进去三天,连试用期都没过就被开出来了。因为是试用期关系,企业还不管赔。另一个则是苦熬三个月后还是扫地出门。目前我的结论是,允许把试题带回家做的企业是不靠谱的企业,允许做题时上网也一样。做面试题时会去想作弊的技术应该转行去做销售。当年吴士宏的《逆风飞扬》里面说,主管问她会不会一个技术,她不会,但是说会,回家后连夜学起来。这种行为在销售上也许是值得称赞的行为,本人也够努力。但是作为技术岗位,这种思路是行不通的,而且非常不负责。技术是依靠长期积累的,指望在几天内突飞猛进根本不现实。相反,你闯祸的可能远比做好的可能大。做一名技术,就得踏踏实实把事情做妥当了。 HR不应该管工资。蘑菇叔的另一个观点是,HR不应该管工资。实际上,我一直不知道HR该做什么。当年我做招聘的时候,基本就是两种思路。一种是来一个人,HR告诉我大概要多少薪水,我谈下来直接向老总汇报。另一个是我面试能力,然后告诉HR这人我们大概给多少薪水,最高给多少。虽然名义上是HR主导的工资谈判,但实际上做出判断的一定是技术主管。因为除了技术主管,没有人(包括HR)清楚这个人能力能够为企业带来多少价值。HR评估价格的方法通常都是对比法,用证书和资历去做加减。可是证书和资历一方面容易造假,另一方面是否和企业技术合拍不得而知。 性价比太高的人都是不稳定因素。这句基本就是“价格围绕价值波动”的另一个表述形式。一旦一个人,你觉得他的性价比非常高,基本是几种可能。一种是他的能力非常特殊,只有少数企业需要。一旦从你公司离职,对他非常不利。而对于你们企业来说,找其他人非常不利。因此你才会觉得他的性价比特别高。第二种是因为这个人在其他方面有所求,例如商业间谍,或者需要从你公司里面积累一些必要的技术和资历。最后一种是因为——这个人快离职了。如果你发现一个人性价比特别高,请务必查一下为什么。是否是特殊能力很好判断,是否需要积累一些必要的能力和资历也不难分析。如果不是,请务必先考虑商业间谍的问题,再考虑你是不是应该要加薪了。 从第二个论点,我回想起以前和现在碰到的HR,发现他们的职能基本都不是很明确。或者说,多半明确的职能越界了。检查考勤,计算工资奖惩,招聘,安排培训,处理人事材料,负责离职事宜,这是HR的基本几个职务。我碰到的多数情况下,检查考勤和计算工资都由行政代劳,奖惩是老板拍脑袋的。招聘,处理人事材料和负责离职事宜倒是行政负责,但是基本没有企业安排培训。相反,人事的最大用途就是和员工谈判工资和福利,能压多少压多少。甚至很多人事的工资和他的谈判能力成正比。 这招对初级的岗位用用还可以,但是对于中级以上的技术人员,是绝对不能用的。应当说,凡是五年以上的程序员,应当禁止HR砍价,直接让老总去谈。为什么?具体看上面的论点三,招一个靠谱的人难阿。往往一个靠谱的职工,仅招聘成本就以千计。以一年期合同来说,为了每月500的价钱(一年大概差6000)谈跑了一个程序员,不仅招聘成本都打了水漂,而且再要招人还会更加困难(一方面是很难碰到,另一方面很多老程序员都互相认识)。这种HR不被问责才有鬼了。