学习 Iptables
davies 发表于 2006 年 12 月 3 日
Iptables 是 Linux 下的利器,降妖除魔,非常厉害,可以用来搭建超强的防火墙或者路由器,还可以用作端口映射、负载均衡等。要想涉足 Linux 下的网络管理,不掌握 Iptables 显然是不行的。
一直以来对 Iptables 心存敬畏,想学却又不敢下手,生怕一时半会弄不清个所以然。碰到了问题也是找 rogerz 帮忙解决,比如配置的 VPN,自己更是有了惰性。现在他已经毕业了,原水解不了近渴,非自己动手不行了。而且就像前面所说的,Iptables 实在是必修课,逃避不得。
近来服务器老是被别人的 TUNet 帐号占用,导致我们的出国包月帐号无法使用,不能访问国外网络。无奈之下,只能通过重启服务器的方式来解决,相当郁闷。猜测,很可能是某个使用 VPN 的用户没有添加路由,这样他再用 TUNet 帐号登陆的话,就给绑定到服务器的 IP。正常情况下是包月帐号使用着这个 IP,在某些偶然情况下会被其它的帐号抢占。只要禁止通过服务器来连接 TUNet,估计问题就解决了。
昨晚开始看 Iptables 的文档,找到了一篇 Oskar Andreasson 写的 Iptables 指南 1.1.19(oan@frozentux.net翻译),由文档写得非常好,翻译得也不错。非常清晰地描述了 Iptables 的工作原理和相关概念,还有详细的用法和实例。花了两三个小时一遍读下来,对它的原理和使用方法都明白了,一般的问题都能搞定,只是在针对特殊问题的经验还需要时间积累。
回到上面的问题:如何禁止通过服务器登陆TUNet。查看了一下当前的 Iptables 配置,有三条规则:
- *nat: -A POSTROUTING -s 10.0.0.0/255.255.255.0 -j MASQUERADE
- *filter: -A INPUT -s 10.0.0.0/255.255.255.0 -d 59.66.0.0/255.255.0.0 -j DROP
- *filter: -A INPUT -s 10.0.0.0/255.255.255.0 -d 166.111.0.0/255.255.0.0 -j DROP
第一条使用来实现NAT的,将来自VPN的中转包做伪装,适用于这种动态 IP 的情况。而后面两条估计也是 rogerz 添加的,似乎就是用来解决上面的问题的,要将中转至校内 IP 段的包抛弃。仔细一看,这种写法是有问题的,发到本机的包才会通过 filter 表的 INPUT 链,而中转的包应该是通过 FORWARD 链才对。而且 DROP 的处理方式也不太好,对方会等待超时,用 REJECT 更友好一点。于是就它们改成:
-A FORWARD -d 166.111.0.0/16 -j REJECT
同时加一句
-A FORWARD -d 166.111.0.0/16 -j LOG
把没有企图通过它中转的包记录下来,看看是谁还没有添加路由表,通知一下。
回过头来看,在有了这么好的中文文档的情况下,学习 iptables 也不是那么困难嘛,并没有想象中的高深。丰富并且浅显易懂的文档,正是开源社区的特色,作者都是本着为用户解决实际问题的初衷写的,往往相当实用,不好还很生动和富有文采。Gentoo 社区的文档工作也做得非常好,它的创始人Daniel Robbins就曾经呼吁更多的人来参与文档建设,说很多人就是通过他写的文档认识他,而不是代码。现在国内的中文文档建设情况也相当不错,有很多组织在做这方面的工作,不少重要的文档都有了中文版本,比如上面的 Iptables 指南。在此向所有为开源社区做出贡献的奉献者表示敬意!