iptables防火墙(一)

基础

Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)

Linux系统中的防火墙------netfilter和iptables。

两者的区别:

  • netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于"内核态"(Kernel Space,又称内核空间)的防火墙功能体系
  • iptables:指用来管理Linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于"用户态"(User Space,又称用户空间)的防火墙管理体系

iptables表、链接结构

iptables的作用是为包过v机制的实现提供规则(或称为策略),通过各种不同的规则,告诉netfilter对来自某些源、前往某些目的或具有某些协议特征的数据包应如何处理。

为了更方便地组织和管理防火墙规则,iptables采用了"表"和"链"的分层结构

每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个"表"容器内包括不同的规则"链"根据处理数据包的不同时机划分为五种链;从而决定是否过滤或处理数据包的各种规则,则是按先后顺序放在各规则链中

规则表

为了从规则集的功能上有所区别,iptables管理着四个不同的规则表,其功能分布由独立的内核模块实现:

  • filter表:用来对数据包进行过滤,根据具体规则要求决定如何处理一个数据包。对应的内核模块是iptable_filter,表内包含三个链,即INPUT,FORWARD、OUTPUT
  • nat表:(Network Address Translation,网络地址转换),主要用来修改数据包的IP地址、端口号等信息。对应的内核模块是iptable_nat,表内包含三个链,即PREROUTING、POSTROUTING和OUTPUT
  • mangle表:用来修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期),或为数据包设置Mark标记,以实现流量整形、策略路由等高级应用。对应 的内核模块是iptable_mangle , 表 内 包 含 五 个 链 , 即 PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
  • raw 表:raw 表是自 1.2.9 以后版本的 iptables 新增的表,主要用来决定是否对数据包 进行状态跟踪。raw 表对应的内核模块为 iptable_raw,表内包含两个链,即 OUTPUT、PREROUTING。

规则链

根据防火墙规则的不同介入时机,iptables 默认划分为五种不同 的规则链。这五种链的名称、各自的介入时机如下。

  • INPUT 链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
  • OUTPUT 链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
  • FORWARD 链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,
  • 应用此链中的规则。
  • PREROUTING 链:在对数据包做路由选择之前,应用此链中的规则。
  • POSTROUTING 链:在对数据包做路由选择之后,应用此链中的规则。
  • 其中,INPUT、OUTPUT 链主要用在"主机型防火墙"中,即主要针对服务器本机进行保护的防火墙;而 FORWARD、PREROUTING、POSTROUTING 链多用在"网络型防火墙"中

数据包过滤的匹配流程

规则表之间的顺序

raw->mangle->nat->filter

规则链之间的顺序

取决于数据包的流向

规则链内部各条防火墙规则之间的顺序

当数据包经过每条规则链时,依次按第一条规则、第二条规则......的顺序进行匹配和处 理。链内的过滤遵循"匹配即停止"的原则,一旦找到一条相匹配的规则(使用 LOG 日志操 作的规则外),则不再检查本链内后续的其他规则。如果比对完整个链, 也找不到与数据包相匹配的规则,就按照该规则链的默认策略进行处理

编写防火墙规则

安装iptables

首先要关闭firewalld防火墙

bash 复制代码
systemctl stop firewalld        #关闭firewalld防火墙
systemctl disable firewalld     #关闭开机自启动

使用yum命令安装iptables

bash 复制代码
yum -y install iptables-service

启动防火墙并设置开机自启

bash 复制代码
systemctl start iptables.service
systemctl enable iptables.service

基本语法、数据包控制类型

基本的命令格式

bash 复制代码
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter表;管理选项表示 iptables 规则的操作方式,如插入、增加、删除、查看等;匹配条件用来指定要处理的数据的特征,不符合指定条件的数据包将不会处理;控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。

常用的控制类型

ACCEPT:允许数据包通过

DROP:丢弃数据包,不给出任何回应信息

REJECT:拒绝数据包通过,必要时会给数据发送端一个响应消息

LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。 防火墙规则的"匹配即停止"对于 LOG 操作来说是一个特例,因为 LOG 只是一种辅助动作,并没有真正处理数据包。

示例:在filter表(to filter)的INPUT链中插入(-l)一条规则,拒绝(-j REJECT)发给本机使用的ICMP协议的数据包(-p icmp)

bash 复制代码
iptables -t filter -I INPUT -p icmp -j REJECT    #作用是使其他主机无法ping通本主机

添加、查看、删除规则等基本操作

iptables的常用管理选项

-A 在指定链的末尾添加(--append)一条新的规则

-D 删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容

-I 在指定链中插入(--insert)一条新的规则,未指定序号时默认作为第一条规则

-R 修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容

-L 列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链

