netfilter是实现linux防火墙框架的内核模块。形象的说,netfilter在内核的网络协议中设置了5个哨卡,负责检查或处置进出或转发的IP包。这5个哨卡就是PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING。通过这5个哨卡可以实现4种功能:raw, mangle, nat, filter。在Linux防火墙的专业术语中,这些哨卡就叫作链(CHAIN),功能叫作表(TABLE)。在每个链上能实现的功能是不同的。反过来说,即每个功能能部署的哨卡(即链)是不一样的。如下所示:
filter表:INPUT OUTPUT FORWARD
nat表: PREROUTING POSTROUTING OUTPUT
mangle表:PREROUTING INPUT OUTPUT FORWARD POSTROUTING
raw表: PREROUTING OUTPUT
iptables是Linux防火墙的配置工具,通过其在netfilter的具体表链上添加或删除指定的规则以实现在内核空间对IP包的管理。下面简要总结一下iptables命令的常用选项和参数:
iptables [-t table] {-L|-F|-Z} [ CHAIN [num]] [options]
-L 查看指定表table的指定链CHAIN中的规则。省略num,则显示该链中所有的规则;省略CHAIN,则显示该表所有链的所有规则。省略table,默认为filter表。
-F 清空指定表table的指定链CHAIN中的规则。
-Z 对指定表table的指定链CHAIN中的规则计数器作清零操作。
options中常用的参数:
-n 以数字格式显示IP和PORT。
-v 以详细格式显示。
-x 对匹配到的包数、字节数等数据不作单位换算,显示精确值。
--line-number 显示各规则的行号。
iptables [-t table] -A CHAIN rule-specification
在指定表table的指定链CHAIN的尾部追加一条规则。
iptables [-t table] -I CHAIN [num] rule-specification
在指定表table的指定链CHAIN中插入一条规则。其中数字num表示插入的行号,省略num表示插入在第1行。
iptables [-t table] -D CHAIN num
在指定表table的指定链CHAIN中删除指定行号的规则。
iptables [-t table] -R CHAIN num rule-specification
在指定表table的指定链CHAIN中第num行的规则替换为指定的规则。
iptables [-t table] -P CHAIN target
对指定表table的指定链CHAIN指定的默认策略,如DROP, ACCEPT等。
iptables [-t table] -S [CHAIN]
以文本的形式显示指定表table的指定链CHAIN的配置规则。
rule-specification 由匹配条件和处理策略组成: 匹配条件 -j 处理策略
主要处理策略(target): ACCEPT, DROP, REJECT, SNAT, DNAT, LOG, RETURN, REDIRECT.
匹配条件分为以下2类
基本匹配条件:
-s :匹配原地址,可以IP,也可以网络地址。
-d : 匹配目标地址。
-p : 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一
-i :数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING
-o :流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING
扩展匹配条件:
隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展
-p tcp
--dport m[-n] :匹配的目标端口,可以是连续的多个端口
--sport m[-n] :匹配源标端口,可以是连续的多个端口
--tcp-flags check_flags_list true_flags_list check_flags_list是要检查的标志位列表,true_flags_list是要其值为‘1’的标志位列表。“ALL”可以表示所有的标志位,“NONE”表示不包含任意标志位。
--syn 相当于--tcp-flags URG,PSH,RST,SYN,ACK,FIN SYN
也相当于--tcp-flags ALL SYN
-p udp
--dport m[-n] :匹配的目标端口,可以是连续的多个端口
--sport m[-n] :匹配源标端口,可以是连续的多个端口
-p icmp
--icmp-type type 指定icmp包的类型。8: ping请求,0:ping响应。
显式扩展:必须明确指定的扩展模块
-m 扩展模块名称 --专用选项1 --专用选项2 。。。
multiport: 多端口匹配,一次指定多个(15个以内)离散端口
--source-ports , --sports port[,port|,port:port]
--destination-ports, --dports port[,port|,port:port]
--ports port[,port|,port:port]
例子:
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: ip地址范围
--src-range from[-to]
--dst-range from[-to]
例子:
iptables -A INPUT -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
time: 指定时间范围
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day...]
例子:
iptables -A INPUT -p tcp --dport 80 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00 --time-stop 18:00 -j ACCEPT
string: 字符串匹配
--algo {bm|kmp}:字符匹配查找时使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式
connlimit: 每IP对指定服务的最大并发连接数;
--connlimit-above [n]
limit: 报文速率控制
--limit number[/second|/minute|/hour|/day]
--limit-burst number
state: 状态匹配。启用该扩展模块,则内核模块需要加载mod: ip_conntrack, nf_conntrack。默认已经加载。
--state 指定连接的状态类型:NEW, ESTABLISHED, RELATED, INVALID
组织iptables匹配规则的法则:
1. 对于进入的状态为ESTABLISHED都应该放行;
2. 对于出去的状态为ESTABLISHED都应该放行;
3. 严格检查进入的状态为NEW的连接;
4. 所有状态为INVALIED都应该拒绝;
FTP相关规则生效必须加载的内核模块
1. 确保iptables加载ftp协议支持的模块:ip_nat_ftp, ip_conntrack_ftp
编辑/etc/sysconfig/iptables-config文件,定义如下参数:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
2. 放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;
netfilter相关的调优参数
1. 调整连接追踪功能所能容纳的追踪的最大连接数:
# cat /proc/sys/net/nf_conntrack_max
2. 定义了连接追踪的最大值,因此,建议按需调大此值;
# cat /proc/net/nf_conntrack
3. 记录了当前追踪的所有连接
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established