Golang网络请求被防火墙拦截问题探讨

Golang网络请求被防火墙拦截问题探讨 每次我运行

go run main.go

都会出现:品牌防火墙已阻止程序的某些功能。然后我点击"允许"当前运行,问题就解决了,但下次运行相同程序时又会被阻止。

如何在Windows品牌防火墙中允许它?

6 回复

是的,这似乎是一个解决方案。

更多关于Golang网络请求被防火墙拦截问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


NobbZ:

禁用 brandmauer

是否可能仅针对 Go 语言二进制文件禁用防火墙?

禁用 brandmauer

或者使用 go build 并从静态输出路径运行二进制文件,而不是通过 go run 动态创建的文件。

func main() {
    fmt.Println("hello world")
}
http.ListenAndServe("127.0.0.1:80", nil)

这是Windows防火墙在询问是否允许为监听端口的程序创建例外。在开发过程中,是否可以只监听本地主机/127.0.0.1,而不是使用http.ListenAndServe(":80", nil)。就像这样:

我对 Brandmauer 一无所知。但大多数个人防火墙都是根据二进制文件的路径来设置排除规则的,每次使用 go run 时,二进制文件被写入并运行的路径都会不同。

而如果使用 go build 然后运行生成的二进制文件,你会得到一个每次都不变的静态路径。这样你的防火墙应该就能识别你添加的例外规则(如果你永久添加了的话)并允许其运行。

func main() {
    fmt.Println("hello world")
}

在Windows防火墙中为Go程序添加永久规则可以解决此问题。以下是几种实现方式:

方法一:通过Windows防火墙图形界面设置

  1. 打开"Windows Defender 防火墙"
  2. 点击"允许应用或功能通过Windows Defender 防火墙"
  3. 点击"更改设置" → “允许其他应用”
  4. 浏览并选择你的Go可执行文件(通常是编译后的.exe文件)
  5. 确保勾选相应的网络类型(专用/公用)

方法二:使用PowerShell命令自动化

package main

import (
    "os/exec"
    "log"
    "path/filepath"
)

func main() {
    // 获取当前可执行文件路径
    exePath, err := filepath.Abs("your-program.exe")
    if err != nil {
        log.Fatal(err)
    }

    // PowerShell命令添加防火墙规则
    psCommand := `New-NetFirewallRule -DisplayName "Go Program" -Direction Inbound -Program "` + exePath + `" -Action Allow`
    
    cmd := exec.Command("powershell", "-Command", psCommand)
    if err := cmd.Run(); err != nil {
        log.Printf("防火墙规则可能已存在: %v", err)
    }
}

方法三:编译后手动设置规则

package main

import (
    "fmt"
    "os"
    "os/exec"
    "runtime"
)

func setupFirewallRule() {
    if runtime.GOOS != "windows" {
        return
    }

    exePath, _ := os.Executable()
    
    // 使用netsh命令添加防火墙规则
    cmd := exec.Command("netsh", "advfirewall", "firewall", "add", "rule", 
        "name=Go Program", 
        "dir=in", 
        "action=allow", 
        "program="+exePath, 
        "enable=yes")
    
    if err := cmd.Run(); err != nil {
        fmt.Printf("规则设置可能失败: %v\n", err)
    }
}

func main() {
    setupFirewallRule()
    // 你的主要业务逻辑
    fmt.Println("程序正常运行")
}

方法四:使用Go调用Windows API

package main

/*
#include <windows.h>
#include <netfw.h>
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
*/
import "C"
import (
    "log"
    "os"
    "syscall"
    "unsafe"
)

func addFirewallRule() {
    exePath, _ := os.Executable()
    
    var firewallManager *C.INetFwMgr
    hr := C.CoCreateInstance(
        &C.CLSID_NetFwMgr,
        nil,
        C.CLSCTX_INPROC_SERVER,
        &C.IID_INetFwMgr,
        (*unsafe.Pointer)(unsafe.Pointer(&firewallManager)),
    )
    
    if hr != 0 {
        log.Printf("创建防火墙管理器失败: 0x%x", hr)
        return
    }
    defer (*C.INetFwMgr)(firewallManager).Release()
    
    // 具体实现需要更详细的COM接口调用
    // 这里展示了基本思路,实际实现较复杂
}

func main() {
    addFirewallRule()
    // 程序主逻辑
}

推荐使用方法二或方法三,它们相对简单可靠。确保以管理员权限运行这些程序,否则防火墙规则设置可能会失败。

回到顶部