Fix windows bridge

This commit is contained in:
世界
2026-07-14 14:05:07 +08:00
parent 1dfdad2fcd
commit 9acf5a3257
+25 -31
View File
@@ -156,16 +156,6 @@ func (b *backendWindows) start() error {
b.closed = make(chan struct{})
state := b.currentEgressState()
if !(b.inet4Port.IsValid() && state.inet4.IsValid()) {
b.inet4Port = netip.Addr{}
}
if !(b.inet6Port.IsValid() && state.inet6.IsValid()) {
b.inet6Port = netip.Addr{}
b.logger.Debug("bridge IPv6 egress unavailable, disabling IPv6 forwarding")
}
if !b.inet4Port.IsValid() && !b.inet6Port.IsValid() {
return E.New("bridge: no usable egress address; requires an interface with a routable address and Administrator")
}
b.egress.Store(state)
err := b.acquireReservations()
@@ -189,6 +179,11 @@ func (b *backendWindows) start() error {
}
b.registerMonitors(b.syncEgress)
b.syncEgress()
state = b.egress.Load()
if !state.inet4.IsValid() && !state.inet6.IsValid() {
b.logger.Debug("bridge egress unavailable, dropping forwarded traffic")
}
b.logger.Info("bridge started (WinDivert, egress ", b.egressLabel(), ")")
return nil
}
@@ -201,22 +196,14 @@ func (b *backendWindows) egressLabel() string {
}
func (b *backendWindows) acquireReservations() error {
family := windows.AF_INET
if !b.inet4Port.IsValid() {
family = windows.AF_INET6
}
reservation, err := acquirePortReservation(family, windows.SOCK_STREAM, windows.IPPROTO_TCP, bridgeReservedPortCount)
reservation, err := acquirePortReservation(windows.AF_INET, windows.SOCK_STREAM, windows.IPPROTO_TCP, bridgeReservedPortCount)
if err != nil {
return E.Cause(err, "bridge: reserve ports")
}
b.reservation = reservation
b.reservedStart = reservation.startPort
if b.inet4Port.IsValid() {
b.icmp4 = newICMPTable(bridgeICMPFlowTimeout)
}
if b.inet6Port.IsValid() {
b.icmp6 = newICMPTable(bridgeICMPFlowTimeout)
}
b.icmp4 = newICMPTable(bridgeICMPFlowTimeout)
b.icmp6 = newICMPTable(bridgeICMPFlowTimeout)
return nil
}
@@ -225,27 +212,33 @@ func (b *backendWindows) PortSelectorRange() (uint16, uint16) {
}
func (b *backendWindows) rebuildDivertersLocked(state *egressState) error {
for _, existing := range b.diverters {
existing.handle.Close()
<-existing.done
}
b.diverters = nil
b.closeDivertersLocked()
if b.inet4Port.IsValid() && state.inet4.IsValid() {
err := b.openFamilyDiverters(state.divertAddresses(false), false)
if err != nil {
b.closeDivertersLocked()
return err
}
}
if b.inet6Port.IsValid() && state.inet6.IsValid() {
err := b.openFamilyDiverters(state.divertAddresses(true), true)
if err != nil {
b.closeDivertersLocked()
return err
}
}
return nil
}
func (b *backendWindows) closeDivertersLocked() {
for _, existing := range b.diverters {
existing.handle.Close()
<-existing.done
}
b.diverters = nil
}
func (b *backendWindows) openFamilyDiverters(addresses []netip.Addr, isV6 bool) error {
portHigh := uint16(uint32(b.reservedStart) + uint32(bridgeReservedPortCount) - 1)
entries := []struct {
@@ -724,6 +717,11 @@ func (b *backendWindows) currentEgressState() *egressState {
if finder == nil {
return state
}
err := finder.Update()
if err != nil {
b.logger.Debug(E.Cause(err, "bridge update interfaces"))
return state
}
egressInterface, err := finder.ByName(egressName)
if err != nil {
return state
@@ -810,11 +808,7 @@ func (b *backendWindows) Close() error {
b.unregister()
}
b.egressAccess.Lock()
for _, d := range b.diverters {
d.handle.Close()
<-d.done
}
b.diverters = nil
b.closeDivertersLocked()
b.egressAccess.Unlock()
if b.injectHandle != nil {
b.injectHandle.Close()