Go 通过用户空间套接字的代理未按预期运行

Go 通过用户空间套接字的代理未按预期运行,go,networking,tcp,iptables,Go,Networking,Tcp,Iptables,为了深入了解Kubernetes的网络模型,我开始关注。我试图通过编写此代码(从上面共享的博客)从用户空间截获到服务\u IP的数据包 但是我没有看到我创建的tcp服务器拦截流量。作为一个网络迷,我不太会讲道理。如果您提供任何帮助,我们将不胜感激。您发布的代码不会检查错误(错误由addRedirectRules()返回,错误由createProxy()中的各种调用返回)。您是在发布SO之前删除了该代码,还是您的原始代码默默地忽略了错误?我看到它是链接文章中代码的复制/粘贴,因此我猜您的代码也忽略

为了深入了解Kubernetes的网络模型,我开始关注。我试图通过编写此代码(从上面共享的博客)从用户空间截获到
服务\u IP
的数据包


但是我没有看到我创建的tcp服务器拦截流量。作为一个网络迷,我不太会讲道理。如果您提供任何帮助,我们将不胜感激。

您发布的代码不会检查错误(错误由
addRedirectRules()
返回,错误由
createProxy()
中的各种调用返回)。您是在发布SO之前删除了该代码,还是您的原始代码默默地忽略了错误?我看到它是链接文章中代码的复制/粘贴,因此我猜您的代码也忽略了错误:至少,如果出现错误,请在控制台上打印错误,与示例不同。我确实尝试过通过记录错误进行调试。没什么好的。如果您在
listener.Accept()
之后立即记录
fmt.Println(“已接受的连接源”,incon.RemoteAddr())
,您是否看到显示的这些行?@Always\u初学者,1。您的代码中的
服务器IP
是什么(一个
群集IP
)?2. <
nat
表中的code>OUTPUTchain将只处理本地进程生成的数据包(您的代码必须在生成数据包的服务器上运行)。3. <代码>重定向规则永远不会被命中,因为
KUBE-SERVICES
规则会屏蔽它。在代码中使用
iptables-t nat-I OUTPUT 1…
来修复它。4.
createProxy
是您的
tcp服务器
。这段代码(我假设,因为我对
Go
还不了解:-])应该运行一个代理来处理[process][your_code][
SERVICE_IP
]之间的通信。
func main() {
    clusterIP := "10.7.111.132"
    podIP := "10.5.41.204"
    port := 80
    proto := "tcp"

    addRedirectRules(clusterIP, port, proto)
    createProxy(podIP, port, proto)
}

func addRedirectRules(clusterIP string, port int, proto string) error {
    p := strconv.Itoa(port)
    cmd := exec.Command("iptables", "-t", "nat", "-A", "OUTPUT", "-p", "tcp",
        "-d", clusterIP, "--dport", p, "-j", "REDIRECT", "--to-port", p)
    return cmd.Run()
}

func createProxy(podIP string, port int, proto string) {
    host := ""
    listener, err := net.Listen(proto, net.JoinHostPort(host, strconv.Itoa(port)))

    for {
        inConn, err := listener.Accept()
        outConn, err := net.Dial(proto, net.JoinHostPort(podIP, strconv.Itoa(port)))

        go func(in, out *net.TCPConn) {
            var wg sync.WaitGroup
            wg.Add(2)
            fmt.Printf("Proxying %v <-> %v <-> %v <-> %v\n",
                in.RemoteAddr(), in.LocalAddr(), out.LocalAddr(), out.RemoteAddr())
            go copyBytes(in, out, &wg)
            go copyBytes(out, in, &wg)
            wg.Wait()
        }(inConn.(*net.TCPConn), outConn.(*net.TCPConn))
    }

    listener.Close()
}

func copyBytes(dst, src *net.TCPConn, wg *sync.WaitGroup) {
    defer wg.Done()
    if _, err := io.Copy(dst, src); err != nil {
        if !strings.HasSuffix(err.Error(), "use of closed network connection") {
            fmt.Printf("io.Copy error: %v", err)
        }
    }
    dst.Close()
    src.Close()
}
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    KUBE-SERVICES  all  --  0.0.0.0/0            0.0.0.0/0            /* kubernetes service portals */
2    DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL
3    REDIRECT   tcp  --  0.0.0.0/0            100.65.248.49        tcp dpt:80 redir ports 80