linux下iptables的编译及简单使用 | 迟思堂工作室
A-A+

linux下iptables的编译及简单使用

2015-10-24 15:00 网络方面 暂无评论 阅读 1,232 次

前段时间搞openwrt,后来有另外的重要的部门任务安排,转行改公司经过几代迭代的架构的代码的警告,花了约一周时间,花这么久时间,一来代码多,二来绝大部分代码非小弟所写所熟,故个别地方要测试是否OK。改完后,就转行设置Linux防火墙。年初时某康公司曝了密码安全事件,股价大跌两天又涨回去了,前两天看新闻说当时写研报的某证券公司被人家给告了。但依然搞了我们心里不安,这不,要给设备做一套产品安全机制。其中一个小小方面是Linux的iptables。

一、iptables的编译

1、下载:

最新版本为1.4.21。

2、配置:

./configure --prefix=/home/latelee/bin/iptables --disable-ipv6 --enable-devel --host=arm-linux \
CC=arm-linux-gnueabi-gcc

CC为交叉编译器,根据实际情况指定。

3、编译:

make; make install

成功后,在/home/latelee/bin/iptables目录会出现下面的目录:

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就已经提示找不到这个库,比如:

iptables v1.4.9.1: Couldn't load match `state':/usr/libexec/xtables/libipt_state.so

只是我一厢情愿不认可。搞了半天,还是回到原始路子来。但是,只是重新编译iptables,得到.so库还不行,还需要内核的支持。

二、内核对应的配置

起初,执行一些iptables命令是,提示很奇怪的信息,比如:

iptables v1.4.9.1: unknown option `--syn'

又比如:

iptables v1.4.9.1: unknown option `--dport'

后来执行下面的命令:

iptables -A syn-flood -j REJECT

提示:

iptables: No chain/target/match by that name.

ACCEPT和DROP都能支持,但REJECT却不支持,后来查.config,发现REJECT没有编译:

CONFIG_IP_NF_TARGET_REJECT is not set

而我在一台X86的Linux下执行同样的命令却十分正常。后来才发现,iptables要和内核的配置匹配。
下面是部分的配置:

Networking options
--> Network packet filtering framework (Netfilter)  ---> 
Core Netfilter Configuration  --->
<*>     REJECT target support    # 支持REJECT
<*>   "connlimit" match support"
<*>   "limit" match support 
<*>   "recent" match support 
<*>   "state" match support 

如果不放心,可以把netfilter有关的全部选上。为了避免频繁编译内核,我在实际中就是全选的,生成的内核镜像体积添加不到1MB,可以接受。

三、iptables的使用

iptables网络上的文章一大堆,由于复制粘贴原因,可能有个别的命令语句不能执行,最经典的是“-”被改为“-”,还有个别需要空格的地方而缺少空格。建议多参考几个文章,同时也用iptables --help看看帮助信息,最好自己手动敲命令。——即使如很有责任的我写的这篇文章,也不敢保证网页上出现的命令没有格式问题。——何况还有其它网站不负责地转载。
清空iptables命令如下:

iptables -F (flush chain)
iptables -X (delete chain)
iptables -Z (Zero  the  packet  and  byte counters in all chains)

上面的iptables库和内核的编译就是根据下面的实例所需而进行的。

1、NAT端口转发
在某些情况下,一台设备有2个网卡,分别为连接内网和外网。当需要在外网通过该设备访问内网设备时,就需要使用到端口转发功能。下面的实例是访问172.18.18.18的100端口,将其转发到100.10.10.168的100端口:

iptables -t nat -A PREROUTING -d 172.18.18.18 -p tcp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -A POSTROUTING -d 100.10.10.168 -p tcp --dport 80 -j SNAT --to 172.18.18.18
iptables -A FORWARD -o eth0 -d 100.10.10.168 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.10.10.168 -p tcp --sport 80 -j ACCEPT

另外需要使能内核的转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

