Golang 中国

搭建一个Web服务器,但是我希望服务单一IP, 其他ip一律不回应。

http.ListenAndServe(":3220", nil) //这段代码会回应所有访问ip
http.ListenAndServe("localhost:3220", nil) //这段也正常,只回应本机

// 以下代码是我要用的,但是问题是如果用以下这段代码程序会自动跳出(不报错)。

http.ListenAndServe("192.168.1.100:3220", nil)

不知道有没有其他方法可以让服务器只服务单一ip呢?

3 回复
fising
#1 fising • 2018-07-17 16:18

楼主你完全没有理解 ListenAndServe 函数。

文档上面是这样说的:ListenAndServe listens on the TCP network address addr …

它的第一个参数其实是欲监听的本地网络接口的地址,并不是客户端的 IP 地址。

想要实现你说的功能,两个方法吧:

  1. 防火墙阻止其他 IP 地址,而对目标 IP 地址放行
  2. 在应用层获取客户端 IP 地址,如果与目标 IP 不一致,则 DENY 这个请求。
fising
#2 fising • 2018-07-17 17:05
package main

import (
    "net/http"
    "strings"
)

type Handler struct{}

func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if strings.Split(r.RemoteAddr, ":")[0] != "127.0.0.1" {
        w.Write([]byte("Access denied."))
    } else {
        w.Write([]byte("Hello, world!"))
    }
}

func main() {
    http.ListenAndServe(":8080", &Handler{})
}

上面的例子仅仅服务 127.0.0.1 这个客户端

hamax7979
#3 hamax7979 • 2018-07-18 23:40

@fising
谢谢你的答案,理解了。

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。