http.ListenAndServe 仅适用于本地主机?
Posted
技术标签:
【中文标题】http.ListenAndServe 仅适用于本地主机?【英文标题】:http.ListenAndServe only works for localhost? 【发布时间】:2017-02-25 01:32:00 【问题描述】:我已经成功使用了
http.ListenAndServe(":80", mux)
在 Go 中托管我的 Web 服务。然而,它似乎只适用于 localhost。
http.ListenAndServe("192.168.1.83:80", mux)
这适用于该地址上的特定连接,但有没有办法让它适用于服务器上的任何 IP 地址?
编辑:
我已经使用不同的端口(在本例中为 8080)检查了它,然后使用“:8080”按文档说明工作。即使在同一台机器上进行测试,80 端口似乎也有一些特别之处,这意味着它实际上只在 localhost 上进行侦听。
为免生疑问,我使用的是 Windows,所有测试都是在同一台物理机器上完成的。我还检查了以管理员权限运行,它没有任何区别。
【问题讨论】:
【参考方案1】:http.ListenAndServe(":80", mux)
是正确的地址。 net/http
使用 net
包。引用net.Listen()
:
如果 host 被省略,如 ":8080",Listen 会侦听所有可用的接口,而不仅仅是具有给定主机地址的接口。有关地址语法的更多详细信息,请参阅拨号。
知道端口 80 受到限制或可能被许多系统上的防火墙阻止。在 unix 系统上,1024 以下的端口通常需要特殊权限。以测试8080端口为例,因为这种方式并不特殊。
【讨论】:
我仍在本地测试,所以我没想到会出现任何防火墙问题。有趣的是,当我将端口 80 移到更高范围内时,它确实有效。 @Saurbaum 如果你只使用":80"
,它会尝试监听所有可用的接口,因此不限于本地主机。
无论出于何种原因,端口 80 都无法按照文档描述的方式工作。即使在同一台计算机上。
@Saurbaum 您是否尝试过另一个“高”端口?比如8080?
@Saurbaum 如前所述,因为端口 80 是特殊的。您无需更改代码中的任何内容,只需更改您的操作系统或防火墙配置即可。这是特定于操作系统的,但您没有提及您的操作系统和环境。【参考方案2】:
不,http.ListenAndServe 适用于任何主机或端口,但是低于 1024 的端口需要 root 权限。 您可以使用以下命令将端口 80 上的连接重定向为普通用户:
sudo apt-get install iptables-persistent
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo netfilter-persistent save
sudo netfilter-persistent reload
【讨论】:
那肯定只与外部连接有关吗?在这种情况下,我正在具有管理员权限的同一个本地机器上进行测试。另外我使用的是 Windows 而不是 Linux。 Port forwarding in windows。正如@icza 所说,它与您的应用程序和 http.ListenAndServe 无关。 如果机器中有多个ip地址。对于这些测试,我不会尝试转发任何不在防火墙或路由器后面的端口。以上是关于http.ListenAndServe 仅适用于本地主机?的主要内容,如果未能解决你的问题,请参考以下文章