Linux iptables/Netfilter 防火墙详解
防火墙的概念
1、安全技术
- 入侵检测与管理系统(
Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指导措施和安全决策依据。一般采用旁路部署方式 - 入侵防御系统(
Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式 - 防火墙(
FireWall):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略
2、防火墙的分类
- 主机防火墙:服务范围为当前主机
- 网络防火墙:服务范围为防火墙一侧的局域网
- 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,
Checkpoint,NetScreen - 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
- 网络层防火墙:OSI模型下四层
- 应用层防火墙/代理服务器:代理网关,OSI模型七层
3、网络层防火墙
- 包过滤防火墙
- 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
- 优点:对用户来说透明,处理速度快且易于维护
- 缺点:无法检查应用层数据,如病毒等

4、应用层防火墙
应用层防火墙/代理服务型防火墙(Proxy Service):
- 将所有跨越防火墙的网络通信链路分为两段
- 内外网用户的访问都是通过代理服务器上的“链接”来实现
- 优点:在应用层对数据进行检查,比较安全
- 缺点:增加防火墙的负载
- 现实生产环境中所使用的防火墙一般都是二者结合体:即先检查网络数据,通过之后再送到应用层去检查

iptables 基本认识
1、iptables 概念
iptables 是一种包过滤型的防火墙工具。
Firewall(防火墙,隔离工具)是工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件。
iptables 是命令行工具,工作在用户空间;用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包。
firewalld 是 CentOS7 引入了新的前端管理工具(简单了解即可),有两种管理工具:
- firewall-cmd 命令行
- firewall-config 图形
2、Netfilter 组件
- 内核空间,集成在linux内核中(iptables 命令直接作用于内核空间,配置完毕后立即生效,但是重启后,需要重新进行配置)
- 扩展各种网络服务的结构化底层框架
- 内核中选取五个位置放了五个hook(勾子) function(
INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则 - 由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
3、三种报文流向
- 流入本机:
PREROUTING --> INPUT--> 用户空间进程 - 流出本机:
用户空间进程 --> OUTPUT --> POSTROUTING - 本机转发:
PREROUTING --> FORWARD --> POSTROUTING
4、iptables 的组成
iptables 由五个表和五个链以及一些规则组成:
4.1 五表(table)
五个表table:filter、nat、mangle、raw、security。
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
- filter:过滤规则表,根据预定义的规则过滤符合条件的数据包
- nat:
network address translation地址转换规则表,用于修改源IP或目标IP,也可以改端口 - mangle:修改数据标记位规则表,拆解报文,做出修改,并重新封装起来
- raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
- security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
4.2 五链(chain)
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
4.3 五表五链的对应关系(常用是 raw 和 filter)
raw # PREROUTING, OUTPUT
mangle # PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat # PREROUTING,[INPUT,]OUTPUT,POSTROUTING
filter # INPUT,FORWARD,OUTPUT
security #

4.4 通过 CLI 查看五表五链的对应关系
[root@neo ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@neo ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@neo ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@neo ~]# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@neo ~]# iptables -t security -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
4.5 数据包过滤匹配流程
结合数据包过滤匹配流程,在合适的配置上配置合适的表,在合适的表上配置合适的链,再合适的链上配置合适的规则,进而实现包过滤的防火墙功能。

4.6 路由功能发生的时间点
-
报文进入本机后
判断目标主机是否为本机 # 是:INPUT # 否:FORWARD -
报文离开本机之前
判断由哪个接口送往下一跳

4.7 内核中数据包的传输过程
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
- 如果数据包就是进入本机的,数据包就会到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
- 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
4.8 iptables 规则
-
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
匹配条件:默认为“与条件”,同时满足所有匹配条件才会执行后面的处理动作 基本匹配:IP,端口,TCP的Flags(SYN,ACK等) 扩展匹配:通过复杂高级功能匹配 处理动作:称为target,跳转目标 内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG... 自定义处理动作:自定义chain,利用分类管理复杂情形 -
规则要添加在链上,才生效;添加在自定义上不会自动生效(需要引用才会生效)
-
链chain:
内置链:每个内置链对应于一个钩子函数 自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制 只有Hook钩子调用自定义链时,才生效
4.9 iptables 添加要点
-
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上 报文流经的路径:判断添加在哪个链上 报文的流向:判断源和目的 匹配规则:业务需要 -
实验环境准备
Centos7: systemctl stop firewalld.service # 停止 firewall 服务 systemctl disable firewalld.service # 禁止开机启动 firewall 服务 Centos6: service iptables stop chkconfig iptables off
iptables / netfilter 的规则
1、组成部分
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理。
-
匹配条件
基本匹配条件:内建 扩展匹配条件:由扩展模块定义 -
处理动作
基本处理动作:内建 扩展处理动作:由扩展模块定义 自定义处理机制:自定义链 -
iptables的链:内置链和自定义链
内置链:对应于hook function 自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制
2、添加规则时的考量点
- 要实现哪种功能:判断添加到哪个表上
- 报文流经的路径:判断添加到哪个链上
3、链上的规则次序
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
- (1) 同类规则(访问同一应用),匹配范围小的放上面
- (2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面
- (3) 将那些可由一条规则描述的多个规则合并起来
- (4) 设置默认策略
iptables 命令介绍
高度模块化,由诸多扩展模块实现其检查条件或处理动作的定义:
# /usr/lib64/xtables/
IPv6:libip6t_
IPv4:libipt_, libxt_
帮助手册:
[root@neo ~]# man iptables
常用命令:
iptables [-t table] {
-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {
-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
命令规则格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
1、-t table
table 默认选项是 filter
# raw
# mangle
# nat
# [filter] 默认值,可不写
2、COMMAND
2.1 链管理
-N # new, 自定义一条新的规则链
-X # delete,删除自定义的规则链
注意:仅能删除 用户自定义的 引用计数为0的 空的 链
-P # Policy,设置默认策略;对filter表中的链而言,其默认策略有
# ACCEPT # 接受
# DROP # 丢弃
# REJECT # 拒绝
注意:在修改前,要注意是否会对你现有的访问造成影响
比如:当前使用的ssh连接,把INPUT的默认方式改为 DROP 的话,ssh就会失去连接
规避:可使用 at 命令来配合自己当前的操作,可以取消自己的配置命令
-E # 重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
示例:
[root@neo ~]# iptables -nvL # 不指定具体表的情况下,默认表是 filter
Chain INPUT (policy ACCEPT 7516 packets, 660K bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 226 packets, 19668 bytes)
pkts bytes target prot opt in out source destination
[root@neo ~]# iptables -N in_web # 新创建一条新的规则链
[root@neo ~]# iptables -nvL
Chain INPUT (policy ACCEPT 5 packets, 448 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4 packets, 480 bytes)
pkts bytes target prot opt in out source destination
Chain in_web (0 references)
pkts bytes target prot opt in out source destination
[root@neo ~]# iptables -E in_web in_web_rules # 修改链名称
[root@neo ~]# iptables -nvL
Chain INPUT (policy ACCEPT 121 packets, 10467 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 9 packets, 848 bytes)
pkts bytes target prot opt in out source destination
Chain in_web_rules (0 references)
pkts bytes target prot opt in out source destination
[root@neo ~]# iptables -X in_web_rules # 删除规则链
[root@neo ~]# iptables -nvL
Chain INPUT (policy ACCEPT 15 packets, 1343 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 648 bytes)
pkts bytes target prot opt in out source destination
2.2 规则管理
-A # append,追加,放在链的尾部
-I # insert, 插入,要指明位置,省略时表示第一条
-D # delete,删除,后面可指明规则序号和规则本身
-R # replace,替换指定链上的指定规则
-F # flush,清空指定的规则链(后面不跟参数的话,会清空所有的规则链)
-Z # zero,置零规则链的技术器
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
示例:
I(可指明插入位置,默认值是 1 ) 和 A(追加,放在链的尾部)的区别:
[root@neo ~]# iptables -t filter -L OUTPUT -nv
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
476 55948 ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
1279 76740 ACCEPT icmp -- * * 172.16.141.252 0.0.0.0/0
0 0 DROP all -- * * 172.16.141.252 0.0.0.0/0
[root@neo ~]# iptables -t filter -A OUTPUT -s 172.16.141.252 -p tcp --sport 23
[root@neo ~]# iptables -t filter -L OUTPUT -nv
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1464 115K ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
1279 76740 ACCEPT icmp -- * * 172.16.141.252 0.0.0.0/0
339 24108 DROP all -- * * 172.16.141.252 0.0.0.0/0
0 0 tcp -- * * 172.16.141.252 0.0.0.0/0 tcp spt:23
[root@neo ~]# iptables -t filter -I OUTPUT 2 -s 172.16.141.252 -p tcp --sport 24
[root@neo ~]# iptables -t filter -L OUTPUT -nv
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1802 155K ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
0 0 tcp -- * * 172.16.141.252 0.0.0.0/0 tcp spt:24
1279 76740 ACCEPT icmp -- * * 172.16.141.252 0.0.0.0/0
340 24184 DROP all -- * * 172.16.141.252 0.0.0.0/0
0 0 tcp -- * * 172.16.141.252 0.0.0.0/0 tcp spt:23
2.3 查看
-L # list, 列出指定鏈上的所有规则;
查看命令 -L 的选项:
-n # numberic,以数字格式显示地址和端口号(不进行反解)
-v # verbose,详细信息
-vv, -vvv
-x # exactly,显示计数器结果的精确值
--line-numbers # 显示规则的序号
-S # selected,以iptables-save 命令格式显示链上规则
常用组合:(使用组合时,L要放在最后面,因为L是命令,其它是选项)
# -vnL
# -vvnxL--line-numbers
示例:
[root@neo ~]# iptables -t filter -R OUTPUT 5 -s 172.16.141.252 -d 172.16.141.222 -p tcp --sport 222 --dport 222
[root@neo ~]# iptables -t filter -L OUTPUT -nv
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2002 178K ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
0 0 tcp -- * * 172.16.141.252 0.0.0.0/0 tcp spt:24
1279 76740 ACCEPT icmp -- * * 172.16.141.252 0.0.0.0/0
345 24528 DROP all -- * * 172.16.141.252 0.0.0.0/0
0 0 tcp -- * * 172.16.141.252 172.16.141.222 tcp spt:222 dpt:222
[root@neo ~]# iptables -t filter -L OUTPUT --line-number -nv
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 2162 195K ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
2 0 0 tcp -- * * 172.16.141.252 0.0.0.0/0 tcp spt:24
3 1279 76740 ACCEPT icmp -- * * 172.16.141.252 0.0.0.0/0
4 377 26868 DROP all -- * * 172.16.141.252 0.0.0.0/0
5 0 0 tcp -- * * 172.16.141.252 172.16.141.222 tcp spt:222 dpt:222
[root@neo ~]# iptables -t filter -D OUTPUT 2
[root@neo ~]# iptables -t filter -D OUTPUT 4
[root@neo ~]# iptables -t filter -L OUTPUT --line-number -nv
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 2240 205K ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
2 1279 76740 ACCEPT icmp -- * * 172.16.141.252 0.0.0.0/0
3 377 26868 DROP all -- * * 172.16.141.252 0.0.0.0/0
[root@neo ~]# iptables -t filter -P INPUT ACCEPT
[root@neo ~]# iptables -t filter -P OUTPUT ACCEPT
[root@neo ~]# iptables -t filter -P FORWARD ACCEPT
[root@neo ~]# iptables -nvL
Chain INPUT (policy ACCEPT 33 packets, 2734 bytes)
pkts bytes target prot opt in out source destination
5089 464K ACCEPT tcp -- * * 172.16.141.0/24 172.16.141.252 tcp dpt:22
309 18540 ACCEPT icmp -- * * 172.16.141.99 172.16.141.252 icmptype 8 limit: avg 2/min burst 5
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
4003 486K ACCEPT tcp -- * * 172.16.141.252 172.16.141.0/24 tcp spt:22
355 21300 ACCEPT icmp -- * * 172.16.141.252 172.16.141.99 icmptype 0
[root@neo ~]# iptables -F
[root@neo ~]#
[root@neo ~]# iptables -nvL
Chain INPUT (policy ACCEPT 9 packets, 724 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 7 packets, 736 bytes)
pkts bytes target prot opt in out source destination
2、chain
# PREROUTING
# INPUT
# FORWARD
# OUTPUT
# POSTROUTING
3、匹配条件
3.1 基本匹配条件
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供。
[!] -s, --source address[/mask][,...]
# 检查报文中的源IP地址是否符合此处指定的地址或范围
[!] -d, --destination address[/mask][,...]
# 检查报文中的目标IP地址是否符合此处指定的地址或范围(所有地址:0.0.0.0/0)
[!] -p, --protocol protocol
# protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
# 多协议表示:{
tcp|udp|icmp}
# 参看:/etc/protocols
[!] -i, --in-interface name
# 数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链
[!] -o, --out-interface name
# 数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链
3.2 扩展匹配条件
-
隐式扩展:在使用 -p 选项指明了特定的协议时,无需再同时使用 -m 选项指明扩展模块的扩展机制
# 比如使用了 -p 指明 tcp 协议的时候,就相当于指明了一些扩展模块,不需要再单独指明 [root@neo ~]# rpm -ql iptables | grep -i tcp /usr/lib64/xtables/libxt_TCPMSS.so /usr/lib64/xtables/libxt_TCPOPTSTRIP.so /usr/lib64/xtables/libxt_tcp.so /usr/lib64/xtables/libxt_tcpmss.so -
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,
[-m matchname [per-match-options]]
隐式扩展
不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用 -p 指明了协议,就表示已经指明了要扩展的模块。
1、tcp
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围(只能指定连续端口)
[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围
[!] --tcp-flags mask comp
# mask is the flags which we should examine, written as a comma-separated list
# mask 需检查的标志位列表,用 , 分隔
例如 SYN,ACK,FIN,RST
# comp is a comma-separated list of flags which must be set
# comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用 , 分隔
例如SYN
# 例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个
其中SYN必须为1,余下的必须为0,常用于匹配TCP连接
[!] --syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
# 连接追踪时使用
2、udp
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围
3、icmp
[!] --icmp-type {
type[/code]|typename}
# echo-request:8 # icmp 请求报文
# echo-reply:0 # icmp 回复报文
显式扩展
必须使用-m选项指明要调用的扩展模块的扩展机制,[-m matchname [per-match-options]]
1、multiport
以离散或连续的 方式定义多端口匹配条件,最多15个。
[!] --source-ports,--sports port[,port|,port:port]...
# 指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]...
# 指定多个目标端口
示例:
iptables-A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp-m multiport --dports20:22,80 -j ACCEPT
2、iprange
指明连续的(但一般不是整个网络)ip地址范围。
[!] --src-range from[-to] # 源IP地址范围
[!] --dst-range from[-to] # 目标IP地址范围
示例:
iptables-A INPUT -d 172.16.1.100 -p tcp--dport80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
3、mac
指明源MAC地址,适用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
iptables-A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables-A INPUT -s 172.16.0.100 -j REJECT
4、string
对报文中的应用层数据做字符串模式匹配检测。
--algo {
bm|kmp} # 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset # 开始偏移
--to offset # 结束偏移
[!] --string pattern # 要检测的字符串模式
[!] --hex-string pattern # 要检测字符串模式,16进制格式
示例:(可使用 http 应用进行验证(https不可用,因为https会对数据进行加密))
# iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp--sport 80 -m string --algo bm --string “google" -j REJECT
# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT
# tcpdump -i enp1s0 -nn tcp port 80 # 常用抓包命令
5、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...] # 星期几,1 –7 分别表示星期一到星期日
--kerneltz # 内核时区,不建议使用,CentOS7系统默认为UTC
示例:
# iptables-A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp--dport80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun--kerneltz-j DROP
6、connlimit
根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击。
--connlimit-upto n # 连接的数量小于等于 n 时匹配
--connlimit-above n # 连接的数量大于 n 时匹配
通常分别与默认的拒绝或允许策略配合使用
示例:(可使用 mysql 进行验证)
# iptables-A INPUT -d 172.16.100.10 -p tcp--dport22 -m connlimit --connlimit-above 2 -j REJECT
# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
# 小于等于 2 个连接被允许,大于等于3个就去匹配默认的规则(默认规则是丢弃,就丢弃)
7、limit
限速,从报文的发包速率来限制。
--limit rate[/second|/minute|/hour|/day] # 包速率
--limit-burst number # 令牌桶大小
限制本机某tcp服务接收新请求的速率:--syn, -m limit
示例:(可使用 ping 来进行测试(默认是每秒一个请求)8 是请求 0 是响应)
# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT
# iptables -I INPUT 6 -d 172.16.141.252 -p icmp --icmp-type 8 -m limt --limit-burst 5 --limit 20/minute -j ACCEPT
# 每分钟20个包,每3秒一个包
# iptables -I OUTPUT 6 -s 172.16.141.252 -p icmp --icmp-type 0 -j ACCEPT
8、state
conntrack 连接追踪,并发访问量大的主机上不建议开启,不然会造成大量新请求无法连接成功。
根据连接状态可以定义进栈和出栈的状态,大大增强安全性。
根据”连接追踪机制“去检查连接的状态,较耗资源。
[!] --state state
# INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
状态介绍:
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
已经追踪到的并记录下来的连接信息库
# /proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
# /proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长
# /proc/sys/net/netfilter/
注意
# CentOS7 需要加载模块:modprobe nf_conntrack
加载 state 模块:(CentOS 7)
[root@neo ~]# modinfo nf_conntrack_ftp # 只有有这个模块才能追踪 RELATED 状态,需要手动装载
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko.xz
alias: nfct-helper-ftp
alias: ip_conntrack_ftp
description: ftp connection tracking helper
author: Rusty Russell <rusty@rustcorp.com.au>
license: GPL
retpoline: Y
rhelversion: 7.6
srcversion: 83D9304C9B64D8FBC064040
depends: nf_conntrack
intree: Y
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo: sha256
parm: ports:array of ushort
parm: loose:bool
[root@neo ~]# modprobe nf_conntrack_ftp
[root@neo ~]# lsmod | grep nf_conntrack_ftp
nf_conntrack_ftp 18638 0
nf_conntrack 133095 4 nf_nat,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
[root@neo ~]# ls /proc/sys

最低0.47元/天 解锁文章
2816

被折叠的 条评论
为什么被折叠?



