iptabls
Linux 内核 netfilter 模块的用户态控制工具,即 iptables 是 Linux 内核 netfilter 的命令行接口,用来控制“数据包进出机器的行为”
分为两大功能:
功能 | 表(table) | 常见用途 |
---|---|---|
防火墙控制 | filter 表 | 阻挡/允许哪些包能进、能出、能被处理 |
NAT 转发伪装 | nat 表 | 内网穿透、端口映射、SNAT/DNAT |
iptables 表-链-规则
类型 | 表(table) | 链(chain) | 作用 |
---|---|---|---|
防火墙 | filter | INPUT / FORWARD / OUTPUT | 控制包通不通过 |
NAT | nat | PREROUTING / POSTROUTING / OUTPUT | 改变 IP/内网转公网(SNAT)、端口实现转发/端口映射(DNAT) |
数据改造 | mangle | 所有链 | 修改数据包内容、打标 |
忽略连接跟踪 | raw | PREROUTING / OUTPUT | 跳过 conntrack,提高性能 |
Linux iptables 数据包流转图
sh
-->[PREROUTING]--+-->[Routing Decision]--+-->[FORWARD]--+-->[POSTROUTING]--->>>
| |
| +-->[INPUT]-->[Local Process]-->[OUTPUT]-->[POSTROUTING]-->>>
|
[mangle/nat tables]
防火墙
防火墙种类:
- 硬件防火墙
- F5
- 软件防火墙
- iptables
- firewalld
- nftables
- 安全组
iptables 命令结构公式:
iptables -t 表名 -A 链名 -p 协议 -s 来源 -d 目标 --dport 端口 -j 动作
语法块 | 意义 | 示例 |
---|---|---|
-t | 表名,常用 filter / nat | -t nat |
-A / -I | 添加 / 插入规则 | -A INPUT |
-p | 协议类型 | -p tcp |
-s | 来源 IP | -s 192.168.1.1 |
-d | 目标 IP | -d 8.8.8.8 |
--dport | 目标端口 | --dport 80 |
--sport | 来源端口 | --sport 443 |
-j | 动作(跳转) | -j ACCEPT 、-j DROP 、-j DNAT |
--to-port | 重定向目标端口 | --to-port 3000 (配合 DNAT) |
防火墙策略的思维方式:默认拒绝 + 显式允许
sh
# 默认先把所有流量拒绝掉(白名单)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT # 出口默认可以,也可以 DROP 后慢慢加规则
# 显式放行常用服务
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 回包
案例解析:搞个只开放 Web 服务的主机
目标:
- 开放 80/443 端口(Web)
- 允许 SSH 远程(端口 22)
- 其他一律 drop(含 ping、其他端口扫描)
sh
# 清空旧规则
iptables -F
iptables -X
iptables -Z
# 默认策略
iptables -P INPUT DROP # -P 这条链默认怎么处理包:iptables -P <链名> <动作>
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 放行本地回环
iptables -A INPUT -i lo -j ACCEPT
# 放行 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行 Web
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 放行回包(最重要的通用规则)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
通俗图解
sh
🧑 客户端 🖥️ 服务器(运行 iptables)
8.8.8.8 192.168.1.10
发起 SSH 连接 ───────────────▶ SYN 到达服务端
→ 命中 INPUT 链(dport 22),放行
◀─────────────── 回包 SYN-ACK 发出
→ 这属于服务端 OUTPUT 链,默认放行
发 ACK,进入 SSH 通信 ───────▶
→ 这是客户端发来的 TCP 包 → 走 INPUT 链!
→ conntrack 判定状态是 ESTABLISHED,放!
附加骚操作:只允许特定 IP 访问 SSH?
sh
# 只允许 1.2.3.4 的机器访问你 22 端口,别人碰都别想碰到。
iptables -A INPUT -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT
怎么调试防火墙规则?
sh
# --line-numbers:方便你用编号删除指定规则
iptables -L -n -v --line-numbers
删除某一条规则:
sh
iptables -D INPUT 3 # 删除 INPUT 链的第 3 条规则
sh
# 查看 filter 表 默认
iptables -L -n -v
# 查看特定表(比如 nat 表)
iptables -t nat -L -n -v
NAT:SNAT 和 DNAT
操作 | 改谁 | 在哪条链上干活 | 用途 | ??? |
---|---|---|---|---|
SNAT | 改源地址 | POSTROUTING | 内网出网伪装 | 地址伪装 |
DNAT | 改目标地址 | PREROUTING | 外部访问内网 | 端口转 |
SNAT:内网流量出网时伪装
- 用途:内网机器共享上网 / 做出口 NAT
- SNAT(Source NAT):改的是源地址
- 内网访问 → 改源 IP → 伪装成出口 IP
- 举例:192.168.1.10 → 出去时伪装成 123.1.1.1
sh
iptables -t nat -A POSTROUTING \
# 指定来源网段
# SNAT 把 IP“统一伪装”了,但 Linux 内核(连接状态表)帮你记录了“谁是扮演者”,保证回包能准确送达
-s 192.168.1.0/24 \
-o eth0 \ # 出口设备
-j SNAT \
--to-source 14.25.23.47 # 把源 IP 改成哪个公网 IP
DNAT:外网访问转发到内网
- 用途:做内网端口映射 / 做反向代理 / 做边缘网关
- DNAT(Destination NAT):改的是目标地址
- 外部访问 → 改目标 IP → 转到内网机器
- 举例:公网 IP:14.25.23.47:443 → 转发到内网 192.168.1.77:5566
sh
iptables -t nat -A PREROUTING \
-d 14.25.23.47 \ # 外部访问的公网 IP
-p tcp \
--dport 443 \ # 外部访问的端口
-j DNAT \
--to-destination 192.168.1.77:5566 # 转发到哪个内网 IP 和端口
内网主机看到的源 IP 仍然是客户端的真实 IP(公网 IP)
案例:使用 iptables 做内网穿透
iptables 实现内网穿透的原理核心:DNAT + SNAT(也就是端口映射),让网关把外部来的请求转发到内网机器。
- 假设场景:
- 一台公网服务器:
公网IP = 1.2.3.4
- 内网服务机器:
内网IP = 192.168.1.100
,上面跑着一个服务8080
端口
- 一台公网服务器:
- 目标:
- 外部访问
1.2.3.4:8888
,就能访问到192.168.1.100:8080
- 外部访问
iptables 配置
bash
# 1. DNAT:把外部访问 1.2.3.4:8888 的流量,转发给内网服务
iptables -t nat -A PREROUTING \
-p tcp \
--dport 8888 \
-j DNAT \
--to-destination 192.168.1.100:8080
# 2. SNAT(或 MASQUERADE):让内网服务响应包,走回公网 IP,而不是它默认的内网路由
iptables -t nat -A POSTROUTING \
-d 192.168.1.100 \
-p tcp \
--dport 8080 \
-j SNAT \
--to-source 1.2.3.4
# 或用 MASQUERADE(动态 IP 更方便)
iptables -t nat -A POSTROUTING -j MASQUERADE
流程剖析
- PREROUTING:当外部用户访问
1.2.3.4:8888
,数据包先进入 PREROUTING 链,被 DNAT 改写目标地址为192.168.1.100:8080
- 内核路由决策:决定这包转发到内网机器
- POSTROUTING:在发出去之前,SNAT 把源地址改成公网 IP(防止内网服务不知道怎么回包)
- 数据包命中内网服务,返回时也通过 SNAT 再改回去
为啥要 SNAT?
如果你不 SNAT,内网服务看到的是外部真实 IP,它默认不知道怎么把包回给公网(除非你做路由表)。SNAT 就是让它以为这包是从“邻居”(网关)发来的,于是它乖乖回你。
总结
阶段 | 目的 | iptables 表/链 | 技术名称 |
---|---|---|---|
出口伪装 | 改源 IP(回包) | nat/POSTROUTING | SNAT/MASQUERADE |
入口伪装 | 改目标 IP | nat/PREROUTING | DNAT |
masquerading:用于将内网的私有 IP 地址转换为公共 IP 地址。
🔥 iptables 实战训练营
🧭 阶段一:基础打地基(认识规则 + 初体验)
目标:理解 iptables 的核心结构,能写最基本的规则
✅ 学会的内容:
- iptables 是什么、在哪一层工作
- 五个表(filter、nat、mangle、raw、security)先记两个:filter、nat
- 四大链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING(分属不同表)
🛠 实战 Demo 1:局域网内禁止 ping 本机
bash
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
骚点:拿这条命令玩“自己不让人 ping 自己”,观察 ping 的行为变化。
🛠 实战 Demo 2:只允许指定 IP 访问本机 22 端口(SSH)
bash
iptables -A INPUT -p tcp --dport 22 -s 10.0.4.3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
用来模拟内网 SSH 白名单场景,兄弟你把这个改一改都能做跳板机防护。
⚔️ 阶段二:进阶实操(封杀拦截 + 流量控制)
目标:学会用 iptables 做流量策略与访问控制
✅ 学会的内容:
- 如何查看现有规则 (
iptables -L -n -v
) - 如何插入、删除、清空规则
- iptables-save / iptables-restore
🛠 实战 Demo 3:禁止某 IP 访问你的 Web 服务(端口 80)
bash
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 80 -j DROP
🛠 实战 Demo 4:限制 ssh 登录尝试频率(防爆破)
bash
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
小意思就防住了爆破,懂的都懂,宝你拿来当 honeypot 的配套技能都够用了。
🧠 阶段三:掌控 NAT(端口转发 + 容器适配)
目标:理解 PREROUTING 和 POSTROUTING 的魔法,能写端口映射规则
✅ 学会的内容:
- DNAT:把流量引到某个后端服务
- SNAT:修改来源 IP(多用于出网)
🛠 实战 Demo 5:外部访问本机端口 8080,实际转发到 127.0.0.1:3000
bash
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 3000
🛠 实战 Demo 6:做一个简易反向代理(端口级)
bash
iptables -t nat -A PREROUTING -p tcp --dport 8081 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A POSTROUTING -j MASQUERADE
宝你这就能模拟外网访问内网服务器的流量穿越,简直小型边缘网关!
🚨 阶段四:防火墙实战(打造你自己的防御塔)
目标:你能把一台服务器防火墙策略写全 + 备份 + 自动加载
✅ 学会的内容:
- iptables-save > 规则持久化
- 写系统启动脚本自动加载
- 用 shell 脚本模板快速部署规则
🛠 实战 Demo 7:一键初始化规则模板(仅开放 22/80/443)
bash
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Allow loopback
iptables -A INPUT -i lo -j ACCEPT
# Allow SSH/Web
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
🧠 Bonus:进阶玩法你可以挑战
ipset
:批量封 IP 神器iptables + fail2ban
:自动封 IP,抗暴力破解nftables
作为下一代替代方案