最通俗易懂的iptables防火墙介绍

说到防火墙,我们先来搞搞防火墙是什么东西吧!相信大家日常生活中一定听过“”之类的词汇吧,墙到底是什么呢?

防火墙

重点来了!!!防火墙技术 是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。。。

度娘总是这么善解人意,可是麻烦度娘下次说人话,Ok?

通俗的说法也就是自己家外面的墙,防止小偷之类的,以保证我们的安全,我们自己要出去,肯定从“门”走,而那些小偷、黑客就得夜半时分偷偷喽!计算机也就是我们的家,当然也有大“家”,比如公司内网,学校内网

防火墙分类:【逻辑上】

分类 说明
主机防火墙 针对单个主机进行防护
网络防火墙 处于网络入口或者边缘,针对网络入口进行防护,服务于防火墙背后的本地局域网

iptables与防火墙的关系

iptables 并不是真正意义上的防火墙,我们可以理解为一个客户端工具,用户通过ipatbles这个客户端,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter。 哦,也就是给门上面安装密码、指纹、人脸识别之类的,你符合我的要求,才能进去!!!

netfilter才是防火墙真正的安全框架,netfilter位于内核空间。

iptables是一个命令行工具,位于用户空间,通过这个命令行工具来操作netfilter。

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

哦,废话真多,不过还没讲完,我们要想设置自己家的密码,首先还得知道,如果==“来者”符合这样的条件,就得这样处理这个数据包==

条件是什么呢?就是规则,也就是我们的接头暗号,哈哈哈。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等

==当然不管你是否符合暗号,我们的墙都得对你做出一些反应,比如说:滚!或者进来吧。也就是放行(accept)、拒绝(reject)和丢弃(drop)等。==我们配置防火墙的主要工作就是添加、修改和删除这些规则。

了解了这些,我们就来康康外面的人到底是怎么通过“墙”的。
报文的流向: 到本机某进程的报文:PREROUTING --> INPUT 由本机转发的报文:PREROUTING --> FORWARD–> POSTROUTING 由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

上面这些讨厌的英文单词就是“”,这个是很重要的规则集结地。当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链"

前面讲了链,我们在链上放了各种规则,那么这些规则是不是可以合并呢,比如A规则是限制ip地址访问,B规则也是限制ip地址访问,我们把相同功能的一些规则合并。这样来简化操作。

我们把具有相同功能的规则的集合叫做“”,不同的规则放置于不同的表中工作,在iptables中定义了四种表,每种表对应不同的功能。

说明
filter表 负责过滤功能,防火墙;内核模块:iptables_filter
nat表 network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表 拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表 关闭nat表上启用的连接追踪机制;iptable_raw

表和链的关系

表(功能) 链(钩子)
raw REROUTING,OUTPUT
mangle REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat REROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
filter INPUT,FORWARD,OUTPUT

iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。
优先级次序(由高而低):raw --> mangle --> nat --> filter

除了上面讲的规则外,我们还有一些常见的规则与处理方式:

匹配条件

基本匹配条件 扩展匹配条件
源地址 Source IP 源端口 Source Port
目标地址 Destintion IP m目标端口 Destination Port

处理动作

动作 含义
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
SNAT 源地址转换,解决内网用户用同一个公网地址上网的问题
MASQUERADE 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
DNAT 目标地址转换
REDIRECT 在本机做端口映射
LOG 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配

iptables命令详解

常用选项 说明
-A 在指定链尾部添加规则
-D 删除匹配的规则
-R 替换匹配的规则
-I 在指定位置插入规则(例:iptables -I INPUT 1 --dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上)
-L/S 列出指定链或所有链的规则
-F 删除指定链或所有链的规则
-N 创建用户自定义链[例:iptables -N allowed]
-X 删除指定的用户自定义链
-P 为指定链设置默认规则策略,对自定义链不起作用
-Z 将指定链或所有链的计数器清零
-E 更改自定义链的名称[例:iptables -E allowed disallowed]
-n ip地址和端口号以数字方式显示[例:iptables -nL]

常见设置参数介绍

参数 作用
–dport 指定目标TCP/IP端口 如 –dport 80
–sport 指定源TCP/IP端口 如 –sport 80
-p tcp 指定协议为tcp
-p icmp 指定协议为ICMP
-p udp 指定协议为UDP
-j DROP 拒绝
-j ACCEPT 允许
-j REJECT 拒绝并向发出消息的计算机发一个消息
-j LOG 在/var/log/messages中登记分组匹配的记录
-m mac –mac 绑定MAC地址
-m limit –limit 1/s 1/m 设置时间策列
-s 192.168.1.153或192.168.1.0/24 指定源地址或地址段
-d 192.168.1.153或192.168.1.0/24 指定目标地址或地址段
-s ! 192.168.1.0 指定源地址以外的

