二、网络之-iptables
一、iptables介绍
iptables 是 Linux 系统中的一个用户空间工具,用于配置内核提供的 netfilter 防火墙功能。它允许系统管理员定义规则,控制进出 Linux 系统的网络流量。

二、四表五链
iptable一共是4表5链

iptables 的规则按照功能分为 4 种表,每个表负责不同的任务:
| 表名 | 作用 | 常用场景 |
|---|---|---|
| filter | 默认表,负责过滤数据包(允许/拒绝) | 防火墙基础规则(如开放端口、封禁IP) |
| nat | 负责网络地址转换(NAT),修改数据包的源/目标地址 | 内网共享上网(SNAT)、端口映射(DNAT) |
| mangle | 修改数据包的元数据(如 TTL、TOS 标记等),不用于过滤/NAT | QoS、策略路由、特殊包标记 |
| raw | 绕过连接跟踪(conntrack),用于高性能或特殊需求 | 禁用某些连接的状态跟踪(如 DNS 查询) |
📌 优先级:
raw→mangle→nat→filter
(数据包依次经过这些表的处理)
链是规则的执行点,数据包会根据其流向经过不同的链。5 条核心链如下:
| 链名 | 触发时机 | 常用操作 |
|---|---|---|
| PREROUTING | 数据包刚进入网络接口(尚未路由判断) | DNAT、修改 TTL(mangle) |
| INPUT | 数据包目标是本机(如本地服务) | 过滤对本机的访问(filter) |
| FORWARD | 数据包需要转发到其他机器(路由经过本机) | 过滤经过的流量(如网关防火墙) |
| OUTPUT | 数据包从本机发出 | 限制本机发起的连接(filter) |
| POSTROUTING | 数据包即将离开网络接口(路由已决定) | SNAT、MASQUERADE(nat) |
例如一个数据进入和出去的详细流程图:

例如一个数据进入和出去的大体流程图:

三、filter表
基本语法格式:
bash
iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 目标动作或跳转]
说明:表名(4表)、链名(5链)用于指定iptables命令所操作的表和链,
命令选项:用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等)
规则匹配条件:用于指定对符合什么样条件的数据包进行处理
目标动作或跳转:用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
如果不加-t,默认用的就是filter表
iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 目标动作]

