diff options
Diffstat (limited to 'src/linux/firewall.rs')
| -rw-r--r-- | src/linux/firewall.rs | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/linux/firewall.rs b/src/linux/firewall.rs index 8a0dd43..bbde560 100644 --- a/src/linux/firewall.rs +++ b/src/linux/firewall.rs @@ -126,7 +126,10 @@ fn apply_policy(enabled: bool, xray_uid: u32, allow_tun: bool) -> Result<()> { batch.add(&mark, MsgType::Add); let mut guard = Chain::new(c"guard", &table); guard.set_type(ChainType::Filter); - guard.set_hook(Hook::Out, 100); + // OUTPUT's hook state still names the original interface after the + // route chain changes skb's route. POSTROUTING sees the final egress, + // so the guard can allow TUN traffic without allowing direct fallback. + guard.set_hook(Hook::PostRouting, 100); guard.set_policy(Policy::Drop); batch.add(&guard, MsgType::Add); exceptions(&mut batch, &guard, xray_uid); |