디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

우리 2등 인민을 위한 선물이야.

프갤러(131.147) 2025.01.16 14:42:06
조회 56 추천 0 댓글 2

package main // import "vpngate"

import (
    "bufio"
    "bytes"
    "encoding/base64"
    "encoding/json"
    "flag"
    "fmt"
    "io"
    "net/http"
    "os"
    "os/exec"
    "path/filepath"
    "sort"
    "strconv"
    "strings"
    "time"
)

const (
    configFile = "vpn_server.config"
)

type VPNServer struct {
    Hostname string
    IP       string
    Port     string
    Country  string
    Ping     int
    Score    int
    Config   string
}

var (
    // scoreMinimum = 2000000
    scoreMinimum   = 1
    pingMinimum    = 15
    connectionName = "VPNgateAutoConnection"

    rank       int
    disconnect bool

    notUseIPs = []string{}
)

func extractIPAndPort(config string) (string, string) {
    scanner := bufio.NewScanner(strings.NewReader(config))
    for scanner.Scan() {
        line := scanner.Text()
        if strings.HasPrefix(line, "remote ") {
            parts := strings.Fields(line)
            if len(parts) >= 3 {
                return parts[1], parts[2]
            }
        }
    }
    return "", ""
}

func findBestVPNServer(rank int) (*VPNServer, error) {
    var err error
    var servers []*VPNServer

    response, err := http.Get(vpnGateURL)
    if err != nil {
        return nil, fmt.Errorf("서버 목록 가져오기 실패: %v", err)
    }
    defer response.Body.Close()

    scanner := bufio.NewScanner(response.Body)

    for scanner.Scan() {
        line := scanner.Text()
        splits := strings.Split(line, ",")
        if len(splits) < 15 {
            continue
        }

        ping, err := strconv.Atoi(splits[3])
        if err != nil || ping > pingMinimum {
            continue
        }

        score, err := strconv.Atoi(splits[2])
        if err != nil || score < scoreMinimum {
            continue
        }

        decodedConfig, err := base64.StdEncoding.DecodeString(splits[14])
        if err != nil {
            continue
        }

        ip, port := extractIPAndPort(string(decodedConfig))
        server := &VPNServer{
            Hostname: splits[0],
            IP:       ip,
            Port:     port,
            Country:  splits[5],
            Ping:     ping,
            Score:    score,
            Config:   string(decodedConfig),
        }
        servers = append(servers, server)
    }

    if len(servers) == 0 {
        return nil, fmt.Errorf("적합한 서버를 찾을 수 없음")
    }

    if rank > len(servers) {
        return nil, fmt.Errorf("지정된 순위의 서버를 찾을 수 없음")
    }

    sort.Slice(servers, func(i, j int) bool {
        return servers[i].Ping < servers[j].Ping
    })

    // for i, s := range servers {
    //  // fmt.Println("    ip, ping, score:", ip, ping, score)
    //  fmt.Println("   i, ip, ping, score:", i+1, s.IP, s.Ping, s.Score)
    // }

    return servers[rank-1], nil
}

func saveVPNConfig(config string) (string, error) {
    absPath, err := filepath.Abs(configFile)
    if err != nil {
        return "", err
    }

    err = os.WriteFile(absPath, []byte(config), 0664)
    return absPath, err
}

func connectVPN(server *VPNServer) error {
    cmd := exec.Command("vpncmd", "/client")
    var input bytes.Buffer
    input.WriteString("\n") // localhost
    // input.WriteString("2\n") // Client mode
    input.WriteString("AccountCreate " + connectionName + " /hub:VPNGATE /username:vpn /nicname:VPN\n")
    input.WriteString(server.IP + ":" + server.Port + "\n")
    input.WriteString("AccountConnect " + connectionName + "\n")
    input.WriteString("exit\n")

    cmd.Stdin = &input

    done := make(chan error, 1)
    var output []byte
    go func() {
        var err error
        output, err = cmd.CombinedOutput()
        done <- err
    }()

    select {
    case err := <-done:
        fmt.Printf("VPN 연결 출력:\n%s", string(output))
        if err != nil {
            return fmt.Errorf("VPN 연결 실패: %s - %v", string(output), err)
        }
        return nil
    case <-time.After(30 * time.Second):
        return fmt.Errorf("VPN 연결 시간 초과")
    }
}

