| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- //go:build (amd64 || arm64) && !e2e_testing
- // +build amd64 arm64
- // +build !e2e_testing
- package udp
- import (
- "log/slog"
- "sync"
- "github.com/slackhq/nebula/config"
- "github.com/slackhq/nebula/wfp"
- )
- // wrapWithWDFBypass wraps a Conn so that the first ReloadConfig consults listen.windows_bypass_wdf
- // and installs a WFP PERMIT filter for the listener's bound UDP port. The session is released when Close runs.
- func wrapWithWDFBypass(l *slog.Logger, conn Conn) Conn {
- return &bypassConn{Conn: conn, l: l}
- }
- type bypassConn struct {
- Conn
- l *slog.Logger
- installOnce sync.Once
- session *wfp.Session
- }
- func (b *bypassConn) ReloadConfig(c *config.C) {
- b.installOnce.Do(func() {
- if !c.GetBool("listen.windows_bypass_wdf", true) {
- return
- }
- addr, err := b.Conn.LocalAddr()
- if err != nil {
- b.l.Warn("Failed to query listener port for WFP bypass", "error", err)
- return
- }
- s, err := wfp.PermitUDPPort(addr.Port())
- if err != nil {
- b.l.Warn("Failed to install WFP bypass filters for listener", "error", err)
- return
- }
- b.l.Info("Installed WFP filters bypassing Windows Defender Firewall on UDP listener port",
- "port", addr.Port())
- b.session = s
- })
- b.Conn.ReloadConfig(c)
- }
- func (b *bypassConn) Close() error {
- if b.session != nil {
- b.session.Close()
- b.session = nil
- }
- return b.Conn.Close()
- }
|