简介
Linux防火墙主要工作在网络层,针对TCP/IP数据包实施过滤和限制。iptables
是linux防火墙的管理程序,为包过滤机制的实现制定规则,并告诉内核空间的netfilter
如何处理这些网络数据包。
在centos7中,默认的防火墙管理程序是firewalld
,通过yum install -y iptables-services
安装iptables。firewalld
可以通过systemctl stop firewalld && systemctl disable firewalld
停止。
iptables的四表五链
如何对网络数据包进行过滤和处理成为规则,规则的集合成为规则集。按照规则集的不同用途,可以划分为四个规则表。处理数据包的不同时机分为五种规则链,每个规则表中含有不同的规则链。
规则表
filter
表:用于数据包过滤,具体的规则要求决定如何处理数据包。
- 表中有
input
、output
和forward
三个链。
nat
表:网络地址转换,主要用来修改数据包的IP、端口号等信息。
- 表中有
output
、prerouting
和postrouting
三个链。
managle
表:主要用来修改数据包的服务类型、生存周期,为数据包设置标记、实现流量整形、策略路由等。
- 表中有
input
、output
、forward
、prerouting
和postrouting
五个链
raw
表:主要用来决定是否对数据包进行状态跟踪。
- 表中有
output
和prerouting
两个链。
当数据包到达防火墙时,如果对应的链中有规则,将按照 raw
-> mangle
-> nat
-> filter
的顺序通过各个规则表。
规则链
input
:当收到访问本机的数据包时,将应用此链中的规则。主要用于针对本机的防火墙规则。output
:当本机向外发送数据包时,将应用此链中的规则。主要用于针对本机的防火墙规则。forward
:当收到需要通过本机转发到其它地址的数据包时,将应用此链中的规则。prerouting
:在对数据包做路由选择之前,将应用此链中的规则。postrouting
:在对数据包做路由选择之后,将应用此链中的规则。
外部数据包到达防火墙时,要先通过prerouting
链进行路由选择。如果该数据包访问的是本机,则交给input
规则链处理。如果是其它地址,则交给forward
链处理,再交给postrouting
链处理。
内部数据包到达防火墙时,首先被output
链处理,然后选择路由,交给postrouting
处理。
数据包进入规则链时按照顺序依次匹配处理。如果找到匹配数据包的处理规则,将不再执行当前规则链之后的其它规则。如果整个链都没有相应规则,将按照默认策略进行处理。
iptables命令基本语法
# iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
- 未显式指定表名时,默认使用
filter
表。 - 管理选项:iptables操作方式,比如:
-A
: 在链尾增加一条规则-D
: 删除链中某一条规则,可指定序号或具体内容-I
: 指定序号插入规则,未指定序号时,在链首插入-R
: 修改链中某一条规则,可指定序号或具体内容-L
: 列出链中所有规则,未指定链名时,列出表中所有规则链的规则-F
: 清空指定链中的所有规则,未指定链名时,清空表中所有规则链的规则-P
: 设置指定链的默认规则-n
: 使用数字形式显示输出结果-v
: 查看规则列表时显示详细信息--line-numbers
: 查看规则列表时,同时显示规则在链中的序号
- 控制类型
accept
: 允许数据包drop
: 丢弃数据包,且不给回应消息reject
: 拒绝数据包,必要时会给数据发送方回应log
: 在/var/log/meesages
文件中记录日志信息
简单示例(入站防护示例)
# 禁止192.168.11.0/24的IP访问 iptables -A INPUT -s 192.168.11.0/24 -j DROP # 允许192.168.12.0/24使用tcp协议访问本机80端口 iptables -A INPUT -s 192.168.12.0/24 -p tcp --dport 80 -j ACCEPT # 允许192.168.12.0/24使用tcp协议访问本机80和443端口 iptables -A INPUT -s 192.168.12.0/24 -p tcp -m multiport --dport 80,443 -j ACCEPT # 允许192.168.12.0/24使用udp协议访问本机2000 - 3000端口 iptables -A INPUT -s 192.168.12.0/24 -p udp --dport 2000:3000 -j ACCEPT # 禁止ICMP iptables -A INPUT -p icmp -j DROP # 查看规则列表并显示序号 iptables -L INPUT --line-numbers # 使用数字形式避免地址解析,提高命令执行速度 iptables -nL INPUT # 删除INPUT链第3条规则 iptables -D INPUT 3 # 清空INPUT链中所有规则 iptables -F INPUT # 设置默认禁止入站 iptables -P INPUT DROP
其他命令
- 导出iptables规则到文件中
iptables-save > /root/backup/iptables_bak20220508.txt
- 从文件中导入iptables规则
iptables-restore < /root/backup/iptables_bak20220508.txt
参考
- 杰哥的iptables手册V1.0.pdf