Add compatibility with docker bridge

This commit is contained in:
世界 2026-04-24 09:31:40 +08:00
parent a9027729be
commit a36276922a
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
3 changed files with 275 additions and 2 deletions

View file

@ -9,7 +9,7 @@ import (
"github.com/sagernet/nftables"
"github.com/sagernet/nftables/binaryutil"
"github.com/sagernet/nftables/expr"
"github.com/sagernet/sing-tun/internal/gtcpip/header"
"github.com/sagernet/sing-tun/gtcpip/header"
"github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/control"
E "github.com/sagernet/sing/common/exceptions"
@ -295,11 +295,15 @@ func (r *autoRedirect) setupNFTables() error {
if err != nil {
return E.Cause(err, "configure openwrt firewall4")
}
err = nft.Flush()
if err != nil {
return E.Cause(err, "flush nftables")
}
r.startDockerFirewallMonitor()
err = r.configureDockerFirewall(false)
if err != nil && r.logger != nil {
r.logger.Warn("configure docker firewall: ", err)
}
r.networkListener = r.networkMonitor.RegisterCallback(func() {
err = r.nftablesUpdateLocalAddressSet()
@ -373,6 +377,7 @@ func (r *autoRedirect) cleanupNFTables() {
if r.networkListener != nil {
r.networkMonitor.UnregisterCallback(r.networkListener)
}
r.stopDockerFirewallMonitor()
nft, err := nftables.New()
if err != nil {
return
@ -384,6 +389,10 @@ func (r *autoRedirect) cleanupNFTables() {
_ = r.configureOpenWRTFirewall4(nft, true)
_ = nft.Flush()
_ = nft.CloseLasting()
err = r.configureDockerFirewall(true)
if err != nil && r.logger != nil {
r.logger.Warn("cleanup docker firewall: ", err)
}
}
func (r *autoRedirect) nftablesCreatePreMatchChains(nft *nftables.Conn, table *nftables.Table) error {