-F 清空(--flush)指定链中的所有规则,若未指定链名,则清空表中的所有链

-P 设置指定链的默认策略(--policy)

-n 使用数字形式(--numeric)显示输出结果,如显示 IP 地址而不是主机名

-v 查看规则列表时显示详细(--verbose)的信息

-h 查看命令帮助信息(--help)
--line-numbers 查看规则列表时,同时显示规则在链中的顺序号

添加新的规则

添加新的防火墙规则时,使用管理选项"-A"、"-I",前者用来追加规则,后者用来插入规则。

例如:在filter表的INPUT链的末尾加一条防火墙规则,可执行以下操作("-p 协议名"为匹配条件)

bash 复制代码
iptables -t filter -A INPUT -p tcp -j ACCEPT

可以使用管理选项"-I",允许同时指定新添加规则的顺序号,未指定序号时默认作为第一条

例如:下面操作将位于filter表的第二条(由于默认使用filter表,所以"-t filter"选项被省略)

bash 复制代码
iptables -I INPUT 2 -p icmp -j ACCEPT

查看规则列表

查看已有的防火墙规则时,使用管理选项"-L",结合 "--line-numbers"选项还可以显示各条规则在链内的顺序号。

例如:查看filter表INPUT链中所有规则,并显示规则序号

cpp 复制代码
[root@localhost ~]# iptables -t filter -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       all  --  192.168.10.102       anywhere            
2    REJECT     icmp --  anywhere             anywhere             reject-with icmp-port-unreachable
3    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
4    ACCEPT     icmp --  anywhere             anywhere            
5    ACCEPT     all  --  anywhere             anywhere            
6    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
7    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited
8    DROP       icmp --  anywhere             anywhere             icmp echo-request
9    ACCEPT     icmp --  anywhere             anywhere             icmp echo-reply
10   DROP       icmp --  anywhere             anywhere            
11   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
12   ACCEPT     tcp  --  anywhere             anywhere             multiport dports http,smtp

当防火墙的数量较多时,可以使用数字显示显示地址和端口信息,能够加快命令执行速度

例如

cpp 复制代码
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.10.102       0.0.0.0/0           
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 0
DROP       icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,25

删除、清空规则

删除一条防火墙规则是,可以使用管理选项"-D"

例如:删除filter表INPUT链中第三条规则,可以执行以下操作

