前段时间搞openwrt,后来有另外的重要的部门任务安排,转行改公司经过几代迭代的架构的代码的警告,花了约一周时间,花这么久时间,一来代码多,二来绝大部分代码非小弟所写所熟,故个别地方要测试是否OK。改完后,就转行设置Linux防火墙。年初时某康公司曝了密码安全事件,股价大跌两天又涨回去了,前两天看新闻说当时写研报的某证券公司被人家给告了。但依然搞了我们心里不安,这不,要给设备做一套产品安全机制。其中一个小小方面是Linux的iptables。
一、iptables的编译
1.1、下载:
http://www.netfilter.org/projects/iptables/downloads.html 最新版本为1.4.21。
1.2、配置:
1 | ./configure --prefix=/home/latelee/bin/iptables --disable-ipv6 --enable-devel --host=arm-linux \ |
CC为交叉编译器,根据实际情况指定。
1.3、编译:
1 | make; make install |
成功后,在/home/latelee/bin/iptables目录会出现下面的目录:
1 | bin include lib libexec sbin share |
sbin:iptables,实际为iptables-multi bin:iptables-xml,实际连接到sbin的iptables-multi
lib:基本的库,如libxtables.so。
libexec:一些策略、动作的库,如libipt_DNAT.so,libxt_state.so(下文使用-m state),libxt_limit.so(下文使用了-m limit,就需要该库),libxt_tcp.so,libxt_recent.so
本文使用的是1.4.9.1,因为使用最新版本的在设备上跑不成功,故而转向设备上本身已有1.4.9.1版本。最后经多次版本的不同验证发现,只是缺少libexec库——其实当初iptables就已经提示找不到这个库,比如:
1 | iptables v1.4.9.1: Couldn't load match `state':/usr/libexec/xtables/libipt_state.so |
只是我一厢情愿不认可。搞了半天,还是回到原始路子来。但是,只是重新编译iptables,得到.so库还不行,还需要内核的支持。
二、内核对应的配置
起初,执行一些iptables命令,提示很奇怪的信息,比如:
1 | iptables v1.4.9.1: unknown option `--syn' |
又比如:
1 | iptables v1.4.9.1: unknown option `--dport' |
后来执行下面的命令:
1 | iptables -A syn-flood -j REJECT |
提示:
1 | iptables: No chain/target/match by that name. |
ACCEPT和DROP都能支持,但REJECT却不支持,后来查.config,发现REJECT没有编译:
1 | CONFIG_IP_NF_TARGET_REJECT is not set |
而我在一台X86的Linux下执行同样的命令却十分正常。后来才发现,iptables要和内核的配置匹配。 下面是部分的配置:
1 | Networking options |
如果不放心,可以把netfilter有关的全部选上。为了避免频繁编译内核,我在实际中就是全选的,生成的内核镜像体积添加不到1MB,可以接受。
三、iptables的使用
iptables网络上的文章一大堆,由于复制粘贴原因,可能有个别的命令语句不能执行,最经典的是“-”被改为“-”,还有个别需要空格的地方而缺少空格。建议多参考几个文章,同时也用iptables –help看看帮助信息,最好自己手动敲命令。——即使如很有责任的我写的这篇文章,也不敢保证网页上出现的命令没有格式问题。——何况还有其它网站不负责地转载。 清空iptables命令如下:
1 | iptables -F (flush chain) |
上面的iptables库和内核的编译就是根据下面的实例所需而进行的。
3.1、NAT端口转发
在某些情况下,一台设备有2个网卡,分别为连接内网和外网。当需要在外网通过该设备访问内网设备时,就需要使用到端口转发功能。下面的实例是访问172.18.18.18的100端口,将其转发到100.10.10.168的100端口:
1 | iptables -t nat -A PREROUTING -d 172.18.18.18 -p tcp --dport 100 -j DNAT --to-destination 100.10.10.168:80 |
另外需要使能内核的转发功能:
1 | echo 1 > /proc/sys/net/ipv4/ip_forward |
3.1.1、同一端口同时支持TCP和UDP的转发
2016.01.09 note:遇到一个需求,对同一个端口需要支持TCP和UDP的转发,找资料、测试,大约2天不到,终于找到一种好的方法,对上述命令对比,有一些细小的修改。命令如下:
1 | // 增加: |
注:对于端口的转发,需要用-p指定协议,一个命令只能有一种(即tcp或udp),不能同时指定。如果不使用-p但又有端口号,则会有语法错误,如果使用“-p all”也会提示语法错误。
3.2、length测试
length可以对包的长度进行各种处理,下面的实例用于ping命令。
1 | iptables -t filter -A INPUT -p icmp -m length --length 1:99 -j ACCEPT; // 100以内的,可接入 |
在一台Linux上ping测试,不同大小的包有不同的结果,如下:
1 | ping -c 1 -s 50 100.100.18.168 # 成功 |
3.3、limit测试
测试的命令同样用于ping测试:
1 | iptables -P INPUT DROP |
前5个包正常,后面隔一段时间才能ping通。可以改3/m的参数。 注意!不要在ssh和telnet中输入iptables -P INPUT DROP!!!!!因为没有写其它规则的话,默认到本机的数据包都丢弃!这样就不能再使用ssh和telnet连接了!
3.4、防止sync flood攻击
下面是从网上找到的预防DOS攻击的iptables命令:
1 | iptables -N syn-flood; |
下面是自己根据openwrt的syn_flood的配置写的命令:
1 | iptables -N syn_flood |
攻击命令如下:
1 | hping3 --flood -S -p 80 100.100.18.168 |
李迟 2015.10.24 周六