iptables学习; firewalld学习;ufw学习

iptables 知识点总结

iptables 是 Linux 内核 netfilter 框架的用户态工具,用于配置 IPv4 包过滤、NAT、流量改写;IPv6 使用 ip6tables。 核心概念:表 (table) → 链 (chain) → 规则 (rule)

一、四大表(优先级从高到低)

表名 作用 内置链
raw 关闭连接跟踪(conntrack),优先级最高 PREROUTING、OUTPUT
mangle 修改数据包:TTL、TOS、MARK 标记 PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 网络地址转换(端口映射、源 / 目的地址转换)⚠️ 连接只在第一个包做 NAT,后续包靠 conntrack PREROUTING(DNAT)、OUTPUT、POSTROUTING(SNAT/MASQUERADE)
filter 默认表,包过滤,允许 / 拒绝数据包 INPUT、FORWARD、OUTPUT

日常防火墙规则绝大多数写在 filter 表;端口转发、共享上网用 nat 表。

二、五条内置链(数据包流转)

  1. PREROUTING :数据包刚进入网卡,路由判断之前。常用于 DNAT、修改目的地址。
  2. INPUT:路由判断后,包目标是本机进程。访问本机端口走这条链。
  3. FORWARD:路由判断后,包经过本机转发(本机作为路由器)。
  4. OUTPUT:本机进程发出的数据包。
  5. POSTROUTING :数据包离开网卡之前。常用于 SNAT/MASQUERADE,修改源地址。

数据包两种流向

  1. 访问本机:网卡 → PREROUTING → INPUT → 本机程序
  2. 跨主机转发:网卡 → PREROUTING → FORWARD → POSTROUTING → 出去
  3. 本机向外访问:本机程序 → OUTPUT → POSTROUTING → 网卡出去

三、规则匹配 + 动作(target)

常用匹配条件

  • -s:源 IP
  • -d:目的 IP
  • -p:协议 tcp/udp/icmp/all
  • --sport:源端口(tcp/udp)
  • --dport:目的端口(tcp/udp)
  • -i:入网卡(PREROUTING/INPUT/FORWARD)
  • -o:出网卡(OUTPUT/FORWARD/POSTROUTING)
  • --state:连接状态(conntrack)
    • NEW:新建连接
    • ESTABLISHED:已建立连接
    • RELATED:相关连接(如 ftp 主动数据通道)
    • INVALID:无效包
  • -m:加载扩展模块,如 -m multiport 多端口匹配

常用动作 target

target 含义
ACCEPT 放行数据包,不再继续匹配同链后续规则
DROP 丢弃数据包,不回复任何报文(静默丢包)
REJECT 拒绝数据包,返回 ICMP 拒绝报文
SNAT 静态源地址转换,nat 表 POSTROUTING
MASQUERADE 动态源地址转换(拨号网卡 IP 会变时用)
DNAT 目的地址转换,nat 表 PREROUTING,端口映射
RETURN 返回到调用这条链的上一级链继续匹配

规则从上到下依次匹配 ,匹配命中就执行 target;全部不命中,执行链默认策略

四、默认策略 policy

复制代码
iptables -P INPUT DROP
  • 对 filter 表的 INPUT 链设置默认丢弃
  • 小心:设置 DROP 前务必先放行 ssh,否则直接断连!

五、常用命令

复制代码
# 查看规则
iptables -L -n -v
iptables -t nat -L -n

# 清空规则(慎用)
iptables -F          # 清空filter表所有链规则
iptables -t nat -F
iptables -X          # 删除自定义链

# 添加规则:filter INPUT放行22端口tcp
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 在链头部插入规则(优先匹配)
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

# 删除规则:按序号删除(推荐)
iptables -L --line-numbers
iptables -D INPUT 2

# 保存规则(不同系统不一样)
# CentOS6: service iptables save
# CentOS7+/Ubuntu:iptables-save > /etc/iptables/rules.v4
# 恢复:iptables-restore < rules.v4

六、典型场景示例

1. 基础防火墙:只放行 ssh、已建立连接

复制代码
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP

2. 本机做路由器,内网机器共享上网(MASQUERADE)