cpp 复制代码
[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

若要清空链或表中的所有防火墙规则,可以使用"-F选项"

例如:清空filter表INPUT链中所有规则,可以执行以下操作

cpp 复制代码
[root@localhost ~]# iptables -F INPUT 
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination 

设置默认策略

默认策略是规则匹配的最后一个环节------当找不到任何一条能够匹配数据包的规则时,将执行默认策略。默认策略的控制类型为ACCEPT(允许),DROP(丢弃)两种。

例:以下操作可以将filter表中的FORWARD链的默认策略设为丢弃,OUTPUT链的默认策略为允许

cpp 复制代码
[root@localhost ~]# iptables -t filter -P FORWARD DROP       
[root@localhost ~]# iptables -P OUTPUT ACCEPT

需要注意的是,当使用管理选项"-F"清空链时,默认策略不受影响。因此若要修改默认 策略,必须通过管理选项"-P"重新进行设置。另外,默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别。

规则的匹配条件

通用匹配

协议匹配

编写iptables规则时使用"-p 协议名"的形式指定,用来检查数据吧所使用的网络协议(--protocol),如cp、udp、icmp 和 all(针对所有 IP 数据包)等,可用的协议类型存放于Linux 系统的/etc/procotols 文件中。

例如,若要丢弃通过 icmp 协议访问防火墙本机的数据包,允许转发经过防火墙的除 icmp 协议之外的数据包

cpp 复制代码
[root@localhost ~]# iptables -p icmp -I INPUT -j DROP
[root@localhost ~]# iptables -A FORWARD ! -p icmp -j ACCEPT
地址匹配

使用"-s 源地址"或"- d 目标地址"的形式指定,用来检查数据包的源地址(source)或目标地址(destination)。IP 地址、网段地址等都是可以接受的,但不 建议使用主机名、域名地址(解析过程会影响效率)。

例如,拒绝转发源地址为192.168.1.11的数据,允许转发源地址位于 192.168.7.0/24网段的数据

cpp 复制代码
[root@localhost ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[root@localhost ~]# iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT

当检测到某个网段频繁扫描、登录穷举等不良意图,可以理解添加防火墙规则进行封锁

网络接口匹配

使用"-i 接口名"和"-o 接口名"的形式,用于检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡(--in-interface)、出战网卡(--out-interface)。

例如:丢弃从外网接口(ens33)访问防火墙本机且源地址为私有地址的数据包

cpp 复制代码
[root@localhost ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
[root@localhost ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
[root@localhost ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP

隐含匹配

这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用, 其对应的功能由 iptables 在需要时自动(隐含)载入内核。

端口匹配

使用"--sport 源端口"或"--dport 目标端口"的形式,针对的协议为TCP或是UDP,用于检察数据包的源端口(--source-port)或目标端口(--destination-port)。单个端口号或以":"分隔的端口范围都是可以接受的,但多个不连续的端口不能采用这种方式

例如:为网段192.168.4.0/24转发DNS查询数据包

cpp 复制代码
[root@localhost ~]# iptables -A FORWARD -p udp -s 192.168.4.0/24 --dport 53 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p udp -s 192.168.4.0/24 --sport 53 -j ACCEPT
ICMP类型匹配

使用"--icmp-type ICMP类型"的形式,针对的协议为ICMP,用来检查ICMP数据包的类型(--icmp-type)。ICMP类型使用字符串或数字代码表示,如"Echo-Request"(代码为8)、"Echo-Reply"(代码为 0)、"Destination-Unreachable"(代码为 3),分别对应 ICMP 协议的请求、回显、目标不可达。

例如,若要禁止从其他主机 ping本机,但是允许本机 ping 其他主机,可以执行以下操作。

cpp 复制代码
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -j ACCEPT

显式匹配

这种匹配方式要求有额外的内核模块提供支持,必须手动以"-m 模块名称"的形式调用相应的模块,然后方可设置匹配条件。添加了带显式匹配条件的规则以后,可以执行"lsmod| grep xt_"命令查看到相关的内核扩展模块(如 xt_multiport、xt_iprange、xt_mac、xt_state)。

多端口匹配

编写 iptables 规则时使用"-m multiport --dports 端口列表"、"-m multiport --sports 端口列表"的形式,用来检查数据包的源端口、目标端口,多个端口之间以逗号进行分隔。

例如:若要允许本机开放 25、80、110、143 端口,以便提供电子邮件服务,可以执行以下操作。

cpp 复制代码
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
ip范围匹配

编写 iptables 规则时使用"-m iprange --src-range IP 范围"、"-m iprange --dst-range IP范围"的形式,用来检查数据包的源地址、目标地址,其中 IP 范围采用"起始地址-结束地址"的形式表示

例如:如果要禁止转发源IP地址位于192.168.4.21与192.168.4.28之间的TCP数据包

cpp 复制代码
[root@localhost ~]# iptables -A INPUT -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j DROP
MAC地址匹配

编写 iptables 规则时使用"-m mac --mac-source MAC 地址"的形式,用来检查数据包的 源 MAC 地址。由于 MAC 地址本身的局限性,此类匹配条件一般只适用于内部网络。
若要根据 MAC 地址封锁主机,禁止其访问本机的任何应用,可以参考以下操作。

cpp 复制代码
[root@localhost ~]# iptables -A INPUT -p tcp -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
状态匹配

编写 iptables 规则时使用"-m state --state 连接状态"的形式,基于 iptables 的状态跟踪 机制用来检查数据包的连接状态(State)。常见的连接状态包括 NEW(与任何连接无关的)、ESTABLISHED(响应请求或者已建立连接的)和 RELATED(与已有连接有相关性的,如 FTP 数据连接)。

例如:若要禁止转发与正常 TCP 连接无关的非--syn 请求数据包(如伪造的网络攻击数据包)

cpp 复制代码
[root@localhost ~]# iptables -A INPUT -p tcp -m state --state NEW ! --syn -j DROP
相关推荐
ICscholar6 小时前
ExaDigiT/RAPS
linux·服务器·ubuntu·系统架构·运维开发
sim20207 小时前
systemctl isolate graphical.target命令不能随便敲
linux·mysql
薛定谔的猫19827 小时前
RAG(二)基于 LangChain+FAISS + 通义千问搭建轻量级 RAG 检索增强生成系统
运维·服务器·langchain
米高梅狮子7 小时前
4. Linux 进程调度管理
linux·运维·服务器
再创世纪8 小时前
让USB打印机变网络打印机,秀才USB打印服务器
linux·运维·网络
fengyehongWorld9 小时前
Linux ssh端口转发
linux·ssh
知识分享小能手10 小时前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的Shell编程详细知识点(含案例代码)(17)
linux·学习·ubuntu
yugi98783811 小时前
异构网络下信道环境建模方法及应用
开发语言·网络
浩子智控11 小时前
电子产品设计企业知识管理
运维·服务器·eclipse·系统安全·硬件工程
以太浮标11 小时前
华为eNSP模拟器综合实验之-BGP路由协议的配置解析
服务器·开发语言·php