Linux下iptables的一些使用习惯和操作

公司折腾了一天的iptables做DNAT,试图过滤源端口未果,但是折腾的结果可以记录一下:

基本介绍

处理顺序

iptables 中有四个主要表,它们的处理顺序如下:

  1. raw 表:
    主要用于决定是否对数据包进行状态跟踪。
    包含 PREROUTING 和 OUTPUT 两个链。
    优先级最高,通常用于禁用或启用连接跟踪。
  2. mangle 表:
    用于修改数据包的头部信息(如 TTL、TOS)或为数据包打标记。
    包含 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 五个链。
    常用于策略路由、QoS 控制等。
  3. nat 表:
    用于地址转换(如 SNAT、DNAT)。
    包含 PREROUTING、OUTPUT 和 POSTROUTING 三个链。
    在数据包经过路由决策之前或之后进行地址转换。
  4. filter 表:
    默认表,用于决定是否允许数据包通过(如 ACCEPT、DROP、REJECT)。
    包含 INPUT、FORWARD 和 OUTPUT 三个链。
    优先级最低,通常用于防火墙规则。

链顺序

在每个表中,数据包会依次经过以下链:

  1. PREROUTING:
    数据包进入网络接口后,首先经过 PREROUTING 链。
    用于在路由决策之前对数据包进行处理(如地址转换或标记)。
  2. INPUT:
    如果数据包的目标是本机,会经过 INPUT 链。
    用于决定是否允许数据包进入本机。
  3. FORWARD:
    如果数据包需要经过本机转发到其他网络接口,会经过 FORWARD 链。
    用于决定是否允许数据包通过本机转发。
  4. OUTPUT:
    本机发出的数据包会经过 OUTPUT 链。
    用于决定是否允许数据包离开本机。
  5. POSTROUTING:
    数据包经过路由决策后,最后经过 POSTROUTING 链。
    用于在数据包离开本机之前进行处理(如地址转换)。

规则顺序

在每个链中,规则的顺序决定了数据包的处理方式:
数据包会从上到下依次匹配链中的规则。
一旦匹配到某条规则,就会执行该规则的动作(如 ACCEPT、DROP、REJECT 等)。
如果数据包没有匹配到任何规则,则会执行链的默认策略(如 ACCEPT 或 DROP)。

完整顺序

以下是数据包在 iptables 中的完整处理流程:

  1. 数据包进入网络接口。
  2. raw 表的 PREROUTING 链:决定是否对数据包进行状态跟踪。
  3. mangle 表的 PREROUTING 链:修改数据包的头部信息或打标记。
  4. nat 表的 PREROUTING 链:进行目标地址转换(DNAT)。
  5. 数据包进行路由决策(决定目标接口)。
  6. mangle 表的 INPUT 或 FORWARD 链:
  7. 如果目标是本机,进入 INPUT 链。
  8. 如果需要转发,进入 FORWARD 链。
  9. filter 表的 INPUT 或 FORWARD 链:
  10. 如果目标是本机,进入 INPUT 链。
  11. 如果需要转发,进入 FORWARD 链。
  12. mangle 表的 OUTPUT 链:修改本机发出的数据包。
  13. nat 表的 OUTPUT 链:进行源地址转换(SNAT)。
  14. mangle 表的 POSTROUTING 链:修改数据包的头部信息或打标记。
  15. nat 表的 POSTROUTING 链:进行源地址转换(SNAT)。
  16. 数据包离开本机。

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

参考

Kimi.ai

posted @   风惊庭前叶  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示