复制代码
# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# nat表POSTROUTING,外网网卡eth0
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

3. 端口映射:访问公网 IP:8080 转发到内网 192.168.1.100:80

复制代码
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
# 同时FORWARD链放行转发流量
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT

七、重要坑点

  1. NAT 只对第一个包生效,依靠 conntrack 连接跟踪,不要随意关闭。
  2. MASQUERADE 适合动态 IP 网卡;静态公网 IP 优先 SNAT,性能更好。
  3. FORWARD 链:本机作为转发网关才生效,本机服务不走 FORWARD。
  4. 规则顺序很关键,宽泛规则放后面,精准规则放前面。
  5. iptables 临时生效,重启丢失,需要手动保存;现代系统很多已经改用 nftables
  6. -L 不带 -n 会反向解析域名,查看规则很慢。

八、iptables vs nftables

  • iptables:旧实现,多表多链,语法零散;Linux 内核逐步废弃。
  • nftables:新一代框架,统一架构,语法更简洁,替代 iptables/ip6tables/arptables。

九、面试精简版考点

  1. iptables 底层是 netfilter;用户态工具操作内核数据包钩子。
  2. 4 表 5 链,表优先级 raw > mangle > nat > filter。
  3. 包流转路径,区分 INPUT(访问本机)和 FORWARD(转发)。
  4. 状态模块 state NEW/ESTABLISHED/RELATED/INVALID。
  5. SNAT 在 POSTROUTING;DNAT 在 PREROUTING。
  6. MASQUERADE 适用于动态公网 IP。

==================================================

firewalld 知识点总结

firewalld 是 CentOS7+/RHEL7+ 默认防火墙,动态防火墙,不用重启服务即可更新规则,底层还是 netfilter,区别于 iptables(静态)。

一、核心概念

  1. 区域 zone (核心!按可信等级划分流量,一个网卡绑定一个 zone)

    zone 说明 默认策略
    trusted 信任所有连接 全部允许
    home 家庭内网,信任局域网设备 允许常用服务
    internal 内部网络 允许常用服务
    work 工作网络 允许常用服务
    public 默认,公网,不信任外部主机 仅允许 ssh、dhcpv6-client
    external 外网,开启地址伪装 NAT 出站转发
    dmz 隔离区,对外服务器 仅允许指定服务
    block 阻止所有连接,返回拒绝 全部拒绝
    drop 丢弃数据包,不回复 全部丢弃(无回应)

