Golang トラフィック転送の実装方法【完全ガイド】

Golangでトラフィックの転送機能を実現する場合、通常はnetパッケージのTCPやUDP関連の機能を使用します。以下は、シンプルなTCPトラフィック転送機能を実装した簡単なサンプルコードです。

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    // 监听端口
    ln, err := net.Listen("tcp", "localhost:8080")
    if err != nil {
        fmt.Println("Error listening:", err)
        os.Exit(1)
    }
    defer ln.Close()

    fmt.Println("Listening on localhost:8080")

    // 接受客户端连接
    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            os.Exit(1)
        }
        fmt.Println("Accepted connection from", conn.RemoteAddr())

        // 将数据转发到目标地址
        go func(conn net.Conn) {
            targetAddr := "localhost:9090"
            targetConn, err := net.Dial("tcp", targetAddr)
            if err != nil {
                fmt.Println("Error connecting to target:", err)
                conn.Close()
                return
            }
            defer targetConn.Close()

            // 进行数据转发
            go func() {
                _, err := io.Copy(targetConn, conn)
                if err != nil {
                    fmt.Println("Error copying data to target:", err)
                }
            }()

            _, err = io.Copy(conn, targetConn)
            if err != nil {
                fmt.Println("Error copying data to client:", err)
            }

            conn.Close()
        }(conn)
    }
}

上記のコードでは、まずlocalhostの8080ポートをリッスンし、クライアントの接続を受け付けます。新しいクライアントが接続されるたびに、その接続を処理するために新しいgoroutineを作成し、クライアントのデータをターゲットアドレスlocalhost:9090に転送し、同時にターゲットアドレスからのデータをクライアントに転送します。最後に、接続を閉じます。

もちろん、これは単なる簡単な例に過ぎず、実際のアプリケーションではさらに多くのエラー処理や最適化、セキュリティの考慮が必要となる場合があります。

bannerAds