OK,前面说了这么多,我都看的天花乱坠瞌睡的不行不行了,下面我们来讲实际操作,简单上手,走起!

(1)首先,我们先查看已有的规则:

[root@localhost ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
#-t选项指定操作的表,默认不指定-t选项时默认就是filter表
#英文单词chain意思就是链
#前面我们讲了四表五链,在这里我们看到有三条链,分别是INPUT,FORWARD,OUTPUT,每条链都有自己的规则

(2)如何来清除已有规则?

[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -nL
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
#在这里,我们用-F选项清除了所有规则,若是只删除一条规则,我们可以用-D来删除,也可以用-R来替换规则

(3)增加一条简单的规则:

[root@localhost ~]# iptables -t filter -I INPUT -s 192.168.1.51 -j DROP   #丢弃来自于192.168.1.51的数据包
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  192.168.1.51         0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@localhost ~]# ping 192.168.1.151   #此时已ping不通了
PING 192.168.1.151 (192.168.1.151) 56(84) bytes of data.
^C   #这里我用CTRL+c来强制退出
--- 192.168.1.151 ping statistics ---
13 packets transmitted, 0 received, 100% packet loss, time 12385ms
#选项说明
-t:指定操作的表
-I:指定插入规则到那个链中
-s:指定“匹配条件”中的源地址
-j:指定“匹配条件”中的动作
Chain INPUT (policy ACCEPT 7 packets, 613 bytes)
pkts bytes target   prot opt in   out   source        destination    
  0  0  ACCEPT   all  -- *   *    192.168.1.51     0.0.0.0/0     
1652 139K DROP    all  -- *   *    192.168.1.51     0.0.0.0/0 
#若是我们添加了这样的规则,就会发现又可以ping通了,这是什么原因呢?
#在这里有一个规则顺序问题,所有的匹配从第一条规则开始,如果前面已经drop了,也就不存在放行了。

怎么样,我们已经可以设置简单的规则了,哈哈哈!下面我们就来看看进阶用法:

1、iprange扩展模块

使用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址。

iprange扩展模块中有两个扩展匹配条件可以使用:
–src-range:源地址范围
–dst-range:目标地址范围

示例:

[root@localhost ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.1.128-192.168.1.254 -j DROP
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0           source IP range 192.168.1.128-192.168.1.254

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

2、string扩展模块

使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。

-m string:表示使用string扩展模块
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但
是我们必须指定一个。
–string:用于指定需要匹配的字符串。

[root@localhost ~]# iptables -t filter -I INPUT -m string --algo kmp --string "bit" -j REJECT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           STRING match "bit" ALGO name kmp TO 65535 reject-with icmp-port-unreachable
...
#网站中有敏感字符串XXX时,用户访问不让响应

3、time扩展模块

过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。

-m time:表示使用time扩展模块

  • –timestart:选项用于指定起始时间,00:00:00格式时分秒。
  • –timestop:选项用于指定结束时间。
  • –weekdays:选项用于用数字指定星期几,还能用缩写表示,例如:Mon, Tue, Wed,Thu, Fri, Sat, Sun
  • –monthdays,–datestart,–datestop:指定日期范围

4、connlimit扩展模块

connlimit扩展模块,可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对"每个客户端IP",即对单IP的并发连接数限制。一般和协议、端口配合使用

  • –connlimit-above:限制连接上限
  • –connlimit-mask:按照网段限制连接上限

5、limit扩展模块

limit模块对"报文到达速率"进行限制,我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。

–limit限制比较有意思,主要用来限制单位时间内可以流入的数据包的数量。
使用"–limit"选项时,可以选择的时间单位有多种,如下 /second /minute /hour /day

#对每分钟可以流入的包的数量做限制,下面例子可以看到每6秒允许有一个包流入,并且默认开始可以容纳5个包流入
#在这里使用到了令牌桶原理:大小固定的令牌桶可以以恒定的速率源源不断的产生新的令牌,如果令牌不被消耗,或者消耗速度小于产生速度,令牌就会不断增多,直到将令牌桶填满,后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -m limit --limit 10/min -j ACCEPT
[root@nebulalinux03 ~]# iptables -t filter -A INPUT -p icmp -j REJECT
[root@nebulalinux03 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 5 packets, 344 bytes)
pkts bytes target   prot opt in   out   source        destination
 11  680 ACCEPT   all  -- *   *    0.0.0.0/0       0.0.0.0/0     
limit: avg 10/min burst 5
  0   0 REJECT   icmp -- *   *    0.0.0.0/0       0.0.0.0/0     
reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target   prot opt in   out   source        destination

Chain OUTPUT (policy ACCEPT 5 packets, 472 bytes)
pkts bytes target   prot opt in   out   source        destination
[root@nebulalinux02 ~]# ping 192.168.1.151
PING 192.168.1.151 (192.168.1.151) 56(84) bytes of data.
64 bytes from 192.168.1.151: icmp_seq=1 ttl=64 time=0.779 ms
64 bytes from 192.168.1.151: icmp_seq=2 ttl=64 time=0.622 ms
64 bytes from 192.168.1.151: icmp_seq=3 ttl=64 time=0.448 ms
64 bytes from 192.168.1.151: icmp_seq=4 ttl=64 time=6.82 ms
64 bytes from 192.168.1.151: icmp_seq=5 ttl=64 time=0.831 ms
From 192.168.1.151 icmp_seq=6 Destination Port Unreachable
64 bytes from 192.168.1.151: icmp_seq=7 ttl=64 time=0.524 ms
From 192.168.1.151 icmp_seq=8 Destination Port Unreachable
From 192.168.1.151 icmp_seq=9 Destination Port Unreachable
From 192.168.1.151 icmp_seq=10 Destination Port Unreachable
From 192.168.1.151 icmp_seq=11 Destination Port Unreachable
From 192.168.1.151 icmp_seq=12 Destination Port Unreachable
64 bytes from 192.168.1.151: icmp_seq=13 ttl=64 time=0.680 ms
From 192.168.1.151 icmp_seq=14 Destination Port Unreachable
From 192.168.1.151 icmp_seq=15 Destination Port Unreachable
From 192.168.1.151 icmp_seq=16 Destination Port Unreachable
From 192.168.1.151 icmp_seq=17 Destination Port Unreachable
From 192.168.1.151 icmp_seq=18 Destination Port Unreachable
64 bytes from 192.168.1.151: icmp_seq=19 ttl=64 time=1.04 ms
From 192.168.1.151 icmp_seq=20 Destination Port Unreachable
From 192.168.1.151 icmp_seq=21 Destination Port Unreachable
^C
--- 192.168.1.151 ping statistics ---
21 packets transmitted, 8 received, +13 errors, 61% packet loss, time 20035ms
rtt min/avg/max/mdev = 0.448/1.468/6.825/2.032 ms

#在这里正是使用了令牌桶原理,上面的例子中,默认令牌桶数量是5个,每6秒产生一个令牌,在我们ping操作时,前五次没有任何影响,只是消耗了所有的令牌,从第6秒开始产生新的令牌,这时候我们可以ping通,再要ping通需要等6秒再产生一个新的令牌。

–limit-burst:显示令牌桶大小,默认是5

[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 10 --limit 10/min -j ACCEPT
#令牌桶中最多10块,每6秒产生一块

6、tcp-flags模块

–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。

#匹配三次握手的时候的标志
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags
SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT #匹配第一次握手
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags
SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT #匹配第二次握手

#简写
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flagsALL SYN -j REJECT
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flagsALL SYN,ACK -j REJECT

#--syn也代表第一次握手
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -jREJECT

7、state扩展

state是一个非常重要的扩展,可以基于连接追踪功能去查看每一报文当前所处的状态

不论什么协议,客户端第一次访问时,服务器会去内核内存中的追踪表查看他之前是否来过,查不到就证明是第一次来,记录入追踪表,如果查到以前来过就不检查规则,直接允许访问,这称为连接追踪机制。

在访问量特别大的场景下,比如负载均衡服务器不建议开启,追踪表最大只能记录6万多的条目,访问数超过就会无法记录出错,导致所有的连接失败。

报文状态有五种:

  • NEW: 第一次连接时
  • ESTABLISHED:已建立的连接;
  • INVALID:无法识别的连接;
  • RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
  • UNTRACKED:row表上关闭连接追踪功能
[root@nebulalinux03 ~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j
ACCEPT
[root@nebulalinux03 ~]# iptables -t filter -A INPUT -j REJECT

#原有连接和新建连接是什么状态呢
#原有连接不受影响
#新建连接被拒绝

至此,基本及常用内容就说到这里,有关nat转发以及后续相关内容还会继续补充的!!!烦请大佬不吝赐教

你可能感兴趣的:(最通俗易懂的iptables防火墙介绍)