1.1、同一端口同时支持TCP和UDP的转发
2016.01.09 note:遇到一个需求,对同一个端口需要支持TCP和UDP的转发,找资料、测试,大约2天不到,终于找到一种好的方法,对上述命令对比,有一些细小的修改。命令如下:

// 增加:
iptables -t nat -A PREROUTING -d 172.18.18.18 -p udp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -A POSTROUTING -s 100.10.10.168 -p udp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -A FORWARD -o eth0 -d 100.10.10.168 -p udp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.10.10.168 -p udp --sport 80 -j ACCEPT
iptables -t nat -A PREROUTING -d 172.18.18.18 -p tcp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -A POSTROUTING -s 100.10.10.168 -p tcp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -A FORWARD -o eth0 -d 100.10.10.168 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 100.10.10.168 -p tcp --sport 80 -j ACCEPT

// 删除:
iptables -t nat -D PREROUTING -d 172.18.18.18 -p udp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -D POSTROUTING -s 100.10.10.168 -p udp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -D FORWARD -o eth0 -d 100.10.10.168 -p udp --dport 80 -j ACCEPT
iptables -D FORWARD -i eth0 -s 100.10.10.168 -p udp --sport 80 -j ACCEPT
iptables -t nat -D PREROUTING -d 172.18.18.18 -p tcp --dport 100 -j DNAT --to-destination 100.10.10.168:80
iptables -t nat -D POSTROUTING -s 100.10.10.168 -p tcp --dport 80 -j SNAT --to-source 172.18.18.18:100
iptables -D FORWARD -o eth0 -d 100.10.10.168 -p tcp --dport 80 -j ACCEPT
iptables -D FORWARD -i eth0 -s 100.10.10.168 -p tcp --sport 80 -j ACCEPT

注:对于端口的转发,需要用-p指定协议,一个命令只能有一种(即tcp或udp),不能同时指定。如果不使用-p但又有端口号,则会有语法错误,如果使用“-p all”也会提示语法错误。
2、length测试
length可以对包的长度进行各种处理,下面的实例用于ping命令。

iptables -t filter -A INPUT -p icmp -m length --length 1:99 -j ACCEPT; // 100以内的,可接入
iptables -t filter -A INPUT -p icmp -m length --length 100:199 -j REJECT; // 100~200的,拒绝,返回错误
iptables -t filter -A INPUT -p icmp -m length --length 200:299 -j DROP;// 200~300的,直接丢弃,不返回错误

在一台Linux上ping测试,不同大小的包有不同的结果,如下:

ping -c 1 -s 50 100.100.18.168 # 成功
ping -c 1 -s 150 100.100.18.168 # 有错误信息 From100.100.18.168 icmp_seq=1 Destination Port Unreachable
ping -c 1 -s 250 100.100.18.168 # 丢失

3、limit测试
测试的命令同样用于ping测试:

iptables -P INPUT DROP
iptables -A INPUT -p icmp -m limit --limit 3/m --limit-burst 5 -j ACCEPT

前5个包正常,后面隔一段时间才能ping通。可以改3/m的参数。
注意!不要在ssh和telnet中输入iptables -P INPUT DROP!!!!!因为没有写其它规则的话,默认到本机的数据包都丢弃!这样就不能再使用ssh和telnet连接了!

4、防止sync flood攻击
下面是从网上找到的预防DOS攻击的iptables命令:

iptables -N syn-flood;
iptables -A INPUT -p tcp --syn -j syn-flood;
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN;
iptables -A syn-flood -j REJECT;

iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 30 -j DROP;
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT;

下面是自己根据openwrt的syn_flood的配置写的命令:

iptables -N syn_flood
iptables -A syn_flood -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 25/sec --limit-burst 50 -j RETURN
iptables -A syn_flood -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood

攻击命令如下:

hping3 --flood -S -p 80 100.100.18.168

李迟 2015.10.24 周六




如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言