一.iptables介绍
iptables并不是真正意义上的防火墙,我们可以理解为一个客户端工具,用户通过ipatbles这个客户端,将用户 的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字.NETfilter。 netfilter才是防火墙真正的安全框架,netfilter位于内核空间。
iptables是一个命令行工具,位于用户空间,通过这个命令行工具来操作netfilter。 netfilter/iptables(简称为iptables)组成linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包 过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能
二.iptables的四表五链
表 |
说明 |
filter |
过滤,防火墙 |
nat |
网络地址转换 ;用于修改源ip或目标ip,也可以改端口 |
mangle |
拆解报文,做出修改,并重新封装起来 |
raw |
关闭nat表上启用的连接追踪机制 |
链(内置):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
在实际使用中,我们通常是用表来操作,这里列出表和链的关系:
表 |
链 |
raw |
PREROUTING, OUTPUT |
mangle |
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
nat |
REROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT, |
filter |
INPUT,FORWARD,OUTPUT |
报文流向:
流入本机:PREROUTING --> INPUT
由本机流出:OUTPUT --> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
三.iptables基本用法
规则格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, filter(默认)
COMMAND
链管理:
-F:flush,清空规则链:省略链,表示清空指定表上的所有的链;
-N:new, 自定义一条新的规则链;
-X: delete,删除自定义的规则链;
-Z: zero,清零,置零规则计数器;
注意:仅能删除 用户自定义的 引用计数为0的 空的 链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E: rEname 重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
规则管理
-A:Append,追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和
查看
-L:list, 列出指定鏈上的所有规则;
-n:numberic,以数字格式显示地址和端口号; -v:verbose,详细信息; -vv, -vvv -x:exactly,显示计数器结果的精确值; --line-numbers:显示规则的序号;
chain
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-j targetname(处理动作)
常用规则匹配器
命令用法总结
四.iptables进阶用法
扩展匹配条件:
隐式扩展:在使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制;
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
显示扩展:
iprange扩展模块
用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址。
–src-range:源地址范围
–dst-range:目标地址范围
]# iptables -t filter -I INPUT -m iprange --src-range 192.168.1.128-192.168.1.254 -j DROP
string扩展模块
使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
-m string:表示使用string扩展模块
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但 是我们必须指定一个。
–string:用于指定需要匹配的字符串
]# iptables -t filter -I INPUT -m string --algo bm --string “bit” -j REJECT
time扩展模块
过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。
-m time:表示使用time扩展模块
–timestart:选项用于指定起始时间,00:00:00格式时分秒。
–timestop:选项用于指定结束时间。
–weekdays:选项用于用数字指定星期几,还能用缩写表示,例如:Mon, Tue, Wed,Thu, Fri, Sat, Sun
–monthdays,–datestart,–datestop:指定日期范围
~]# iptables -t filter -I OUTPUT -p TCP --dport 80 -m time --timestart 08:55:00 --timestop 17:00:00 -j REJECT
~]# iptables -t filter -I OUTPUT -p TCP --dport 80 -m time --weekdays 1,2,3,4,5 -j REJECT
~]# iptables -t filter -I OUTPUT -p TCP --dport 8080 -m time -monthdays 1,2 -j REJECT
~]# iptables -t filter -I OUTPUT -p TCP --dport 8080 -m time -datestart 2019-04-20 --datestop 2019-04-21 -j REJECT
connlimit扩展模块
connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就 是针对"每个客户端IP",即对单IP的并发连接数限制。一般和协议、端口配合使用
–connlimit-above:限制连接上限
–connlimit-mask:按照网段限制连接上限
~]# iptables -t filter -I OUTPUT -p TCP --dport 22 -m connlimit -connlimit-above 2 -j REJECT
limit扩展模块
limit模块对"报文到达速率"进行限制,我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限
制。
–limit限制比较有意思,主要用来限制单位时间内可以流入的数据包的数量。
使用"–limit"选项时,可以选择的时间单位有多种,如下 /second /minute /hour /day
~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/min -j REJECT
tcp-flags模块
tcp-flags模块也属于我们之前讲到过的tcp扩展模块中的内容。 --tcp-flags指的就是tcp头中的标志位,看来,在使用iptables时,我们可以通过此扩展匹配条件,去匹配tcp报 文的头部的标识位,然后根据标识位的实际情况实现访问控制的功能。在网络部分我们讲了三次握手,四次挥手,讲 了TCP的包头,这里主要指tcp包头中的标志位,SYN,ACK,FIN,RST,URG,PSH。
他的匹配规则是:“SYN,ACK,FIN,RST,URG,PSH SYN”,怎么来理解,我们可以把这串字符拆成两部分去理解,第一部分为"SYN,ACK,FIN,RST,URG,PSH",第二部分为"SYN"。
第一部分表示:我们需要匹配报文tcp头中的哪些标志位,那么上例的配置表示,我们需要匹配报文tcp头中的6 个标志位,这6个标志位分别为为"SYN、ACK、FIN、RST、URG、PSH",我们可以把这一部分理解成需要匹配的标 志位列表。
第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,上例中,第二部分为SYN,则表示,第一部分 需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0。
~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT #匹配第一次握手
~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT #匹配第二次握手
state扩展
state是一个非常重要的扩展,可以基于连接追踪功能去查看每一报文当前所处的状态。不论什么协议,客户端 第一次访问时,服务器会去内核内存中的追踪表查看他之前是否来过,查不到就证明是第一次来,记录入追踪表,如 果查到以前来过就不检查规则,直接允许访问,这称为连接追踪机制。在访问量特别大的场景下,比如负载均衡服务 器不建议开启,追踪表大只能记录6万多的条目,访问数超过就会无法记录出错,导致所有的连接失败。
报文状态有五种:
NEW: 第一次连接时
ESTABLISHED:已建立的连接;
INVALID:无法识别的连接;
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
UNTRACKED:row表上关闭连接追踪功能
~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT