iptables只是Linux防火墙的管理工具,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。
4个表:
filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。
filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTING:发送到网卡接口之前。
规则表:
1.filter表——三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 内核模块:iptables_filter.
2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)
规则链:
1.INPUT——进来的数据包应用此规则链中的策略
2.OUTPUT——外出的数据包应用此规则链中的策略
3.FORWARD——转发数据包时应用此规则链中的策略
4.PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
5.POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)
规则表之间的优先顺序:
raw——mangle——nat——filter
iptables的命令管理
命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]
-t table:
raw, mangle, nat, [filter] 默认表为filter
SUBCOMMAND:
链管理:
-N: new,新增一条自定义链;
-X:delete,删除自定义的空链;
-P:policy,设置链的默认策略;
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:rename,重命名自定义的未被引用(引用计数为0)的链;
规则管理:
-A:append,追加,默认为最后一个;
-I:insert,插入,默认为第一个;
-D:delete,删除
(1) rule specification
(2) rule number
-R:replace,替换
-F:flush,清洗
-Z:zero,置0;
iptables的每条规则都有两个计数器:
(1) 由本规则匹配到的所有的packets;
(2) 由本规则匹配到的所有的bytes;
-S:selected,以iptables-save命令的格式显示链上的规则;
查看:
-L: list,列出规则
-n:numeric,以数字格式显示地址和端口;
-v:verbose,详细信息;-vv, -vvv
-x:exactly,显示计数器的精确值而非单位换算后的结果;
--line-numbers:显示链上的规则的编号;
组合:-nvL
匹配条件:
基本匹配:netfilter自带的匹配机制
[!] -s, --source address[/mask][,...]:原地址匹配
[!] -d, --destination address[/mask][,...]:目标地址匹配
[!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
[!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;
扩展匹配:经由扩展模块引入的匹配机制,-m matchname
隐式扩展:可以不用使用-m选项专门加载响应模块;前提是要使用-p选项可匹配何种协议;
tcp、udp、icmp
显式扩展:必须由-m选项专门加载响应模块;
multiport
iprange
string
time
connlimit
limit
state
隐式扩展:
[!] -p, --protocol PROTOCOL PROTOCOL:
协议:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"
tcp: 隐含指明了“-m tcp”,有专用选项:
[!] --source-port,--sport port[:port]:匹配报文中的tcp首部的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口;可以是端口范围;
[!] --tcp-flags mask comp:检查报文中mask指明的tcp标志位,而要这些标志位comp中必须为1;
--tcp-flags syn,fin,ack,rst syn
--tcp-flags syn,fin,ack,rst ack,fin
[!] --syn:
--syn相当于“--tcp-flags syn,fin,ack,rst syn”;tcp三次握手的第一次
udp:隐含指明了“-m udp”,有专用选项:
[!] --source-port,--sport port[:port]:匹配报文中的udp首部的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口;可以是端口范围;
icmp:隐含指明了“-m icmp”,有专用选项:
[!] --icmp-type {type[/code]|typename}
type/code:
0/0:echo reply 应答ping请求
8/0:echo request 自己可以ping
处理动作:
-j targetname [per-target-options]
ACCEPT, DROP, REJECT
RETURN:返回调用的链
REDIRECT:端口重定向
LOG:日志
MARK:防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQERADE:地址伪装
匹配条件:
显式扩展:
multiport:多端口匹配
以离散方式定义多端口匹配,最多可以指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange:指明一段连续的ip地址范围做为源地址或目标地址匹配;
[!] --src-range from[-to]:源地址范围
[!] --dst-range from[-to]:目标地址范围
string:对报文中的应用层数据做字符串匹配检测;
--algo {bm|kmp}:
(bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
[!] --string pattern:给定要检查的字符串模式;
[!] --hex-string pattern:给定要检查的字符串模式;
~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT
time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]:起始时间;
--timestop hh:mm[:ss]:结束时间;
[!] --monthdays day[,day...]:匹配一个月中的哪些天;
[!] --weekdays day[,day...]:匹配一个周中的哪些天;
~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange --src-range 172.18.100.1-172.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
connlimit:根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;
--connlimit-upto n:连接数量小于等于n则匹配;
--connlimit-above n:连接数量大于n则匹配;
~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
limit:基于令牌桶算法对报文的速率做匹配;
This module matches at a limited rate using a token bucket filter.
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
]# iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
state:是conntrack的子集,用于对报文的状态做连接追踪;
[!] --state state
INVALID:无法识别的连接;
ESTABLISHED:连接追踪模板当中存在记录的连接;
NEW:连接追踪模板当中不存的连接请求;
RELATED:相关联的连接;
UNTRACKED:未追踪的连接;
已经追踪到的并记录下来的连接:
/proc/net/nf_conntrack
连接追踪功能所能够记录的最大连接数量(可调整):
/proc/sys/net/nf_conntrack_max
sysctl -w net.nf_conntrack_max=300000
echo 300000 > /proc/sys/net/nf_conntrack_max
conntrack所能够追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定;已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模板满载时,后续的新连接有可能会超时;解决办法:
(1) 加大nf_conntrack_max的值;
(2) 降低nf_conntrack条目的超时时长;
不同协议的连接追踪时长:/proc/sys/net/netfilter/
本文出自 “涛声依旧” 博客,请务必保留此出处http://zhaoyongtao.blog.51cto.com/10955972/1767819
原文地址:http://zhaoyongtao.blog.51cto.com/10955972/1767819