先来段代码:
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)
}
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的小坑