func getPublicIP() (string, error) {
    apis := []string{
        "https://ipinfo.io/json",
        "https://api.ip.sb/json",
    }

    client := &http.Client{Timeout: 2 * time.Second}

    for _, url := range apis {
        resp, err := client.Get(url)
        if err != nil {
            continue
        }
        defer resp.Body.Close()

        body, err := io.ReadAll(resp.Body)
        if err != nil {
            fmt.Println("ReadAll:", err)
            continue
        }

        var ipData map[string]interface{}
        err = json.Unmarshal(body, &ipData)
        if err != nil {
            fmt.Println("Unmarshall:", err)
            continue
        }

        if ip, ok := ipData["ip"].(string); ok {
            return ip, nil
        }
    }

    return "", fmt.Errorf("IP 주소를 찾을 수 없음")
}

func connectMain(rank int) error {
    var err error

    kurrentIP, err := getPublicIP()
    if err != nil {
        return fmt.Errorf("IP 주소 확인 실패: %v", err)
    }
    fmt.Println("현재 IP:", kurrentIP)
    previousIP := kurrentIP

    fmt.Println("VPN Gate 서버 목록 가져오는 중...")

    bestServer, err := findBestVPNServer(rank)
    if err != nil {
        return fmt.Errorf("서버 선택 실패: %v", err)
    }

    fmt.Printf("선택된 서버: %s (%s) - %s:%s\n",
        bestServer.Hostname,
        bestServer.Country,
        bestServer.IP,
        bestServer.Port,
    )

    configPath, err := saveVPNConfig(bestServer.Config)
    if err != nil {
        return fmt.Errorf("서버 설정 저장 실패: %v", err)
    }
    fmt.Printf("서버 설정이 %s에 저장되었습니다.", configPath)

    fmt.Println("VPN 연결 시도 중...")
    err = connectVPN(bestServer)
    if err != nil {
        return fmt.Errorf("VPN 연결 실패: %v", err)
    }

    fmt.Println("\nVPN에 연결되었습니다! 아이피 할당을 시도합니다.")

    count := 0
    for {
        kurrentIP, err = getPublicIP()
        if err != nil {
            return fmt.Errorf("IP 주소 확인 실패: %v", err)
        }

        if kurrentIP != previousIP {
            fmt.Printf("\nIP 주소가 변경되었습니다: %s", kurrentIP)
            previousIP = kurrentIP
            break
        }

        fmt.Print(".")

        count++
        if count > 5 {
            fmt.Println("VPN 연결 실패! 설정을 삭제합니다.")
            return fmt.Errorf("VPN 연결 시간 초과")
        }

        time.Sleep(time.Duration(1 * time.Second))
    }

    return nil
}

func disconnectAndDelete() error {
    // configFile 파일 삭제
    if err := os.Remove(configFile); err != nil {
        return err
    }

    cmd := exec.Command("vpncmd", "/client")
    var input bytes.Buffer
    input.WriteString("\n") // localhost
    // input.WriteString("2\n") // Client mode
    input.WriteString("AccountDisconnect " + connectionName + "\n")
    input.WriteString("AccountDelete " + connectionName + "\n")
    input.WriteString("exit\n")

    cmd.Stdin = &input

    done := make(chan error, 1)
    var output []byte
    go func() {
        var err error
        output, err = cmd.CombinedOutput()
        done <- err
    }()

    select {
    case err := <-done:
        fmt.Printf("VPN 연결 해제 출력:\n%s", string(output))
        if err != nil {
            return fmt.Errorf("VPN 연결 해제 실패: %s - %v", string(output), err)
        }
        return nil
    case <-time.After(30 * time.Second):
        return fmt.Errorf("VPN 연결 해제 시간 초과")
    }
}

func init() {
    flag.IntVar(&rank, "rank", 1, "VPN server rank to connect (default: 1)")
    flag.BoolVar(&disconnect, "disconnect", false, "Disconnect and delete VPN connection")
    flag.Parse()
}