默认 zone:public;网卡可以绑定 zone,流量按网卡所属 zone 匹配规则。

  1. 服务 service firewalld 内置预定义服务配置(/usr/lib/firewalld/services/*.xml),包含端口、协议、描述。

优先用服务名,而不是直接写端口,可读性高。

  1. 两种配置模式
  • runtime(运行时) :临时生效,重启 firewalld 失效,不加--permanent就是 runtime
  • permanent(永久) :写入配置文件,必须重载reload才生效 ,加--permanent参数

命令口诀:永久加--permanent,改完要firewall-cmd --reload

  1. 富规则 rich-rule 复杂规则,支持源 IP、目的 IP、端口、协议、日志、拒绝 / 允许,优先级高于普通端口 / 服务规则。

二、常用 firewall-cmd 命令

查看信息

复制代码
# 查看默认zone
firewall-cmd --get-default-zone
# 列出所有zone
firewall-cmd --get-zones
# 查看当前zone的规则(runtime)
firewall-cmd --list-all
# 查看指定zone规则
firewall-cmd --list-all --zone=public
# 查看网卡绑定哪个zone
firewall-cmd --get-active-zones
# 查看支持的所有预定义服务
firewall-cmd --get-services

修改默认 zone

复制代码
firewall-cmd --set-default-zone=public

服务管理(推荐用法)

复制代码
# 临时放行http服务
firewall-cmd --add-service=http
# 永久放行http,重载生效
firewall-cmd --add-service=http --permanent
firewall-cmd --reload

# 移除服务
firewall-cmd --remove-service=http --permanent
firewall-cmd --reload

端口管理

复制代码
# 永久放行tcp 8080端口
firewall-cmd --add-port=8080/tcp --permanent
# 端口范围 1000-2000 tcp
firewall-cmd --add-port=1000-2000/tcp --permanent
# 删除端口
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload

源 IP 控制(允许 / 拒绝某个网段)

复制代码
# 允许192.168.1.0/24网段访问当前zone
firewall-cmd --add-source=192.168.1.0/24 --permanent
# 将源网段绑定到trusted区域(信任这个网段)
firewall-cmd --add-source=10.0.0.0/8 --zone=trusted --permanent
firewall-cmd --reload

网卡绑定 zone

复制代码
firewall-cmd --add-interface=eth1 --zone=external --permanent
firewall-cmd --reload

三、NAT 端口转发 / 地址伪装

  1. 地址伪装(SNAT,共享上网,external 区域常用)

    开启伪装

    firewall-cmd --add-masquerade --zone=external --permanent
    firewall-cmd --reload

    查看是否开启伪装

    firewall-cmd --query-masquerade --zone=external

  2. 端口转发(DNAT,外部访问本机端口转发到内部 IP 端口)

前提:masquerade 开启、内核 ip 转发打开

复制代码
# 将本机80端口转发到192.168.1.100:80
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=80 --permanent
firewall-cmd --reload

四、富规则 rich rule 示例(高级规则)

语法模板: rule [family="ipv4|ipv6"] source address=xxx destination address=xxx port port=xxx protocol=xxx accept|reject|drop [log]

复制代码
# 拒绝192.168.1.20访问22端口并记录日志
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.20/32" port protocol="tcp" port="22" reject log'

# 只允许10.0.0.0/24访问3306,其他IP禁止访问mysql
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="3306" protocol="tcp" accept'
# 拒绝所有其他ip访问3306
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" reject'

# 查看富规则
firewall-cmd --list-rich-rules
# 删除富规则:把add改成remove,其余内容不变
firewall-cmd --permanent --remove-rich-rule='xxx'
firewall-cmd --reload

富规则从上到下匹配,匹配即停止,越具体规则写越靠前。

五、服务启停与配置文件

复制代码
# 开机自启、启动、停止、状态
systemctl enable --now firewalld
systemctl stop firewalld
systemctl status firewalld

配置文件目录:

  • /etc/firewalld/ 用户自定义配置(优先级高)
  • /usr/lib/firewalld/ 系统自带默认模板,不要直接修改

六、重要注意点(面试高频)

  1. firewall-cmd --reload:重载永久规则,不中断现有连接--complete-reload 会断开已有连接,慎用
  2. 优先级顺序:富规则 > 端口 / 服务 / 源规则 > zone 默认策略
  3. firewalld 和 iptables 不能同时启用,二者底层都是 netfilter,冲突
  4. 默认策略:zone 的默认策略只控制入站流量,本机向外发起的流量默认放行
  5. 端口转发需要开启内核 IP 转发:echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf && sysctl -p
  6. 规则删除:add → remove,参数完全一致

七、面试简答速记

  1. firewalld 和 iptables 区别:firewalld 动态、zone 模型,不用重启;iptables 静态,修改需要重载,用链模型。
  2. zone 作用:对不同网络环境预定义一套策略,网卡 / 源地址绑定 zone 实现流量分类控制。
  3. permanent 参数:永久保存,必须 reload 生效;不加则临时,重启失效。
  4. masquerade:地址伪装,SNAT,内网主机共享公网 IP 上网。
相关推荐
RisunJan1 小时前
丝连族谱 0452 — 功能拆解与使用手册
学习
老王爱玩车2 小时前
深入理解指针2
c语言·开发语言·学习
那年窗外下的雪.3 小时前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
龚寿生3 小时前
23-敏捷开发实战:从Scrum到看板的团队协作方法论
android·学习·scrum·敏捷流程
cc_yy_zh4 小时前
学习使用kali抓包
服务器·学习·php
动词ing4 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
彧azz4 小时前
Git 入门实操实例:从安装到远程仓库全流程
大数据·笔记·git·学习·elasticsearch
babe小鑫5 小时前
生物统计学专业校招:SAS、R、Python学习顺序实用指南
python·学习·r语言