iptables用法
本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

一、iptables 基础概念

1. 什么是 iptables

iptables 是一个用户空间的命令行工具,用于配置 Linux 内核防火墙的网络过滤规则。它实际上是与内核中的 netfilter 框架交互的接口。

2. iptables 与 netfilter 的关系

  • netfilter:Linux 内核中的一个框架,提供了一系列的钩子(hook)来允许内核模块在网络栈的不同位置注册回调函数
  • iptables:用户空间工具,用于设置、维护和检查 netfilter 的规则表

3. 五个钩子点(hook points)

数据包在协议栈中的流动会经过五个钩子点:

  1. PREROUTING:数据包进入网络接口后,路由判断之前
  2. INPUT:数据包要进入本机
  3. FORWARD:数据包要被转发到其他接口
  4. OUTPUT:本机产生的数据包要发送出去
  5. POSTROUTING:数据包离开网络接口前,路由判断之后
微信图片20260105143509140141.png

二、iptables 表(table)和链(chain)

iptables 包含多个表,每个表包含多个链,链中包含具体的规则。

1. 四个主要的表

  1. filter 表:默认表,用于过滤数据包
  • 包含的链:INPUT, FORWARD, OUTPUT
  1. nat 表:用于网络地址转换
  • 包含的链:PREROUTING, OUTPUT, POSTROUTING
  1. mangle 表:用于修改数据包的特殊内容
  • 包含的链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  1. raw 表:用于配置数据包免除连接跟踪
  • 包含的链:PREROUTING, OUTPUT

2. 链的优先级顺序

当数据包到达时,将按照以下顺序经过各个表的链:

入站数据包
PREROUTING (raw → mangle → nat) → INPUT (mangle → filter)

转发数据包
PREROUTING (raw → mangle → nat) → FORWARD (mangle → filter) → POSTROUTING (mangle → nat)

出站数据包
OUTPUT (raw → mangle → nat → filter) → POSTROUTING (mangle → nat)

三、iptables 规则语法

1. 基本命令格式

iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 目标动作]

2. 常用命令选项

选项说明
-A在链尾追加规则
-I在指定位置插入规则
-D删除指定规则
-R替换指定规则
-L列出规则
-F清空链中所有规则
-N创建新链
-X删除自定义链
-P设置链的默认策略
-v显示详细信息
-n数字形式显示地址和端口

3. 常用匹配条件

通用匹配

  • -p 协议 (tcp, udp, icmp, all)
  • -s 源地址
  • -d 目标地址
  • -i 入站网卡
  • -o 出站网卡

TCP/UDP 扩展匹配

  • –sport 源端口
  • –dport 目标端口
  • –tcp-flags (SYN,ACK,FIN,RST,URG,PSH,ALL,NONE)

其他扩展匹配

  • -m state –state (NEW,ESTABLISHED,RELATED,INVALID)
  • -m limit –limit 限制速率
  • -m multiport 多端口匹配
  • -m time 时间匹配

4. 常用目标动作(-j)

动作说明
ACCEPT允许数据包通过
DROP丢弃数据包
REJECT拒绝数据包并返回错误信息
LOG记录日志
SNAT源地址转换
DNAT目标地址转换
MASQUERADE动态源地址转换(用于拨号网络)
REDIRECT端口重定向
RETURN返回调用链

四、iptables 配置示例

1. 基本防火墙配置

# 清空所有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -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 state --state ESTABLISHED,RELATED -j ACCEPT

# 允许SSH连接(22端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许HTTP(80)和HTTPS(443)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 允许DNS查询
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

2. NAT 配置示例

# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 源地址转换(内网访问外网)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 目标地址转换(端口映射)
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

3. 高级配置示例

# 限制SSH连接频率
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP

# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 记录被拒绝的数据包
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
iptables -A INPUT -j DROP

五、iptables 规则管理

1. 查看规则

# 查看filter表规则(默认)
iptables -L -n -v

# 查看nat表规则
iptables -t nat -L -n -v

# 查看规则带行号
iptables -L -n -v --line-numbers

2. 保存和恢复规则

# 保存规则(Ubuntu/Debian)
iptables-save > /etc/iptables.rules

# 恢复规则
iptables-restore < /etc/iptables.rules

# CentOS/RHEL保存规则
service iptables save

3. 删除规则

# 按编号删除
iptables -D INPUT 2

# 按条件删除
iptables -D INPUT -s 192.168.1.100 -j DROP

六、iptables 高级特性

1. 连接跟踪(conntrack)

iptables 使用连接跟踪来识别数据包之间的关系:

# 查看当前连接
cat /proc/net/nf_conntrack

# 或使用conntrack工具
conntrack -L

2. 自定义链

# 创建自定义链
iptables -N MYCHAIN

# 在自定义链中添加规则
iptables -A MYCHAIN -s 192.168.1.0/24 -j ACCEPT

# 从默认链跳转到自定义链
iptables -A INPUT -j MYCHAIN

3. 日志记录

# 记录被拒绝的SSH尝试
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "

# 限制日志频率
iptables -A INPUT -p tcp --dport 22 -m limit --limit 1/min -j LOG --log-prefix "SSH attempt: "

七、iptables 常见问题解决

1. 规则不生效

  • 检查规则顺序(规则是按顺序匹配的)
  • 检查默认策略
  • 确认相关内核模块已加载(nf_conntrack, iptable_filter等)
  • 检查是否有其他防火墙工具(如firewalld)冲突

2. 性能优化

  • 将常用规则放在前面
  • 使用-m state 匹配已建立连接
  • 避免过于复杂的规则
  • 合理使用自定义链

3. NAT 不工作

  • 确认启用了IP转发: echo 1 > /proc/sys/net/ipv4/ip_forward
  • 检查FORWARD链是否允许数据包通过
  • 确认NAT规则正确应用到正确的网卡

八、iptables 与 ip6tables

ip6tables 是 iptables 的 IPv6 版本,语法基本相同,但有一些 IPv6 特有的选项:

# 查看IPv6规则
ip6tables -L

# 允许ICMPv6(IPv6必需)
ip6tables -A INPUT -p icmpv6 -j ACCEPT

九、iptables 替代方案

虽然 iptables 仍然广泛使用,但现代 Linux 系统也提供了其他选择:

  1. nftables:iptables 的替代品,更高效的语法
  2. firewalld:基于动态防火墙的后端(可以使用iptables或nftables)
  3. ufw:Ubuntu的简化防火墙配置工具
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