You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WireGuard转发数据包未触发POSTROUTING规则,恢复后寻求原因解析

WireGuard转发数据包未触发POSTROUTING规则,恢复后寻求原因解析

我最近碰到了一个WireGuard流量转发的诡异问题,配置逻辑很简单但最后一步就是不生效,折腾半天后意外恢复了,但还是没完全搞懂背后的原因,来跟大家说说这个情况:

问题场景

我的WireGuard配置很基础:客户端分配10.7.0.0/24网段地址,流量转发到主接口,最后要把发往192.168.1.0/24的数据包通过主接口做SNAT。前面的转发都正常,唯独最后一步SNAT完全没反应,甚至我在POSTROUTING表加的LOG规则都触发不了。

下面是从10.7.0.2 ping 192.168.1.185的内核TRACE输出:

kernel: [  524.154478] TRACE: raw:PREROUTING:policy:2 IN=wg0 OUT= MAC= SRC=10.7.0.2 DST=192.168.1.185 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=7783 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=542

kernel: [  524.154502] TRACE: filter:FORWARD:rule:1 IN=wg0 OUT=ens192 MAC= SRC=10.7.0.2 DST=192.168.1.185 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=7783 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=542

kernel: [  524.154507] IN=wg0 OUT=ens192 MAC= SRC=10.7.0.2 DST=192.168.1.185 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=7783 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=542

kernel: [  524.154512] TRACE: filter:FORWARD:rule:3 IN=wg0 OUT=ens192 MAC= SRC=10.7.0.2 DST=192.168.1.185 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=7783 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=542

从TRACE能看到,filter:FORWARD:rule:1的LOG规则触发正常,数据包也走到了filter:FORWARD:rule:3,这部分逻辑是对的。

当时的FORWARD链规则如下:

Chain FORWARD (policy ACCEPT 92 packets, 4848 bytes)

pkts bytes target     prot opt in     out     source               destination

4   240 LOG        icmp --  *      *       0.0.0.0/0            192.168.1.185        LOG flags 0 level 4

0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

430 28493 ACCEPT     all  --  *      *       10.7.0.0/24          0.0.0.0/0

但我搞不懂的是,数据包走完FORWARD之后,完全没触发POSTROUTING的任何规则,连LOG都没有。当时的POSTROUTING链规则:

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target     prot opt in     out     source               destination

0     0 LOG        icmp --  *      *       0.0.0.0/0            192.168.1.185        LOG flags 0 level 4

0     0 SNAT       all  --  *      *       10.7.0.0/24         !10.7.0.0/24          to:192.168.1.124

初始完整规则

我当时的完整iptables规则:

*nat

:PREROUTING ACCEPT [0:0]

:INPUT ACCEPT [26:2369]

:OUTPUT ACCEPT [0:0]

:POSTROUTING ACCEPT [0:0]

[0:0] -A POSTROUTING -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to-source 192.168.1.124

COMMIT

# Completed on Thu May 18 00:16:56 2023

# Generated by iptables-save v1.6.1 on Thu May 18 00:16:56 2023

*filter

:INPUT ACCEPT [3598:452715]

:FORWARD ACCEPT [12:720]

:OUTPUT ACCEPT [2685:370730]

[240:33000] -A INPUT -p udp -m udp --dport 52160 -j ACCEPT

[0:0] -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

[228:15470] -A FORWARD -s 10.7.0.0/24 -j ACCEPT

COMMIT

同时nftables的规则是:

sudo nft list ruleset

table inet filter {

chain input {

type filter hook input priority filter; policy accept;

}

chain forward {

type filter hook forward priority filter; policy accept;

}

chain output {

type filter hook output priority filter; policy accept;

}

}

意外恢复的情况

后来我在查看其他iptables规则的时候,突然发现一切都正常了,SNAT开始生效,POSTROUTING的规则也能触发了。恢复后的iptables-save输出如下:

# Generated by iptables-save v1.6.1 on Thu May 18 00:48:19 2023

*raw

:PREROUTING ACCEPT [6532:813762]

:OUTPUT ACCEPT [4430:674431]

COMMIT

# Completed on Thu May 18 00:48:19 2023

# Generated by iptables-save v1.6.1 on Thu May 18 00:48:19 2023

*mangle

:PREROUTING ACCEPT [12837:1592394]

:INPUT ACCEPT [11726:1478490]

:FORWARD ACCEPT [1111:113904]

:OUTPUT ACCEPT [8651:1277974]

:POSTROUTING ACCEPT [9762:1391878]

COMMIT

# Completed on Thu May 18 00:48:19 2023

# Generated by iptables-save v1.6.1 on Thu May 18 00:48:19 2023

*nat

:PREROUTING ACCEPT [1678:159704]

:INPUT ACCEPT [1932:186621]

:OUTPUT ACCEPT [4667:280576]

:POSTROUTING ACCEPT [4674:280996]

[110:7552] -A POSTROUTING -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to-source 192.168.1.124

COMMIT

# Completed on Thu May 18 00:48:19 2023

# Generated by iptables-save v1.6.1 on Thu May 18 00:48:19 2023

*filter

:INPUT ACCEPT [19546:2623783]

:FORWARD ACCEPT [502:28104]

:OUTPUT ACCEPT [15543:2246022]

[1835:264832] -A INPUT -p udp -m udp --dport 52160 -j ACCEPT

[1136:122259] -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

[533:36117] -A FORWARD -s 10.7.0.0/24 -j ACCEPT

COMMIT

# Completed on Thu May 18 00:48:19 2023

我的两个猜测

现在我有两个可能的方向,但还不确定哪个是对的:

  • NAT表只对新连接生效,但我不太清楚系统是怎么判定一个连接是否为“新”的
  • 当时查看mangle表规则的时候,系统自动创建了mangle表,会不会这个操作改变了数据包的处理路径或者内核的行为?

有没有大佬能帮我分析下真正的原因?

备注:内容来源于stack exchange,提问作者Liam Kelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:12:58