Avoid hijack DNS requests send to loopback

This commit is contained in:
世界 2024-06-24 19:35:03 +08:00
parent 625ac412bb
commit c01b403a44
No known key found for this signature in database
GPG key ID: CD109927C34A63C4

View file

@ -537,10 +537,7 @@ func (r *autoRedirect) nftablesCreateDNSHijackRulesForFamily(
dnsServer = r.tunOptions.Inet6Address[0].Addr().Next() dnsServer = r.tunOptions.Inet6Address[0].Addr().Next()
} }
} }
nft.AddRule(&nftables.Rule{ exprs := []expr.Any{
Table: table,
Chain: chain,
Exprs: []expr.Any{
&expr.Meta{ &expr.Meta{
Key: expr.MetaKeyNFPROTO, Key: expr.MetaKeyNFPROTO,
Register: 1, Register: 1,
@ -550,6 +547,24 @@ func (r *autoRedirect) nftablesCreateDNSHijackRulesForFamily(
Register: 1, Register: 1,
Data: []byte{uint8(family)}, Data: []byte{uint8(family)},
}, },
}
if chain.Hooknum == nftables.ChainHookOutput {
// It looks like we can't hijack DNS requests sent to loopback.
// https://serverfault.com/questions/363899/iptables-dnat-from-loopback
// and tproxy is not available in output
exprs = append(exprs,
&expr.Meta{
Key: expr.MetaKeyOIFNAME,
Register: 1,
},
&expr.Cmp{
Op: expr.CmpOpNeq,
Register: 1,
Data: nftablesIfname("lo"),
},
)
}
exprs = append(exprs,
&expr.Meta{ &expr.Meta{
Key: expr.MetaKeyL4PROTO, Key: expr.MetaKeyL4PROTO,
Register: 1, Register: 1,
@ -571,7 +586,6 @@ func (r *autoRedirect) nftablesCreateDNSHijackRulesForFamily(
Register: 1, Register: 1,
Data: binaryutil.BigEndian.PutUint16(53), Data: binaryutil.BigEndian.PutUint16(53),
}, },
&expr.Counter{},
&expr.Immediate{ &expr.Immediate{
Register: 1, Register: 1,
Data: dnsServer.AsSlice(), Data: dnsServer.AsSlice(),
@ -581,7 +595,12 @@ func (r *autoRedirect) nftablesCreateDNSHijackRulesForFamily(
Family: uint32(family), Family: uint32(family),
RegAddrMin: 1, RegAddrMin: 1,
}, },
}, &expr.Counter{},
)
nft.AddRule(&nftables.Rule{
Table: table,
Chain: chain,
Exprs: exprs,
}) })
return nil return nil
} }