公司目前用的是TP-LINK家用无线路由,使用人数一多就频繁出现死机症状,每次都要去机房重启路由器,不胜其烦。
研究了一下传说中的企业级路由器,发现无外乎是IXP42X处理器加linux核心的固件,售价都在六七百元以上,功能多一些的路由器要价1K以上,本着为公司节约成本的考虑,偶打算用belkin路由器加第三方固件来实现比企业级路由器更为强悍更加灵活的功能。
基于linux的第三方开源固件大致有openwrt,ddwrt,tomato三大分支,openwrt功能过于强大过于专业,管理配置多有不便;ddwrt适合DIY玩家,tomato适合网吧及小型ISP用户,偶就选择tomato吧。
刷了Tomato Pandora
固件,ssh看下,发现内核已经更新为2.6.22了。由于要实现内网用户只能收发邮件,所以只能开放wan口的tcp53,25,110以及udp53端口。tomato的功能有限,通过路由器的web界面无法设置,只好ssh进去用iptables来做。
想到iptables里面INPUT定义为所有收到的并且目的地址为本机的报文都会经过这个链,而不管哪个接口进来的或者它往哪里去,就写了个规则出来:
iptables -I INPUT -j DROP
iptables -I INPUT -p tcp –dport 25 -j ACCEPT
iptables -I INPUT -p tcp –dport 110 -j ACCEPT
iptables -I INPUT -p tcp –dport 53 -j ACCEPT
iptables -I INPUT -p udp –dport 53 -j ACCEPT
试验一下居然把端口全都封杀了,甚至无法解析IP。
想了一下转发过滤不能在INPUT链上做,改在FORWARD上面来试试:
iptables -I FORWARD -j DROP
iptables -I FORWARD -p tcp –dport 25 -j ACCEPT
iptables -I FORWARD -p tcp –dport 110 -j ACCEPT
iptables -I FORWARD -p tcp –dport 53 -j ACCEPT
iptables -I FORWARD -p udp –dport 53 -j ACCEPT
还是不行,结果一样,所以端口全被封杀了。
得到论坛朋友指点,原来忘记了通信是双向的,应该用-o参数指定界面。嗯,指定wan口来写规则就可以达到目的。
看下路由器的网络接口:
root@belkin:/tmp/home/root# ifconfig
br0 Link encap:Ethernet HWaddr 00:01:E3:0E:95:C4
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7684 errors:0 dropped:0 overruns:0 frame:0
TX packets:7816 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1337937 (1.2 MiB) TX bytes:2623323 (2.5 MiB)
eth0 Link encap:Ethernet HWaddr 00:01:E3:0E:95:C4
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6007 errors:0 dropped:0 overruns:0 frame:0
TX packets:6635 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1612018 (1.5 MiB) TX bytes:1377122 (1.3 MiB)
Interrupt:5 Base address:0x2000
eth1 Link encap:Ethernet HWaddr 00:01:E3:0E:95:C6
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7699 errors:0 dropped:0 overruns:0 frame:383461
TX packets:7976 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1447927 (1.3 MiB) TX bytes:2710136 (2.5 MiB)
Interrupt:4 Base address:0x1000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MULTICAST MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
vlan0 Link encap:Ethernet HWaddr 00:01:E3:0E:95:C4
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:714 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:232670 (227.2 KiB)
vlan1 Link encap:Ethernet HWaddr 00:01:E3:0E:95:C5
inet addr:192.168.1.101 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6007 errors:0 dropped:0 overruns:0 frame:0
TX packets:5921 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1503892 (1.4 MiB) TX bytes:1144452 (1.0 MiB)
发现wan口对应的是vlan1,于是防火墙脚本应该这样写:
iptables -I FORWARD -o vlan1 -j DROP
iptables -I FORWARD -p udp –dport 53 -j ACCEPT
iptables -I FORWARD -p tcp –dport 53 -j ACCEPT
iptables -I FORWARD -p tcp –dport 25 -j ACCEPT
iptables -I FORWARD -p tcp –dport 110 -j ACCEPT
试验一下,成功!