一.  防火墙基本概述

 1.    什么是防火墙?

         ‘因特网’把世界各地的计算机都紧密的连接在一起,如果我们不严加防卫,一旦网络被侵害,可能出现不可预计的损失,那么在互联网上,我们会采用防火墙的方法来保护我们的网站不受外来攻击或侵害,为此我们需要设定防火墙规则,确定哪些类型的数据允许通过,哪些不允许通过。那么具有这种功能的设备或者软件就称为‘防火墙’。

2.    防火墙种类

 ·  从逻辑上将,防护墙可以大体分为主机防火墙和网络防护墙
        主机防护墙:针对单台主机进行防护;
        网络防火墙:往往处于网络入口边缘,针对于网络入口进行防护,服务于防火墙背后的服务器集群。

·  从物理上讲,防火墙分为硬件防火墙和软件防火墙
        硬件防火墙:在硬件级别实现部分防护墙的功能,另一部分功能基于软件实现,性能高,成本高。
        软件防火墙:以软件的方式模拟防火墙,运行在操作系统之上,性能不高,成本较低。接下来所说的iptables就是软件防火墙。

二.  iptables概述

1.    什么是iptables?

         iptables其实不是真正的防火墙,我们可以把它理解为一个代理程序,用户通过iptables这个代理程序,将安全规则执行到对应的安全框架中,这个安全框架才是正常的防火墙;这个框架叫netfilter。
        netfilter位于操作系统内核空间,iptables位于操作系统的用户空间,后面我们是通过iptables命令工具操作netfilter内核框架。 015c7eb60f154b61862d766b2ae14418.png

 netfilter/iptables是linux平台下的“包过滤防火墙“,这个包过滤防火墙可以完成数据包过滤,网络地址装换(NAT)等功能。

2.    什么是 包过滤防火墙

 ·   包过滤防火墙他在网络层截获网络数据包的包头(header),它针对数据包的包头,根据预先定义好的防火墙过滤规则进行比对,与规则相匹配的包会被放行,与规则不匹配的包则可能被丢弃,也可能进行更加复杂的动作。

·   包过滤防火墙一般作用在网络层,也称为网络层防火墙,通过检查数据流中的没一个数据包的源ip、源端口、目的ip、目的端口、协议类型(TCP、UDP、ICMP)、状态等信息来判断是否符合规则。

3.    包过滤防火墙如何实现

         包过滤防火墙是由netfilter来实现的,他是内核的一部分,所以如果要达到防火的功能,需要在内核中设置关卡,所有进出的报文都要经过关卡,进行检查,将符合条件放行,不符合条件阻止,而所谓的关卡在iptables中被称为“链”。

三.   iptables链的概念 

 1.    什么是链

         防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样  ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

59530e41a61c47339755b43b4b5def78.png

 2.    iptables有哪些链

 当我们启用了防火墙功能时,报文需要经过肯定关卡,也就是说根据实际情况的不同,报文经过的链可能就不同,比如请求本机经过哪些链,经过本机经过哪些链,从本机出发又经过哪些链。

46306c67a9c74e0e8bf5e629eac4efb1.png

 通过上图总结iptables总共有五条链:分别为PRE_ROUTING、INPUT、FORWARD、POST_ROUTING、OUTPUT。

 3.    iptables中链的场景

0739476804024276a59f9f9cc46436dc.png

 所以,根据上图,我们能够想象出某些常用场景中,报文的流向:

        到本机某进程的报文:PREROUTING --> INPUT
        由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
        由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

四.     表的概念 

 1.    什么是表?

 ·  我们对每个链上放置了一串规则,但是这些规则有些很相似,比如A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起?

·  因此我们把具有相同功能规则的集合叫做‘表’,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4中表,每种表对应了不同的功能。

2.    表的功能

表名作用包含的链
filter负载过滤功能INPUT, OUTPUT, FORWARD
nat负载网络地址转换功能PER_ROUTING, INPUT, OUTPUT, POSTROUTING
mangle负责修改数据包内容INPUT, OUTPUT, FORWARD, POST_ROUTING, PRE_ROUTING
raw关闭nat表上启用的连接追踪机制PRE_ROUTING, OUTPUT

 3.    表与链的关系

745053154c754cf9bdaeb17c7ee9f451.png

 五.   iptables规则管理

 1.    什么是规则

         数据包的过滤基于规则,而规则有匹配条件+动作组成,那么我们对规则的操作就是增,删改。iptables的语法:iptables   [-t   表名]   选项    [链名]   [规则]   [动作]

        操作规则的考量点:
        1)要实现什么功能,判断添加到哪个表上;
        2)报文流经的路线,判断添加到哪个链上。

