记一个在lvs后的go http获取真实ip的小坑

先来段代码:

package main

import (
    "fmt"
    "net/http"
)

func IndexHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "hello world")
    fmt.Println(r.RemoteAddr)
}

func main() {
    http.HandleFunc("/", IndexHandler)
    http.ListenAndServe("0.0.0.0:4443", nil)
}

服务器采用lvs+http架构,然后由内核模块toa获取访问者真实ip,结果我获取到的是lvs的内网ip,然后。。。
发现了一些关键点:
第一:真实ip转换是有toa模块完成的。
第二:go语言在处理0.0.0.0:4443这种监听方式得时候,默认监听的是tcp6(这个网上可以查到资料):

可以把0.0.0.0改成真实ipv4来试一下,会发现监听得是tcp4:

监听在tcp6协议下是取不到正确的cip,tcp4协议下可以取到正确的cip
原因嘛:猜测是toa内核模块的问题
解决方法:这个自己发挥就好了。。。哈哈哈

转载请注明:小Y » 记一个在lvs后的go http获取真实ip的小坑

赞 (4) 评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址