iptables简单使用

iptables 生产环境高频命令详解

说明:iptables 是 Linux 传统防火墙,netfilter 内核框架;CentOS7+/Ubuntu18+ 底层已逐步迁移到 nftables,但绝大多数生产依旧在用 iptables;注意:iptables 规则重启失效,持久化需要单独保存
四表五链先理清,再给高频生产命令、示例、坑点。

一、基础概念:四表五链

4张表(优先级从高→低)

  1. raw:关闭连接追踪,极少用
  2. mangle:修改数据包TTL、TOS、MARK标记
  3. nat:地址转换 SNAT/DNAT/PNAT、端口映射
  4. filter(默认表,防火墙过滤):放行/拒绝数据包,最常用

5条钩子链

链名 触发时机 用途
PREROUTING 数据包刚进网卡,路由判断前 DNAT、端口映射
INPUT 目标为本机进程 管控外部访问本机端口
FORWARD 数据包经过本机转发 本机当网关/路由,跨主机转发
OUTPUT 本机进程向外发包 本机出站流量控制
POSTROUTING 数据包离开网卡之前 SNAT、MASQUERADE源地址转换

默认不加 -t 指定表时,默认就是 filter

规则匹配顺序

从上往下依次匹配,匹配到一条规则就执行对应动作(target),不再往下匹配;最后默认策略。

常用动作(target)

  • ACCEPT:允许数据包通过
  • DROP:丢弃数据包,无任何回应(推荐生产拒绝外部)
  • REJECT:拒绝,返回报错报文
  • SNAT:源地址转换(固定公网IP)
  • MASQUERADE:动态源地址伪装(拨号、DHCP公网IP)
  • DNAT:目标地址转换,端口映射
  • LOG:打日志,继续往下匹配

二、生产高频查询命令

1. 查看filter表所有规则

# 精简查看
iptables -L -n

# 完整带行号、计数器、详细规则(生产最推荐)
iptables -L -n -v --line-numbers

参数解释

  • -L list列出规则
  • -n 数字格式,禁止反向DNS解析,速度极快,生产必带
  • -v verbose,显示数据包、字节计数器
  • --line-numbers 打印规则行号,删除规则时非常好用

2. 指定链查看

# 只看INPUT链
iptables -L INPUT -nv --line-numbers

# 查看nat表所有规则
iptables -t nat -L -nv --line-numbers

3. 清空计数器(包流量统计清零)

iptables -Z
iptables -Z INPUT

三、增删改规则(生产最核心)

⚠️ 高危提醒!不要先执行 iptables -F 清规则再没加放行ssh!会直接断开远程服务器,生产事故!

1. 追加规则 -A (Append,加到链末尾)

末尾匹配优先级最低

# 放行TCP 22端口 ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 放行来自内网网段 192.168.1.0/24 所有访问
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# 拒绝单个IP访问本机
iptables -A INPUT -s 10.0.0.123 -j DROP

2. 插入规则 -I (Insert,插到链头部!优先匹配)

封禁IP必须用-I,放到最前面,否则前面ACCEPT已经放行就无效!

# 将封禁规则插到INPUT链第1行,优先执行
iptables -I INPUT -s 1.2.3.4 -j DROP

# 插到第3行
iptables -I INPUT 3 -s 1.2.3.4 -j DROP

3. 删除规则 2种方式(生产高频)

方式1:按行号删除(最安全!推荐)

先查出行号 --line-numbers

# 删除filter表INPUT链第5条规则
iptables -D INPUT 5

方式2:完整匹配规则内容删除

iptables -D INPUT -s 1.2.3.4 -j DROP

4. 修改链默认策略 -P Policy

默认策略:所有数据包没有匹配到任何规则时执行的动作

# 默认拒绝所有入站流量(生产防火墙标准配置)
iptables -P INPUT DROP

# 默认允许转发、出站
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

⚠️ 如果 INPUT 默认DROP,一定要先放行SSH端口,再设置默认策略!否则直接断连

5. 清空规则(高危慎用!)

# 清空filter表所有链规则
iptables -F

# 清空nat表
iptables -t nat -F

# 清空单条链规则
iptables -F INPUT

