当前位置: 首页 > news >正文

iptables的配置与使用

1 Ubuntu系统使用iptables

默认Ubuntu系统使用的是nft,先恢复到 iptables。

使用以下命令查看和更改优先级:

update-alternatives --config iptables

将最高优先级设置为iptables:

update-alternatives --install /usr/bin/iptables iptables /usr/sbin/iptables-nft 30

默认设置:

update-alternatives --set iptables /usr/sbin/iptables-legacy

禁用 UFW 和 nft:

systemctl disable --now ufw
systemctl disable --now nftables
apt install iptables-persistent
systemctl enable --now iptables

查看iptables服务状态:

systemctl status iptables

查看iptables版本:

iptables --version

2 iptables命令简介

语法:iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter表

管理选项表示 iptables 规则的操作方式,如插入、增加、删除、查看等

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

-I:在指定链中插入(–insert)一条新的规则,未指定序号时默认在开头

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

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

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

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

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

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

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

匹配条件用来定要处理的数据包的特征,不符合指定条件的数据包将不会处理。

控制类型指的是数据包的处理方式:

ACCEPT:允许数据包通过

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

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

LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则

示例:

iptables -t filter -I INPUT -p icmp -j REJECT

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

上述操作产生的直接效果是其他主机无法 ping 通本机。

2.1 添加新的规则

-A:追加规则,在链的尾部

-I:插入规则,没写明位置,默认在链的开头

# 在链的末尾插入
iptables -t filter -A INPUT -p tcp -j ACCEPT
# 在链的开头插入
iptables -I INPUT -p udp -j ACCEPT
# 在链的指定位置插入
iptables -I INPUT 2 -p icmp -j ACCEP

-s选项:指定源地址或网段,与INPUT联用

-d选项:指定目标地址或网段,与OUTPUT联用

# 拒绝所有来自指定地址的ICMP请求(如 Ping)
iptables -t filter -s 192.168.40.132 -I INPUT -p icmp -j REJECT
# 拒绝本机向指定地址发送的ICMP响应(如 Ping 回复)
iptables -t filter -d 192.168.40.132 -I OUTPUT -p icmp -j REJECT

2.2 查看规则列表

  • 查看 filter 表 INPUT 链中的所有规则,并显示规则序号
iptables -t filter -L INPUT --line-numbers
# 简写
iptables -L INPUT --line-numbers
  • 以数字地址形式查看 filter 表INPUT 链中的所有规则
iptables -t filter -n -L INPUT
# 简写
iptables -n -L INPUT
  • 以数字形式详细的列出 INPUT 链中的所有规则
iptables -v -nL INPUT

第一行:表示当前正在查看 INPUT 链,并且默认策略是 ACCEPT

pkts:数据包计数

bytes:字节数计数

target:目标动作(例如 ACCEPT, DROP)

prot:协议(例如 all, tcp, udp)

opt:选项(例如 – 表示没有特殊选项)

in:输入接口(例如 lo 表示本地回环接口)

out:输出接口(例如 * 表示不限制)

source:源地址

destination:目标地址

2.3 删除、清空规则

# 删除 filter 表 INPUT 链中的第2条规则
iptables -D INPUT 2
# 清空 filter 表 INPUT链中的所有规则
iptables -F INPUT
# 清空指定表中所有链的规则
iptables -t nat -F
iptables -t mangle -F

2.4 设置默认策略

iptables 的各条链中,默认策略是规则匹配的最后一个环节:

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

# 查看默认规则
iptables -S
# 将 filter 表中的 INPUT 链的默认策略设置为 DROP
iptables -P INPUT DROP

当使用管理选项“-F”清空链时,默认策略不受影响。因此若要修改默认策略,必须通过管理选项“-P”重新进行设置。

默认策略并不参与链内规则的顺序编排,因此在其他规则之前或之后设置并无区别。

2.5 规则的匹配条件

根据数据包的各种特征,结合 iptables 的模块结构,匹配条件的设置包括三大类:

  • 通用匹配

通用匹配也称为常规匹配,这种匹配方式独立使用,不依赖于其他条件或扩展模块。

常见的通用匹配包括:协议匹配、地址匹配、网络接口匹配

  • 隐含匹配

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

常见的隐含匹配包括:端口匹配、TCP标记匹配、ICMP类型匹配

  • 显式匹配

这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调用相应的模块,然后方可设置匹配条件。

添加了带显式匹配条件的规则以后,执行“lsmod | grep xt_”命令查看到相关的内核扩展模块(如xt_multiport、xt_iprange、xt_mac、xt_state)。