command红色是常用的
| 选项 | 说明 |
|---|---|
| -A | 在链尾添加新规则 |
| -I | 在链首插入规则,默认就是插入第1行中 |
| -D | 删除规则,可以按照序号和规则内容删除 |
| -L | 列出素有规则进行查看 |
| -F | 清空链中规则 |
| -P | 设置链的默认策略 |
| -N | 创建新链 |
| -X | 删除用户自定义链 |
| -R | 修改、替换某条规则,可以按照序号和内容替换 |
parameter参数作用
1. 协议相关参数
| 参数 | 作用 | 示例 |
|---|---|---|
-p | 指定协议(tcp/udp/icmp等) | -p tcp |
--sport | 源端口 | --sport 22 |
--dport | 目标端口 | --dport 80 |
--tcp-flags | 匹配TCP标志位(SYN/ACK等) |
|
2.地址相关参数
| 参数 | 作用 | 示例 |
|---|---|---|
-s | 源IP地址或网段 | -s 192.168.1.0/24 |
-d | 目标IP地址或网段 | -d 10.0.0.1 |
-i | 输入网卡接口 | -i eth0 |
-o | 输出网卡接口 | -o wlan0 |
target参数作用
| Target | 作用 | 示例 |
|---|---|---|
ACCEPT | 允许数据包通过 | -j ACCEPT |
DROP | 丢弃数据包(无响应) | -j DROP |
REJECT | 拒绝数据包并返回错误(如 ICMP port-unreachable) | -j REJECT --reject-with icmp-port-unreachable |
LOG | 记录数据包日志(不决定最终动作,需配合其他规则) | -j LOG --log-prefix "DROPPED: " |
四、案例
首先安装iptables服务(老版本服务器没有iptables,需要安装且加载模块)
#检查是否安装iptables,显示版本就是已安装
[root@localhost ~]# iptables -version
iptables v1.8.5 (legacy): unknown option "iptables"
Try `iptables -h' or 'iptables --help' for more information.
#安装命令(没有的话手动安装,且手动配置模块)
yum install iptables-services
#查看状态
systemctl status iptables
#查看发现systemctl status iptables 显示 inactive (dead)未启动,但是添加规则依旧生效
#因为这里的 "服务" 仅指 规则持久化管理(如开机自动加载规则),并不影响当前运行的防火墙规则。
#iptables 规则是直接由 Linux 内核 处理的,无需依赖 systemd 服务。
#所以iptables -A INPUT -p tcp --dport=8081 -j DROP 生效
#即使 iptables.service 未启动,手动添加的规则会 立即生效(因为内核已加载 iptables 模块)。
#该规则会丢弃所有访问 8081 端口的 TCP 数据包,因此 8081 端口无法访问。
#启动iptable和开机自启动
systemctl status iptables.service
systemctl enable iptables.service
#当启动iptables后,且设置了开机启动,那么你添加的规则,再次开机还是会有的。
查看当前规则
[root@localhost ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
删除默认规则
iptables -P INPUT DROP (执行完后,就无法使用ssh链接虚拟机了,得添加配置好22的进入规则)
启用默认规则
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
配置使用ssh链接服务器的22端口规则
iptables -t filter -A INPUT -p tcp -s 192.168.157.0/24 --dport 22 -j ACCEPT
保存iptables规则,保存后重启机器,规则依旧在
#在较新的 Linux 系统中,service iptables save 或 iptables-save 可能看起来"没用"的,因为重启后规则仍然存在。这其实是因为现代 Linux 系统的防火墙机制发生了变化
#所以如果你设置了iptable启动且开机自启动,那么添加规则后会自动保存
service iptables save
禁止8081访问进去
iptables -t filter -A INPUT -s 192.168.157.0/24 -p tcp --dport 8081 -j DROP
禁止外网进行ping服务器
ping是icmp协议
[root@localhost ~]# iptables -A INPUT -p icmp -j DROP
删除规则
如果规则如下:虽然第1条写了禁止icmp(禁止ping),第2条写了允许icmp(允许ping),但是结果还是不能ping,因为默认从1一条往下检查,如果检查到了对应的类型,就不会执行下面的类型了
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#按序号删除第1条
iptables -D INPUT 1
#按匹配条件删除
iptables -D INPUT -p tcp -s 192.168.157.0/24 --dport 8081 -j DROP
不允许对应的机器访问所有端口(相当于加黑名单)
#不允许对应的机器(142)访问本机的所有端口(相当于加黑名单),默认不配置dport是默认ALL
[root@localhost ~]# iptables -A INPUT -s 192.168.157.142 -j DROP
禁止多个端口访问
iptables -A INPUT -s 192.168.157.0/24 -p tcp -m multiport --dports 8081,22 -j DROP
清空iptables规则
#如果iptables没保存,-F清空,即可。例如你禁止了22,只需要去虚拟机刷新,不需要重置默认规则
iptables -F
本机只允许访问80和443端口网址
#设置这个后,主机就不能往外访问了,包括也无法给22返回值,导致外面SSH链接不进来
iptables -P OUTPUT ACCEPT
#添加80和443端口
iptables -A OUTPUT -s 192.168.157.142 -p tcp --dport=80 -j ACCEPT
iptables -A OUTPUT -s 192.168.157.142 -p tcp --dport=443 -j ACCEPT
#添加dns解析,默认是udp和53端口
iptables -A OUTPUT -s 192.168.157.142 -p udp --dport=53 -j ACCEPT
只允许固定ip访问
[root@localhost ~]# iptables -A INPUT ! -s 192.168.157.142 -j DROP
[root@localhost ~]# iptables -A INPUT ! -s 192.168.157.1/24 -j DROP
限制ping的流量
#-burst5 :并发数是5,前5个是正常展示的
#-m limit --limit 10/minute:没分钟10个,每秒6个,所以5个之后都是6秒一个
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit -burst 5 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
其他
#查看nat表的默认规则
iptables -t nat -nL
配置生产环境
配置生产不要配置为逛公园,谁都可以进,得设置为电影院,买票设置规则的才才可以进去,这个是脚本,视情况修改执行
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许 ICMP(限速)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/second --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
# 允许 SSH(仅限内网)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 防御 SYN 洪水
iptables -A INPUT -p tcp --syn -m limit --limit 5/second --limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 阻止无效包
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# 日志记录
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
iptables -A INPUT -j DROP
# 保存规则
iptables-save > /etc/iptables.rules
配置过程中拒绝的规则放上面,允许的规则放下面
五、包过滤、状态监测防火墙
iptables本质是包过滤防火墙,但通过 conntrack 模块能实现了状态监测能力。
包过滤模式(无状态)
包过滤需要 手动放行双向流量(请求和响应),规则更冗长。
# 清空现有规则(谨慎操作)
iptables -F
# 允许外部访问本机8080端口(请求)
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# 允许本机响应8080端口的流量(返回)
iptables -A OUTPUT -p tcp --sport 8080 -j ACCEPT
# 默认拒绝其他所有流量(安全策略)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
状态监测模式(推荐)
状态监测通过 conntrack 模块自动跟踪连接状态,只需放行 初始请求,响应流量会自动允许。
# 清空现有规则
iptables -F
# 启用状态监测:允许已建立或相关的连接(自动放行返回流量)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许外部访问本机8080端口(初始请求)
iptables -A INPUT -p tcp --dport 8080 -m conntrack --ctstate NEW -j ACCEPT
# 允许本机主动发起的流量(如访问外部服务)
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 默认拒绝其他所有流量
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
| 场景 | 包过滤规则 | 状态监测规则 |
|---|---|---|
| 请求(入站) | -A INPUT -p tcp --dport 8080 -j ACCEPT | -A INPUT -p tcp --dport 8080 -m conntrack --ctstate NEW -j ACCEPT |
| 响应(出站) | 需显式放行 --sport 8080 | 由 ESTABLISHED 自动放行 |
| 规则数量 | 多(双向单独写) | 少(状态自动管理) |
| 安全性 | 低(可能被伪造包欺骗) | 高(严格校验连接状态) |
更多推荐

所有评论(0)