本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一,iptables
1,iptales简介
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,
iptables和netfilter的关系:
iptables只是Linux防火墙的管理工具而已,真正实现防火墙功能的是netfilter,Netfilter 是 Linux 内核中的一个框架,用于实现网络数据包的过滤、网络地址转换(NAT)和其他数据包处理功能。
2,iptables的表与链
2.1,Netfilter 在内核网络栈中设置了5个关键的钩子点(也称为链)
- 数据包会依次通过这些点:
- PREROUTING:数据包进入网络栈后,在进行路由判断之前
- INPUT:数据包目标是本机,路由判断后
- FORWARD:数据包需要转发到其他主机,路由判断后
- OUTPUT:本机产生的数据包,发送出去之前
- POSTROUTING:数据包即将离开网络栈之前
3、4个表
3.1,Netfilter 将规则组织在4个表中,每个表有特定的用途:
- filter表:负责过滤数据包(接受、拒绝或丢弃)
- 包含的链:INPUT、FORWARD、OUTPUT
- nat表:负责网络地址转换(NAT)
- 包含的链:PREROUTING、OUTPUT、POSTROUTING
- mangle表:用于修改数据包内容(如TTL、TOS等)
- 包含的链:所有5个链
- raw表:用于连接跟踪豁免等特殊用途
- 包含的链:PREROUTING、OUTPUT
3.2,表的作用
3.2.1.filter 表(过滤表)
作用:默认表,用于数据包过滤,决定是否允许数据包通过(如DROP、ACCEPT、REJECT、LOG)
包含的链:
- INPUT:处理目标是本机的入站数据包
- FORWARD:过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
- OUTPUT:处理本机产生的出站数据包,过滤所有本地生成的包
3.2.2.nat 表(网络地址转换表)
作用:用于网络地址转换(IP/MASQUERADE/PORT)修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)
包含的链:
- PREROUTING:在路由决策前修改数据包(常用于DNAT)
- POSTROUTING:在数据包离开前修改数据包(常用于SNAT/MASQUERADE)
- OUTPUT:对本机产生的数据包进行目的地址转换
3.2.3.mangle 表(修改表)
作用:用于特殊的数据包修改(如TTL、TOS、MARK等)强烈建议不要在这个表里做任何过滤
包含的链:
- PREROUTING:进入路由决策前修改
- INPUT:进入本机前修改
- FORWARD:转发数据包时修改
- OUTPUT:本机发出数据包前修改
- POSTROUTING:数据包离开前修改
3.2.4.raw 表(原始表)
作用:用于数据包跟踪豁免和连接跟踪前处理
包含的链:
- PREROUTING:在连接跟踪前处理
- OUTPUT:对本机产生的数据包在连接跟踪前处理
3.2.5数据包处理流程中的表优先级
当数据包经过一个链时,各表的处理顺序是固定的:
- raw 表(连接跟踪豁免)
- mangle 表(通用数据包修改)
- nat 表(地址转换)
- filter 表(最终过滤决策)
3.3、表和链的对应关系
| 表名 | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
|---|---|---|---|---|---|
| raw | ✓ | ✓ | |||
| mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
| nat | ✓ | ✓ | ✓ | ||
| filter | ✓ | ✓ | ✓ |
4,数据处理流程
- 入站数据包流程:
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 | 返回调用链 |
5.iptables的基本操作
5.1查看规则
查看规则集
[root@ceshi ~]# iptables --list -n
加一个-n以数字形式显示IP和端口,而不是默认的服务名称
5.2修改规则
配置默认规则,不允许数据进入
[root@ceshi ~]# iptables -P INPUT DROP
允许转发
[root@ceshi ~]# iptables -P FORWARD ACCEPT
不允许数据流出
[root@ceshi ~]# iptables -P OUTPUT DROP
5.3添加规则
允许源IP地址为192.168.0.0/24网段的包流进(包括所有的协议,这里也可以指定单个IP)
[root@ceshi ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
允许所有的IP到192.168.0.22的访问
[root@ceshi ~]# iptables -A INPUT -d 192.168.0.22 -j ACCEPT
开放本机80端口
[root@ceshi ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
开放本机的ICMP协议
[root@ceshi ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
5.4删除规则
删除允许源地址进入的规则
[root@ceshi ~]# iptables -D INPUT -s 192.168.0.21 -j ACCEPT
三,iptables操作实例
1.清空所有规则
# 清空所有规则
iptables -F
#清空自定义规则
iptables -X
#清空防火墙的统计数据
iptables -Z
iptables -t nat -F #清空nat表里的所有规则
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
2.添加(删除)规则拒绝用户访问22端口
#拒绝用户访问22端口
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
#查看规则并加上序号
iptables -t filter -nL --line-number
#删除规则
iptables -t filter -D INPUT 1 #根据序号删除
#只允许192.168.0.3的机器进行SSH连接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
#允许或限制一段IP地址可用192.168.0.0/24
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
#只允许除了192.168.0.3的主机外都能进行SSH连接
iptables -A INPUT -s ! 192.168.0.3 -p tcp --dport 22 -j ACCEPT
3.开启某些端口
#允许用户访问服务器80端口(服务器80是用户角度的目标端口)
[root@ceshi ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许从本机发出的、源端口为 80 的 TCP 数据包通过防火墙。
[root@ceshi ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
#开启邮件服务的25、110端口
[root@ceshi ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@ceshi ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
#允许icmp服务进出
[root@ceshi ~]# iptables -A INPUT -p icmp -j ACCEPT
[root@ceshi ~]# iptables -A OUTPUT -p icmp -j ACCEP
4.封ip,屏蔽某个ip
#屏蔽单个IP的命令
iptables -I INPUT -s 123.45.6.7 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#查看已添加的iptables规则
iptables -L -n -v
5.添加白名单
“`bash
允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT
允许183.121.3.7访问本机的3380端口
iptables -A INPUT -p tcp -s 183.121.3.7 –dport 3380 -j ACCEPT