iptables选项含义示例
-t,  --table指定要操作的表(默认为为filter)iptables   -t    filter
-A,  --append 追加一条规则至链的末尾iptables  -t  filter  -A INPUT
-I,  --insert插入一条规则至链的顶部iptables  -t  filter  -I INPUT
-D,  --delete指定删除一条规则iptables -t  filter  -D INPUT 1
-R,  --replace替换选定链中的规则iptables  -t  filter  -R INPUT
-S,  --list-rules打印选定链中所以的规则iptables  -t  filter -S
-F, --flush清空链中所有规则iptables  -t  filter -F
-Z,  --zero将所有链中的数据包和字节计数器归零iptables  -t  filter  -Z
-N,  --new-chain创建自定义名称规则链iptables  -N  New_rules
-E,  --rename-chain给自定义链修改名称iptables  -E  old_rules  new_rules
-X,  --delete-chain删除自定义链iptables  -X  Rules_name
-P,  --policy给链定义默认策略iptables -t  -P Drop

 2.    如何查看规则

-t  指定表名
-L  查看详情
-n  不反解
-v  详细信息
--line-numbers  显示规则编号

root@uos-PC:~# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 

3.   如何增加规则

允许所有的主机ping通本机 

root@uos-PC:~# iptables -t filter -A INPUT -p icmp -j ACCEPT
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 

 4.    如何修改规则

修改规矩,拒绝所有主机ping通本机 

root@uos-PC:~# iptables -t filter -R INPUT 1 -p icmp -j DROP
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 

 5.    如何删除规则

方法一:根据规则的编号删除规则
方法二:根据具体匹配的条件与动作删除规则  

root@uos-PC:~# iptables -t filter -D INPUT 1
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 

6.   如何保存规则

 默认iptables属临时生效,因此需要将规则保存起来

root@uos-PC:~# iptables-save > /etc/iptables.rules
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# cat /etc/iptables.rules 
# Generated by xtables-save v1.8.2 on Thu Sep 22 14:34:47 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
COMMIT
# Completed on Thu Sep 22 14:34:47 2022
root@uos-PC:~# 

清空规则之后在恢复

root@uos-PC:~# iptables -F 
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 
root@uos-PC:~# 

root@uos-PC:~# iptables-restore < /etc/iptables.rules 
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-number
Chain INPUT (policy ACCEPT 61 packets, 27700 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

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

Chain OUTPUT (policy ACCEPT 39 packets, 5012 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 

六.    iptables基本匹配 

 iptables的更多匹配条件

1.   匹配参数

条件参数含义
-p,  --protocol  protocol指明需要匹配的协议,如icmp,tcp,udp
-s,  --source  address/mask指定匹配源地址,如果有多个可以逗号隔开
-d,  --destination address/mask指定匹配目标地址,如有多个可以逗号分开
--source-port, --sport  port 指定源端口
--destination-port,--dport port指定目的端口
-i,--in-interface  name接收数据包的接口名称
-o,--out-interface  name 发出数据包的接口名称
-m,--match  match执行需要使用的匹配项,属于扩展匹配
-j,--jump  target执行匹配规则后的动作,ACCEPT,DROP,REJECT等

 2.    iptables匹配场景

 示例1:仅允许10.10.10.10 访问本机10.10.10.20的80端口,其他全拒绝。

root@uos-PC:~# iptables -t filter -A INPUT -s 10.10.10.10 -d 10.10.10.20 -p tcp --dport 80 -j ACCEPT
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -t filter -A INPUT -d 10.10.10.20 -p tcp --dport 80  -j DROP
root@uos-PC:~#        
root@uos-PC:~# iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 35802 packets, 5498K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       10.10.10.10          10.10.10.20          tcp dpt:80
2        0     0 DROP       tcp  --  *      *       0.0.0.0/0            10.10.10.20          tcp dpt:80

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

Chain OUTPUT (policy ACCEPT 34828 packets, 4709K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
root@uos-PC:~# 

示例2: 凡是从本机发出去的icmp协议的报文都允许,其他的都不行。

root@uos-PC:~# iptables -t filter -A OUTPUT -p icmp -j ACCEPT 
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -t filter -A OUTPUT -j DROP
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 61736 packets, 13M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 52927 packets, 7401K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
2       21  1462 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
root@uos-PC:~# 

 示例3:凡是从本机发出去的TCP协议报文,都允许出去,其他协议都不行。

root@uos-PC:~# iptables -t filter -A OUTPUT -p tcp -j ACCEPT 
root@uos-PC:~# iptables -t filter -A OUTPUT -j DROP
root@uos-PC:~# 
root@uos-PC:~# 
root@uos-PC:~# iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 66077 packets, 14M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

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

Chain OUTPUT (policy ACCEPT 55606 packets, 7792K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      207 27855 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           
2        4   260 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
root@uos-PC:~# 

 

 

Logo

更多推荐