Fix FORWARD-drop reply handling

This commit is contained in:
2026-04-17 12:10:11 +08:00
parent 479c416b2f
commit 87ee5283c8
6 changed files with 61 additions and 46 deletions

View File

@@ -60,7 +60,7 @@
### 2.1 iptables 规则模板 (每条逻辑规则生成)
对协议 P (tcp/udp) × IP 族 F (iptables/ip6tables),生成 **3** iptables 规则:
对协议 P (tcp/udp) × IP 族 F (iptables/ip6tables),生成 **4** iptables 规则:
```text
# 1) PREROUTING DNAT — 外部进入的包改目标
@@ -78,13 +78,19 @@ $CMD -A FORWARD -p <P> -d <TIP> --dport <TPORT> \
-m conntrack --ctstate NEW,ESTABLISHED,RELATED \
-j ACCEPT \
-m comment --comment "MGMT:<UUID>"
# 4) FORWARD 回程 ACCEPT — 允许 DNAT/MASQUERADE 后的回包继续转发
$CMD -A FORWARD -p <P> -s <TIP> --sport <TPORT> \
-m conntrack --ctstate ESTABLISHED,RELATED \
-j ACCEPT \
-m comment --comment "MGMT:<UUID>"
```
其中 `$CMD``iptables`(v4) 或 `ip6tables`(v6)。`<TIP>` v6 时需加 `[]` (仅在 `--to-destination` 部分)。
一条"逻辑规则"的展开上限:
- `proto=both` × `ipv=both` = 2 × 2 × 3 条 = **12** 条 iptables 规则
- 最常见 `proto=tcp` × `ipv=4` = 1 × 1 × 3 条 = **3**
- `proto=both` × `ipv=both` = 2 × 2 × 4 条 = **16** 条 iptables 规则
- 最常见 `proto=tcp` × `ipv=4` = 1 × 1 × 4 条 = **4**
所有规则共享同一个 UUID通过注释绑定删除时一并清除。
@@ -221,7 +227,7 @@ ipt_find_by_uuid() # args: uuid → 列出匹配的 (cmd, table, chain, rule)
### 4.5 `lib/rules_mgr.sh` — 业务编排层
职责:
- `cmd_list` — 从 storage 读出全部规则,格式化为表格,对每条规则用 `ipt_find_by_uuid` 校验是否仍在 iptables 中 (健康指示 [✓]/[!])。
- `cmd_list` — 从 storage 读出全部规则,格式化为表格,对每条规则校验其 PREROUTING / POSTROUTING / 双向 FORWARD 规则是否仍在 iptables 中 (健康指示 [✓]/[!])。
- `cmd_add` — 交互表单 → 校验 → 生成 UUID → `ipt_apply_rule` → `storage_add` → `persist_save`。失败自动回滚已加 iptables 规则。
- `cmd_delete` — 调用 `cmd_list` 的交互版 → 用户选编号 → 二次确认 → `ipt_remove_rule` → `storage_delete` → `persist_save`。
@@ -356,7 +362,7 @@ persist_reload() { netfilter-persistent reload >/dev/null; }
`tests/test_rules_unit.sh`:
- 用 `iptables-mock.sh` 作为 `IPTABLES_BIN`,记录所有调用到 `/tmp/ipt_calls.log`
- `cmd_add` (tcp/ipv4) 后:
- mock 日志包含 3 条命令 (PREROUTING/POSTROUTING/FORWARD) 且参数正确
- mock 日志包含 4 条命令 (PREROUTING/POSTROUTING/FORWARD 请求/回程) 且参数正确
- storage 中新增 1 条UUID 与 mock 注释一致
- `cmd_add` (both/both) 后mock 日志包含 12 条命令
- `cmd_delete` 后mock 日志包含对应 `-D` 命令storage 中记录被移除
@@ -534,6 +540,11 @@ iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 \
-m conntrack --ctstate NEW,ESTABLISHED,RELATED \
-j ACCEPT \
-m comment --comment "MGMT:a1b2c3d4"
iptables -A FORWARD -p tcp -s 192.168.1.100 --sport 80 \
-m conntrack --ctstate ESTABLISHED,RELATED \
-j ACCEPT \
-m comment --comment "MGMT:a1b2c3d4"
```
### 10.2 卸载指引