고급 사용법 · 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)
}