-F 不会清空默认策略! 如果你INPUT默认DROP,清空后所有外部访问全部拒绝。


四、生产环境过滤规则实战示例(filter表 INPUT链)

1. 放行ssh 22端口,仅内网可访问

iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 22 -j ACCEPT

2. 放行多端口 80,443

iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

-m multiport 多端口模块,最多一次性传15个端口

3. 放行本机回环网卡 lo(127.0.0.1,生产必加!很多服务依赖)

iptables -A INPUT -i lo -j ACCEPT

4. 放行已建立、相关连接(最关键一条!)

服务器响应外部请求返回数据包放行

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

状态模块 state:

  • NEW:新连接请求
  • ESTABLISHED:已建立连接
  • RELATED:关联连接(ftp被动模式等)
  • INVALID:无效数据包,通常DROP

5. 限制单IP最大并发连接数(防CC攻击)

# 单个IP最多20个tcp新连接
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP

6. 限速:短时间内防暴力破解SSH(limit模块)

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 5 -j ACCEPT

7. 禁止ICMP ping(不让别人ping服务器)

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

五、NAT转发实战(网关、端口映射,nat表高频)

开启内核转发前提,必须先打开:

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

场景1:SNAT 内网机器共享公网IP上网(固定公网IP)

公网网卡eth0 IP:203.0.113.10
内网网段:192.168.1.0/24

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.10

场景2:MASQUERADE 动态公网IP(宽带拨号,IP经常变,无需填IP)

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

场景3:DNAT端口映射:公网8080→内网192.168.1.100:80

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

额外注意:filter表FORWARD链也要放行该流量,否则转发不通

iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT

六、规则持久化!重中之重(iptables重启丢失)

iptables规则内存生效,服务器重启全部清空,生产必须持久保存

CentOS7/8

# 保存规则
iptables-save > /etc/sysconfig/iptables

# 开机加载
yum install -y iptables-services
systemctl enable iptables
systemctl start iptables

# 恢复规则
iptables-restore < /etc/sysconfig/iptables

Ubuntu/Debian

apt install iptables-persistent
# 保存
netfilter-persistent save
# 重载
netfilter-persistent reload

通用方式(跨发行版)
iptables‑save 导出当前全部规则;iptables‑restore 导入规则文件


七、生产环境标准安全模板(可直接微调使用)

# 1.清空旧规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# 2.放行lo回环网卡
iptables -A INPUT -i lo -j ACCEPT

# 3.放行已有连接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# 4.放行内网网段
iptables -A INPUT -s 192.168.0.0/16 -j ACCEPT

# 5.放行公网80、443
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# 6.默认拒绝所有入站
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

八、生产高频踩坑清单

  1. 设置INPUT默认DROP前,一定放行SSH,否则远程失联
  2. -A追加到末尾,如果前面已经ACCEPT了IP,后面DROP不会生效;封禁IP必须 -I 插到头部
  3. nat转发除了nat表规则,filter FORWARD链流量也要放行,不然转发不通
  4. 不要忘记 RELATED,ESTABLISHED 这条规则,否则服务器访问外网收不到响应
  5. iptables 和 firewalld / ufw 不能同时混用,会冲突
  6. 云服务器:iptables只是操作系统防火墙,还要配置云厂商安全组!两层防护

iptables中DROP和REJECT的区别

  • DROP:丢弃,无任何回应
  • REJECT:拒绝,返回报错报文

举例:禁止10.10.249.156访问本机17822端口
在10.10.249.156主机,telnet 10.10.184.85 17822

  • 如果是DROP:
# iptables -I INPUT -s 10.10.249.156 -p tcp --dport 17822 -j DROP

Trying 10.10.184.85...
telnet: Unable to connect to remote host: Connection timed out

返回连接超时

  • 如果是REJECT:
# iptables -I INPUT -s 10.10.249.156 -p tcp --dport 17822 -j REJECT

Trying 10.10.184.85...
telnet: Unable to connect to remote host: Connection refused

返回连接拒绝
生产环境推荐用DROP

posted @ 2026-09-03 09:30  ZovoeY  阅读(19)  评论(0)    收藏  举报