【问题标题】:Only accept HTTP connections from Localhost in Go?Go 中只接受来自 Localhost 的 HTTP 连接?
【发布时间】:2016-12-08 15:54:37
【问题描述】:

我在 Golang 中有一个简单的 HTTP 服务器:

h := http.NewServeMux()
h.Handle("/somepath", MyHandler)

s := &http.Server{
    Addr:    "1234",
    Handler: h,
}   

s.ListenAndServe();

在调用者不是本地主机的情况下断开连接的最佳方法是什么?目前我正在考虑检查底层连接信息并确保 IP 地址为127.0.0.1,但这会在最终断开连接之前浪费大量资源(并运行一大堆 Go 代码)。理想情况下,我可以检测 Golang 服务器以根据 IP 地址丢弃初始 TCP SYN 数据包,而根本不创建 TCP 连接(或显示此端口正在侦听)。

这里最干净的道路是什么?

【问题讨论】:

  • 真正做到你所要求的最干净的路径是使用主机防火墙。 Go 看不到 TCP SYN 数据包,这是由操作系统处理的,
  • @JimB 那么我可以(从在 Linux 上运行的 Go)脱壳并创建一个 IPTable 规则或其他东西,然后再绑定并监听我的端口吗?
  • 为什么不http.ListenAndServe("localhost:80", nil)?那只会将服务绑定到本地主机。
  • @VonC 如果这是答案,那么我会接受。

标签: linux http go tcp localhost


【解决方案1】:

VonC 的评论转换为答案。

您可以通过在http.Server.Addrhttp.ListenAndServe 中设置host:port 来绑定主机。

他们在内部使用net.Listen

来自net.Listen

对于 TCP 和 UDP,laddr 的语法是“host:port”,如 “127.0.0.1:8080”。如果 host 被省略,如 ":8080",Listen 监听 所有可用的接口,而不仅仅是给定的接口 主机地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2014-09-27
    • 2022-01-19
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多