常见心事匹配:多端口匹配(xt_multiport)、IP 范围匹配(xt_iprange)、MAC 地址匹配(xt_mac)、状态匹配(xt_state)

2.5.1 通用匹配-协议匹配

编写 iptables 规则时使用“-p 协议名”的形式指定,用来检查数据包所使用的网络协议(–protocol),如tcpudpicmpall(针对所有 IP 数据包)等。

可用的协议类型存放于Linux 系统的==/etc/protocols==文件中。

# 丢弃通过 icmp 协议访问防火墙本机的数据包
iptables -I INPUT -p icmp -j DROP
# 允许转发经过防火墙的除 icmp 协议之外的数据包	感叹号”!”表示取反
iptables -A FORWARD ! -p icmp -j ACCEPT

2.5.2 通用匹配-地址匹配

编写 iptables 规则时使用“-s 源地址”或“-d 目标地址”的形式指定,用来检查数据包的源地址(–source)或目标地址(–destination)。

IP 地址、网段地址等都是接受的,但不建议使用主机名、域名地址(解析过程会影响效率)。

# 拒绝转发源地址为192.168.1.11 的数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
# 允许转发源地址位于 192.168.7.0/24 网段的数据
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT

当遇到小规模的网络扫描或攻击时,封锁 IP 地址是比较有效的方式。

例如,若检测到来自某个网段(如 10.20.30.0/24)的频繁扫描、登录穷举等不良企图,可立即添加防火墙规则进行封锁。

iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP

2.5.3 通用匹配-网络接口匹配

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

# 丢弃从外网接口(ens33)访问防火墙本机且源地址为私有地址的数据包
iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
# 最好加上	lo:本地回环接口
iptables -I INPUT -i lo -j ACCEPT
iptables -I OUTPUT -i lo -j ACCEPT

2.5.4 隐式匹配-端口匹配

编写 iptables 规则时使用“–sport 源端口”或“-- dport 目标端口”的形式,针对的协议为TCP 或 UDP,用来检查数据包的源端口(–source-port)或目标端口(–destination-port)。

单个端口号或者以冒号“:”分隔的端口范围都是接受的,但不连续的多个端口不能采用这种方式。

# 允许为网段 192.168.4.0/24 转发 DNS 查询数据包
iptables -A FORWARD -s 192.168.4.0/24 -p udp -- dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -p udp -- sport 53 -j ACCEPT
# 开放 20、21 端口,以及24500~24600
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT

2.5.5 隐式匹配-ICMP类型匹配

编写 iptables 规则时使用“–icmp-type ICMP 类型”的形式,针对的协议为 ICMP,用来检查 ICMP 数据包的类型(–icmp-type)。

ICMP 类型使用字符串或数字代码表示,如“Echo- Request”(代码为8)、“Echo-Reply”(代码为0)、“Destination-Unreachable”(代码为 3),分别对应 ICMP 协议的请求、回显、目标不可达

# 禁止从其他主机 ping本机,但是允许本机 ping 其他主机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
# 查看所有ICMP 协议类型
iptables -p icmp -h

2.5.7 显示匹配-端口匹配

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

# 允许本机开放 25、80、110、143 端口
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT

2.5.8 显式匹配-IP 范围匹配

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

# 禁止转发源IP地址在192.168.4.21到192.168.4.28之间的TCP数据包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j DROP
# 拒绝来自 192.168.1.100 到 192.168.1.200 范围的数据包
iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP

2.5.9 显式匹配-MAC地址匹配

MAC 地址匹配编写 iptables 规则时使用“-m mac – mac-source MAC 地址”的形式,用来检查数据包的源 MAC 地址。由于 MAC 地址本身的局限性,此类匹配条件一般只适用于内部网络。

# 禁止00:0c:29:c0:55:3f其访问本机的任何应用
iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP

2.5.10 显式匹配-状态匹配

写 iptables 规则时使用“-m state --state 连接状态”的形式,基于 iptables 的状态跟踪机制用来检查数据包的连接状态(State)。

常见的连接状态包括:

NEW(与任何连接无关的)
ESTABLISHED(响应请求或者已建立连接的)
RELATED(与已有连接有相关性的,如FTP 数据连接)

# 禁止转发与正常 TCP 连接无关的非--syn 请求数据包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
# 只开放本机的 Web 服务(80 端口),对发给本机的 TCP 应答数据包予以放行,其他入站数据包均丢弃
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

3 iptables策略持久化

在Linux系统中,iptables规则默认情况下在系统重启后会丢失。

为了使这些规则持久化,可以使用不同的工具和方法,具体取决于所使用的Linux发行版。

