高度な使い方 · Clash ドキュメント

Golang プログラムへの Clash 統合

Go プログラムでプロキシ接続を受け付けて転送するには、Clash の SOCKS listener と ConnContext からメタデータを読み取り、Direct アウトバウンド、DialContext、relay を組み合わせて双方向に転送します。

  • Golang
  • ConnContext
  • SourceAddress
  • DialContext
  • relay
高度な使い方

過去のドキュメントの適用範囲

この記事は、旧設定を確認するために原版 Clash / Clash Premium の過去の使い方を残しています。「Premium のみ」「未対応」やプラットフォームの制限は、現在の Mihomo の機能を示すものではありません。そのまま現在の設定に上書きしたり、権限に関するコマンドを実行したりしないでください。

Mihomo を使う場合は 現在の Mihomo 設定ドキュメント を参照してください。画面操作、インストール、権限の設定は 使用するクライアントのプロジェクトドキュメント に従います。

Clash だけでは要件を満たせない場合は、自分の Golang コードから Clash を使用できます。

現在、基本的な機能に対応しています:

go
package main

import (
	"context"
	"fmt"
	"io"
	"net"

	"github.com/Dreamacro/clash/adapter/outbound"
	"github.com/Dreamacro/clash/constant"
	"github.com/Dreamacro/clash/listener/socks"
)

func main() {
	in := make(chan constant.ConnContext, 100)
	defer close(in)

	l, err := socks.New("127.0.0.1:10000", in)
	if err != nil {
		panic(err)
	}
	defer l.Close()

	println("listen at:", l.Address())

	direct := outbound.NewDirect()

	for c := range in {
		conn := c
		metadata := conn.Metadata()
		fmt.Printf("请求从 %s 传入到 %s\n", metadata.SourceAddress(), metadata.RemoteAddress())
		go func () {
			remote, err := direct.DialContext(context.Background(), metadata)
			if err != nil {
				fmt.Printf("Dial 错误: %s\n", err.Error())
				return
			}
			relay(remote, conn.Conn())
		}()
	}
}

func relay(l, r net.Conn) {
	go io.Copy(l, r)
	io.Copy(r, l)
}