func main() {
    var err error

    if disconnect {
        if err := disconnectAndDelete(); err != nil {
            fmt.Printf("VPN 연결 해제 실패: %v", err)
            return
        }
        fmt.Println("VPN 연결이 성공적으로 해제되었습니다!")
        return
    }

    count := 0
    for {
        err = connectMain(rank)
        if err == nil {
            break
        }

        count++
        rank++
        fmt.Println("VPN 연결 실패! 설정을 삭제합니다.", count)
        if err := disconnectAndDelete(); err != nil {
            fmt.Printf("VPN 설정 삭제 실패: %v", err)
            return
        }

        if count >= 10 {
            fmt.Println("VPN 연결 실패! 참조하는 서버를 찾을 수 없습니다.")
            return
        }

        time.Sleep(time.Duration(250 * time.Millisecond))
    }
}




vpn이다. vpn


중공 1등 인민 주인님들꼐서 사랑하시는 바둑언어인 golang을 깔고 중공사랑 실천하자.


일제 무른모 vpngate 도 필요해.


cu는 왜 금칙어야 시발거


ㅇㅅㅇ


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인 말고 매니저 했어도 잘했을 것 같은 계획형 스타는? 운영자 25/01/13 - -
2805046 유니티 골드메탈님의 플랫포머 도와주세요 [7] 프갤러(122.44) 01.16 98 1
2805045 [클라우드엔지니어] 코딩이 어려운분들 추천 IT국비지원 교육운영팀갤로그로 이동합니다. 01.16 44 0
2805044 스스로의 코딩욕구로 개발하는자가 진짜개발자가아닐지.. [2] 헬마에스트로(1.237) 01.16 101 0
2805043 범죄자 리죄명 대통령 놀이 시작 [6] ♥냥덩이♥갤로그로 이동합니다. 01.16 66 1
2805042 진짜 초고수들은 취업안하고 자기 프로젝트 하면서 살겠지? [2] 프갤러(14.39) 01.16 73 0
2805041 가짜개발자 기준 알려준다. [2] 프갤러(121.138) 01.16 123 0
2805040 커서 쓸거면 결제해야되냐 [1] 프갤러(223.39) 01.16 38 0
2805039 진짜개발, 가짜개발, 코드몽키, 코더 분리의 기준이 뭔데 [4] jonny갤로그로 이동합니다. 01.16 97 2
2805038 원가 씹개미친 음료수 뱅쇼 만드는중 ㅇㅇ [1] ㅇㅇ(123.213) 01.16 54 0
2805037 쉬는 시간 다 쉬었으니 다시 작업하러감 밤에 보자 [1] ㅆㅇㅆ(124.216) 01.16 41 0
2805034 씨발 집에 허브 고장났네 [3] 아스카영원히사랑해갤로그로 이동합니다. 01.16 78 1
2805032 si는 가지말라는데 [5] 프갤러(58.125) 01.16 129 0
2805026 아래글 보는데 걍 컴공이 안뽑히고 비전공자 이런 결론을 내야하는게 아님 [9] ㅆㅇㅆ(124.216) 01.16 670 9
2805025 연말정사누시즌이다 [4] 멍청한유라ㅋ갤로그로 이동합니다. 01.16 59 0
2805024 대출에 필요한서류가 참많아 [10] 멍청한유라ㅋ갤로그로 이동합니다. 01.16 59 0
2805023 냥덩이는 보시오 ㅇㅅㅇ [2] ㅇㅅㅇ(211.234) 01.16 51 0
2805022 "요기 자바 두명이요" 프갤러(211.235) 01.16 57 0
2805021 15년차 개발자의 한국 IT 취업난에 관한 댓글 (feat. 제식갤) [12] ㅇㅇ(211.248) 01.16 650 7
2805020 우리나라에 이런 개발자가 있었나? 프갤러(152.165) 01.16 76 0
2805019 트럼프 “ 윤석열 대통령 불법체포는 미국에 대한 도전 “ ♥냥덩이♥갤로그로 이동합니다. 01.16 79 1
2805018 리죄명 싫다 55% 국민절반 이상 리죄명 거부 [3] ♥냥덩이♥갤로그로 이동합니다. 01.16 62 3
2805017 리죄명 지지율 30%대 붕괴 20%대 폭락 [2] ♥냥덩이♥갤로그로 이동합니다. 01.16 63 1
2805016 PM 아줌마년이 개발환경 셋팅해달라는데 [3] ㅇㅇ(223.39) 01.16 67 0
2805015 국힘지지율 종북친중내란당 역전!! [2] ♥냥덩이♥갤로그로 이동합니다. 01.16 56 3
2805014 유혈사태를 막기 위해 불법영장에 자진출석 희생을 선택한 윤석열 대통령.. [1] ♥냥덩이♥갤로그로 이동합니다. 01.16 46 0
2805013 GPT는 TDD를 하라고 하지만 나는 BDD가 훨 나은거 같음 [14] ㅆㅇㅆ(124.216) 01.16 86 0
2805012 프로토 타이핑은 한 1주만에 완성했는데 이걸 씨발 ㅆㅇㅆ(124.216) 01.16 40 0
우리 2등 인민을 위한 선물이야. [2] 프갤러(131.147) 01.16 56 0
2805010 보통 프로젝트 만들면서 코딩 배우는 경우 많냐 [3] ㅇㅇ갤로그로 이동합니다. 01.16 70 0
2805009 C언어는 문법설계상 오류가 너무 많음 [4] ♥냥덩이♥갤로그로 이동합니다. 01.16 90 0
2805008 밖에서 싸우기보단 그레잇정신을 기르거나 코딩을하는게 어떤신지 헬마에스트로(1.237) 01.16 68 0
2805007 2등 인민들 안녕? [2] 프갤러(131.147) 01.16 52 0
2805006 어제 밤 7시 자서 오늘 새벽 2시에 있어났더니 발명도둑잡기갤로그로 이동합니다. 01.16 31 0
2805005 뉴비 코딩책 추천좀 ㅇㅇ(1.229) 01.16 41 0
2805004 앙! ❤+ ♥냥덩이♥갤로그로 이동합니다. 01.16 29 0
2805003 술.... 늙음을 증명해준다 [6] 주아갤로그로 이동합니다. 01.16 59 0
2805002 국힘지지율 종북친중내란당 역전!! ♥냥덩이♥갤로그로 이동합니다. 01.16 40 0
2805001 자유 대한민국 사이트란? [1] 프갤러(121.172) 01.16 70 1
2805000 뭐야 심심해서 프갤 놀러왔는데 이게 프겔이냐 [3] 프갤러(211.214) 01.16 78 0
2804999 오늘 작업안되네 ㅆㅇㅆ(124.216) 01.16 35 0
2804998 사랑은 과학입니당❤+ ♥냥덩이♥갤로그로 이동합니다. 01.16 31 0
2804997 자동 홍보 프로그램은 뭐길래 막기 어려워하는거임 ?? [2] 떼껄룩(61.96) 01.16 63 0
2804996 SSR 의 경우 컨트롤러 메서드를 뭐라부르나요? 프갤러(124.49) 01.16 31 0
2804995 결론은 조센인들은 서로 싸워서 상쇄시켜야 겨우 질서가유지된다는거임 헬마에스트로(1.237) 01.16 129 0
2804993 리액트<< 이거 속도 원래 이렇게 구림? [2] ㅇㅇ갤로그로 이동합니다. 01.16 74 0
2804992 깨달아버렸다 우파 좌파 결국 둘다 자기욕심인거네 [2] 헬마에스트로(211.234) 01.16 119 1
2804991 프로 모솔들이떠드는 정치 섹스갤러리입니다 ㅇㅇ(211.219) 01.16 36 0
2804990 리죄명도 결국 NL간첩세력의 버림말일뿐 [4] ♥냥덩이♥갤로그로 이동합니다. 01.16 42 1
2804989 아니 여기 프로그래밍 갤러리 아니야? [2] 초보(125.176) 01.16 86 1
2804988 조센인들 결국 결론이 돈 명예 권력 여자임 걍 원숭이수준 [1] 헬마에스트로(211.234) 01.16 84 0
뉴스 단 2회 남은 ‘수상한 그녀’…서영희, ‘정지소=엄마’ 정체 알아챌까 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2