在Debian/Ubuntu系统上,可以使用iptables-save命令或iptables-persistent包来保存和恢复iptables规则。

3.1 iptables-save命令

用于将linux内核中的iptables表导出到标准输出设备商,通常,使用shell中I/O重定向功能将其输出保存到指定文件中。

语法:iptables-save 选项

选项:

-c:指定要保存的iptables表时,保存当权的数据包计算器和字节计数器的值

-t:指定要保存的表的名称

示例:

# iptables -t filter -I INPUT -p icmp -j DROP
# 保存ip4的规则
iptables-save -t filter > /etc/iptables/rules.v4
# 保存 IPv6 的规则
ip6tables-save > /etc/iptables/rules.v6

3.2 iptables-restore命令

主要功能是将iptables-save命令备份的配置信息恢复到系统中。

语法:iptables-restore [参数]

常用参数

-c:这个选项用于在还原iptables表时,同时恢复数据包计数器和字节计数器的原始值,这对于跟踪网络流量非常有用。

-t:此参数用于指定要还原的具体表,如filter、nat或mangle等,根据的网络管理需求选择相应的表。

示例:

# iptables -F
# 使用iptables的备份文件,还原配置
iptables-restore /etc/iptables/rules.v4
# 两个效果相同
iptables-restore < /etc/iptables/rules.v4
# 如果想同时恢复计数器,可以添加参数
iptables-restore -c /etc/iptables/rules.v4
# 如果只想还原特定表,如filter表
iptables-restore -t /etc/iptables/rules.v4

3.3 iptables-persistent工具

用于保存和恢复 iptables规则的工具,允许在系统重启后保持防火墙规则不变。

3.3.1 安装

在基于 Debian 的系统(如 Ubuntu)上,可以通过以下命令安装 iptables-persistent:

apt-get update
apt-get install iptables-persistent

在安装过程中,会被提示保存现有的 IPv4 和 IPv6 防火墙规则。如果没有现成的规则,可以选择不保存。

3.3.2 保存当前的 iptables 规则

如果已经有了一些自定义的 iptables 规则,并希望将它们保存下来以便在系统重启后仍然有效,可以使用以下命令:

netfilter-persistent save

3.3.3 重新加载 iptables 规则

如果手动修改了规则文件,并希望重新加载它们,可以使用:

netfilter-persistent reload

但通常在启动时,iptables-persistent 会自动做这件事。

3.3.4 禁用 iptables-persistent

如果不想在启动时加载保存的 iptables 规则,可以编辑==/etc/default/netfilter-persistent==文件,并将 IPTABLES_V4_SAVE 和 IPTABLES_V6_SAVE 的值设置为 no。

http://www.lryc.cn/news/589778.html

相关文章:

  • Image 和 IMU 时间戳同步
  • 从零开发足球比分APP:REST API与WebSocket的完美搭配
  • MyBatis 之分页四式传参与聚合、主键操作全解
  • 现代人工智能综合分类:大模型时代的架构、模态与生态系统
  • 【电脑】显示器的基础知识
  • 消息转换器--通过此工具进行时间转换
  • Flask的基本概念
  • Ray集群部署与维护
  • Shor`s因子分解法——C语言实现
  • 实例操作:基于 PipeLine 实现 JAVA项目集成 SonarQube代码检测通知 Jenkins
  • 探索阿里云DMS:解锁高效数据管理新姿势
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博类别信息爬取
  • C#——循环(while循环和do-while循环)
  • Java 大视界 -- 基于 Java 的大数据分布式存储在云计算数据中心数据管理与调度中的应用(348)
  • docker run elasticsearch 报错
  • 征服ZYNQ双核潜能:OCM内存精妙分配与免锁通信实战
  • WPF 加载和显示 GIF 图片的完整指南
  • 【游戏引擎之路】登神长阶(十七):Humanoid动画——长风破浪会有时,直挂云帆济沧海
  • Arduino土壤湿度检测
  • 新手向:自动化图片格式转换工具
  • 【游戏引擎之路】登神长阶(十八):3天制作Galgame引擎《Galplayer》——无敌之道心
  • 玩转Docker | 使用Docker部署bender个人导航页工具
  • my2sql-binlog闪回测试
  • 设计一款用于捕捉动态产品视频的摄像机器人
  • 记录一道sql面试题3
  • EVA series系列(上)
  • 【MySQL基础】MySQL事务详解:原理、特性与实战应用
  • 网络安全(初级)(XSS-labs 1-8)
  • JWT基础详解
  • Linux内核设计与实现 - 第2章 内核开发的准备