一、iptables介绍

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

 二、四表五链

iptable一共是4表5链

iptables 的规则按照功能分为 4 种表,每个表负责不同的任务:

表名作用常用场景
filter默认表,负责过滤数据包(允许/拒绝)防火墙基础规则(如开放端口、封禁IP)
nat负责网络地址转换(NAT),修改数据包的源/目标地址内网共享上网(SNAT)、端口映射(DNAT)
mangle修改数据包的元数据(如 TTL、TOS 标记等),不用于过滤/NATQoS、策略路由、特殊包标记
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等)

--tcp-flags SYN,ACK SYN

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 自动放行
规则数量多(双向单独写)少(状态自动管理)
安全性低(可能被伪造包欺骗)高(严格校验连接状态)

更多推荐