Linux下iptables的一些使用习惯和操作
公司折腾了一天的iptables做DNAT,试图过滤源端口未果,但是折腾的结果可以记录一下:
基本介绍
处理顺序
iptables 中有四个主要表,它们的处理顺序如下:
- raw 表:
主要用于决定是否对数据包进行状态跟踪。
包含 PREROUTING 和 OUTPUT 两个链。
优先级最高,通常用于禁用或启用连接跟踪。 - mangle 表:
用于修改数据包的头部信息(如 TTL、TOS)或为数据包打标记。
包含 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 五个链。
常用于策略路由、QoS 控制等。 - nat 表:
用于地址转换(如 SNAT、DNAT)。
包含 PREROUTING、OUTPUT 和 POSTROUTING 三个链。
在数据包经过路由决策之前或之后进行地址转换。 - filter 表:
默认表,用于决定是否允许数据包通过(如 ACCEPT、DROP、REJECT)。
包含 INPUT、FORWARD 和 OUTPUT 三个链。
优先级最低,通常用于防火墙规则。
链顺序
在每个表中,数据包会依次经过以下链:
- PREROUTING:
数据包进入网络接口后,首先经过 PREROUTING 链。
用于在路由决策之前对数据包进行处理(如地址转换或标记)。 - INPUT:
如果数据包的目标是本机,会经过 INPUT 链。
用于决定是否允许数据包进入本机。 - FORWARD:
如果数据包需要经过本机转发到其他网络接口,会经过 FORWARD 链。
用于决定是否允许数据包通过本机转发。 - OUTPUT:
本机发出的数据包会经过 OUTPUT 链。
用于决定是否允许数据包离开本机。 - POSTROUTING:
数据包经过路由决策后,最后经过 POSTROUTING 链。
用于在数据包离开本机之前进行处理(如地址转换)。
规则顺序
在每个链中,规则的顺序决定了数据包的处理方式:
数据包会从上到下依次匹配链中的规则。
一旦匹配到某条规则,就会执行该规则的动作(如 ACCEPT、DROP、REJECT 等)。
如果数据包没有匹配到任何规则,则会执行链的默认策略(如 ACCEPT 或 DROP)。
完整顺序
以下是数据包在 iptables 中的完整处理流程:
- 数据包进入网络接口。
- raw 表的 PREROUTING 链:决定是否对数据包进行状态跟踪。
- mangle 表的 PREROUTING 链:修改数据包的头部信息或打标记。
- nat 表的 PREROUTING 链:进行目标地址转换(DNAT)。
- 数据包进行路由决策(决定目标接口)。
- mangle 表的 INPUT 或 FORWARD 链:
- 如果目标是本机,进入 INPUT 链。
- 如果需要转发,进入 FORWARD 链。
- filter 表的 INPUT 或 FORWARD 链:
- 如果目标是本机,进入 INPUT 链。
- 如果需要转发,进入 FORWARD 链。
- mangle 表的 OUTPUT 链:修改本机发出的数据包。
- nat 表的 OUTPUT 链:进行源地址转换(SNAT)。
- mangle 表的 POSTROUTING 链:修改数据包的头部信息或打标记。
- nat 表的 POSTROUTING 链:进行源地址转换(SNAT)。
- 数据包离开本机。
filter:默认表(过滤)
# 查看默认表(filter表)规则 iptables -nvL # 允许TCP端口1234的流量进入本机 iptables -A INPUT -p tcp --dport 1234 -j ACCEPT # 允许UDP端口1234的流量进入本机 iptables -A INPUT -p udp --dport 1234 -j ACCEPT # 允许来自特定IP地址(192.168.1.100)的流量进入本机 iptables -A INPUT -s 192.168.1.100 -j ACCEPT # 允许来自特定网络段(192.168.1.0/24)的流量进入本机 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许本机发出的所有流量 iptables -A OUTPUT -j ACCEPT # 允许所有经过本机转发的流量 iptables -A FORWARD -j ACCEPT # 删除允许TCP端口1234的规则 iptables -D INPUT -p tcp --dport 1234 -j ACCEPT # 删除允许UDP端口1234的规则 iptables -D INPUT -p udp --dport 1234 -j ACCEPT # 删除INPUT链中的所有规则 iptables -F INPUT # 删除OUTPUT链中的所有规则 iptables -F OUTPUT # 删除FORWARD链中的所有规则 iptables -F FORWARD # 清空filter表的所有规则 iptables -F # 设置默认策略为允许所有流量 iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # 设置默认策略为拒绝所有流量 iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP # 允许已建立的连接继续通信 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许本地回环接口(127.0.0.1)的流量 iptables -A INPUT -i lo -j ACCEPT
补充:开启本机ip转发
# 开启本机ip转发(临时) echo 1 > /proc/sys/net/ipv4/ip_forward # 开启本机ip转发(永久) sudo nano /etc/sysctl.conf net.ipv4.ip_forward = 1 sudo sysctl -p # 查看本机ip转发 sysctl net.ipv4.ip_forward
NAT:网络地址转换表
# 查看当前 NAT 表规则 iptables -t nat -L -v -n # 添加规则到 PREROUTING 链中,将所有目的端口为 10000 的流量都指向 192.165.20.20:10000 iptables -t nat -A PREROUTING -p udp --dport 10000 -j DNAT --to-destination 192.165.20.20:10000 # 添加规则到 OUTPUT 链中,将所有目的端口为 10000 的流量都指向 192.165.20.20:10000 iptables -t nat -A OUTPUT -p udp --dport 10000 -j DNAT --to-destination 192.165.20.20:10000 # 清空 NAT 表的所有规则 iptables -t nat -F # 删除当前 NAT 表的 PREROUTING 链中的所有规则 iptables -t nat -F PREROUTING # 删除当前 NAT 表的 OUTPUT 链中的所有规则 iptables -t nat -F OUTPUT # 删除当前 NAT 表的 POSTROUTING 链中的所有规则 iptables -t nat -F POSTROUTING
mangle表:修改包属性
给路由包打标记,实现策略路由
# 使用 mangle 表为数据包打标记 iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth0 -p udp --dport 53 -j MARK --set-mark 2 # 配置路由表 ip route add default via <eth1网关> dev eth1 table 10 ip route add default via <eth2网关> dev eth2 table 20 # 给数据包绑定对应路由表 ip rule add fwmark 1 table 10 ip rule add fwmark 2 table 20
修改TTL值
# 修改所有经过本机的数据包的 TTL 值 iptables -t mangle -A POSTROUTING -j TTL --ttl-set 64
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)