‘因特网’把世界各地的计算机都紧密的连接在一起,如果我们不严加防卫,一旦网络被侵害,可能出现不可预计的损失,那么在互联网上,我们会采用防火墙的方法来保护我们的网站不受外来攻击或侵害,为此我们需要设定防火墙规则,确定哪些类型的数据允许通过,哪些不允许通过。那么具有这种功能的设备或者软件就称为‘防火墙’。
· 从逻辑上将,防护墙可以大体分为主机防火墙和网络防护墙
主机防护墙:针对单台主机进行防护;
网络防火墙:往往处于网络入口边缘,针对于网络入口进行防护,服务于防火墙背后的服务器集群。
· 从物理上讲,防火墙分为硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现部分防护墙的功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:以软件的方式模拟防火墙,运行在操作系统之上,性能不高,成本较低。接下来所说的iptables就是软件防火墙。
iptables其实不是真正的防火墙,我们可以把它理解为一个代理程序,用户通过iptables这个代理程序,将安全规则执行到对应的安全框架中,这个安全框架才是正常的防火墙;这个框架叫netfilter。
netfilter位于操作系统内核空间,iptables位于操作系统的用户空间,后面我们是通过iptables命令工具操作netfilter内核框架。
netfilter/iptables是linux平台下的“包过滤防火墙“,这个包过滤防火墙可以完成数据包过滤,网络地址装换(NAT)等功能。
· 包过滤防火墙他在网络层截获网络数据包的包头(header),它针对数据包的包头,根据预先定义好的防火墙过滤规则进行比对,与规则相匹配的包会被放行,与规则不匹配的包则可能被丢弃,也可能进行更加复杂的动作。
· 包过滤防火墙一般作用在网络层,也称为网络层防火墙,通过检查数据流中的没一个数据包的源ip、源端口、目的ip、目的端口、协议类型(TCP、UDP、ICMP)、状态等信息来判断是否符合规则。
包过滤防火墙是由netfilter来实现的,他是内核的一部分,所以如果要达到防火的功能,需要在内核中设置关卡,所有进出的报文都要经过关卡,进行检查,将符合条件放行,不符合条件阻止,而所谓的关卡在iptables中被称为“链”。
防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样 ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
当我们启用了防火墙功能时,报文需要经过肯定关卡,也就是说根据实际情况的不同,报文经过的链可能就不同,比如请求本机经过哪些链,经过本机经过哪些链,从本机出发又经过哪些链。
通过上图总结iptables总共有五条链:分别为PRE_ROUTING、INPUT、FORWARD、POST_ROUTING、OUTPUT。
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
· 我们对每个链上放置了一串规则,但是这些规则有些很相似,比如A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起?
· 因此我们把具有相同功能规则的集合叫做‘表’,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4中表,每种表对应了不同的功能。
表名 | 作用 | 包含的链 |
filter | 负载过滤功能 | INPUT, OUTPUT, FORWARD |
nat | 负载网络地址转换功能 | PER_ROUTING, INPUT, OUTPUT, POSTROUTING |
mangle | 负责修改数据包内容 | INPUT, OUTPUT, FORWARD, POST_ROUTING, PRE_ROUTING |
raw | 关闭nat表上启用的连接追踪机制 | PRE_ROUTING, OUTPUT |
数据包的过滤基于规则,而规则有匹配条件+动作组成,那么我们对规则的操作就是增,删改。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 |
-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:~#
允许所有的主机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:~#
修改规矩,拒绝所有主机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:~#
方法一:根据规则的编号删除规则
方法二:根据具体匹配的条件与动作删除规则
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:~#
默认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的更多匹配条件
条件参数 | 含义 |
-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等 |
示例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:~#