프록시 서버란 무엇입니까? NodeJS로 간단한 Socks5 프록시를 구축하는 방법

NodeJS로 간단한 Socks5 프록시를 구축하는 방법

사용자 프로필
Pandada 2023-10-19 게시
0

Node.js를 사용하여 간단한 Socks5 프록시 서버 설정

이 코드는 Node.js의 net 모듈을 사용하여 SOCKS5 프록시 서버를 간단하게 구현한 것입니다. SOCKS5 프록시 서버는 클라이언트 네트워크 요청을 대상 서버로 전달합니다. IPv4, IPv6 및 도메인 이름을 포함한 다양한 주소 유형을 지원합니다. 이 구현에서 지원되는 작업은 TCP 연결을 설정하는 CONNECT입니다.

코드 기능 설명

  • 모듈 가져오기:
    const net = require('net');
    Node.js net 모듈을 가져와서 TCP 서버와 클라이언트를 만듭니다.
  • 서버 만들기:
    let server = net.createServer(function (socket) {
    // 서버 로직
    });
    TCP 서버를 생성하려면 net.createServer 메서드를 사용하세요. 새 클라이언트가 연결될 때마다 콜백 함수가 실행됩니다. 여기서 소켓 객체는 클라이언트와의 연결을 나타냅니다.
  • 클라이언트 데이터 처리:
    socket.once('데이터', 함수 (데이터) {
            //클라이언트가 보낸 데이터를 처리합니다.
    });
    클라이언트가 보낸 첫 번째 데이터 청크(보통 SOCKS5 핸드셰이크 요청)를 수신하려면 socket.once를 사용하세요.
  • SOCKS5 프로토콜 검증:
    if (!data || data[0] !== 0x05) return 소켓.destroy();
    클라이언트가 보낸 데이터가 SOCKS5 프로토콜을 준수하는지 확인합니다. 그렇지 않은 경우 연결을 끊습니다.
  • 응답 보내기:
    socket.write(Buffer.from([5, 0]), 함수 (err) {
            // 응답 전송 후 로직
    });
    인증이 필요하지 않음을 나타내는 응답을 클라이언트에 보냅니다.
  • 연결 요청 처리:
    socket.once('데이터', (데이터) => {
            // 대상 주소와 포트를 구문 분석하고 연결을 설정합니다.
    });
    이번에는 연결 요청인 클라이언트의 데이터를 다시 수신합니다. 대상 주소와 포트를 구문 분석한 후 대상 서버에 연결을 시도합니다.
  • 대상 서버에 연결 설정:
    let remote = net.connect(remotePort, remoteAddr, function () {
             // 연결 성공 후 로직
    });
    net.connect 메서드를 사용하여 대상 서버에 연결해 보세요. 성공하면 콜백 함수를 실행합니다.
  • 데이터 전달:
    remote.pipe(socket);
    소켓.파이프(원격);
    클라이언트와 대상 서버 간의 양방향 데이터 전달을 달성하려면 pipe 메서드를 사용하세요.
  • 오류 처리:
    remote.on('error', function (err) {
            // 대상 서버 연결 오류를 처리합니다.
    });
    소켓.on('오류', 함수 (err) {
    // 클라이언트 연결 오류 처리
    });
    오류 이벤트를 수신하고 오류가 발생하면 해당 연결을 삭제합니다.
  • 서버 시작:
    server.listen(11100);
    서버는 클라이언트 연결을 기다리면서 포트 11100에서 수신 대기합니다.
  • 전체 코드

    const net = require('net');
    const net = require('net');
    서버 = net.createServer(함수 (소켓) {
        소켓.원스('데이터', 함수 (데이터) {
            if (!data || data[0] !== 0x05) return 소켓.destroy();
            addrLen = 0, RemoteAddr = null, RemotePort = null로 설정합니다.
            소켓.write(Buffer.from([5, 0]), 함수 (err) {
                if (err) 소켓.destroy();
                소켓.원스('데이터', (데이터) => {
                    if (data.length < 7 || data[1] !== 0x01) return 소켓.destroy();  // CONNECT만 지원 
                    시도 {
                        addrtype = 데이터[3]; // ADDRESS_TYPE 대상 서버 주소 유형
                        if (addrtype === 3) { // 0x03 도메인 주소
                            addrLen = 데이터[4];  // 도메인 주소의 첫 번째 바이트는 길이이고 나머지 바이트는 도메인 이름 바이트 배열입니다.
                        } else if (addrtype !== 1 && addrtype !== 4) {
                            return 소켓.destroy();
                        }
                        RemotePort = data.readUInt16BE(data.length - 2); // 마지막 2바이트는 포트 값입니다.if (addrtype === 1) { // 0x01 IP V4 주소
                            RemoteAddr = data.slice(3, 7).join('.');
                        } else if (addrtype === 4) { // 0x04 IP V6 주소
                            // remoteAddr = data.slice(3, 19);// IP V6 길이는 16입니다.
                            return 소켓.write(Buffer.from([0x05, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));  // IP V6을 지원하지 않음
                        } else { // 0x03 도메인 주소, 첫 번째 바이트는 길이, 나머지 바이트는 도메인 이름 바이트 배열
                            remoteAddr = data.slice(5, 5 + addrLen).toString("binary");
                        }
                        원격 = net.connect(remotePort, remoteAddr, function () {
                            console.log(`연결 중 : ${remoteAddr}:${remotePort}`);
                            Socket.write(Buffer.from([0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), 함수 (err) {
                                만약 (오류) {
                                    console.error(`오류:${err.message}`);
                                    return 소켓.destroy();
                                }
                                원격.파이프(소켓);
                                소켓.파이프(원격);
                            });
                        });
                        remote.on('오류', 함수 (err) {
                            console.error(`원격 서버 ${remoteAddr}:${remotePort}에 연결하지 못했습니다. 오류: ${err.message}`);
                            원격.파괴();
                            소켓.파괴();
                        });
                    } 잡기 (e) {
                        console.error(e);
                    }
                });
            });
        });
        소켓.on('error', function (err) { console.error(`error:${err.message}`); });
    });
    서버.듣기(11100);
    
    

    사용

  • 위 코드를 socks5.js로 저장하세요.
  • 명령줄에서 node Socks5.js를 실행하여 SOCKS5 프록시 서버를 시작하세요.
  • 클라이언트가 SOCKS5 프록시를 사용하도록 구성하고 프록시 주소를 서버의 IP 및 포트 11100으로 설정합니다.
  • 참고

    • 이 코드는 간단한 구현이며 인증과 같은 고급 기능을 포함하지 않습니다.
    • 프로덕션 환경에서 사용할 때는 보안 및 성능 최적화를 고려하세요.
    • 더 많은 SOCKS5 프로토콜 기능을 지원해야 하는 경우 추가 코드 확장이 필요합니다.
    <스타일> 리 { 목록 스타일 유형: 없음; }

    NodeJS로 간단한 Socks5 프록시를 구축하는 방법 리뷰 FAQ

    SOCKS5(Socket Secure 5)은 프록시 서비스에 사용되는 네트워크 프로토콜입니다. 이를 통해 사용자는 프록시 서버를 통해 네트워크 연결을 라우팅하여 지리적 제한을 우회하거나 개인 정보 보호를 강화할 수 있습니다. Shadowsocks 및 기타 프록시 도구와 마찬가지로 SOCKS5 프록시를 사용하여 사용자 개인 정보를 보호하고 제한된 웹 사이트에 액세스할 수 있습니다.

    브라우저 설정에서 프록시 서버 정보를 구성할 수 있습니다. 구성에서 SOCKS5 프록시 서버의 IP 주소와 포트 번호를 지정해야 합니다. 일단 구성되면 브라우저의 모든 네트워크 요청은 지정된 프록시 서버를 통해 라우팅됩니다.
    이전 기사 24 지문 방지 브라우저(요약) 브라우저 핑거프린팅 기술은 웹사이트 분석, 타겟 광고,...
    다음 기사 프록시 서버 유형 및 용도에 대한 자세한 설명 프록시 서버는 국경 간 활동에 참여하는 기업과 개인에게...
    블로그
    2026년에 사용할 최고의 Disco...

    Discord는 커뮤니티, 게이머, 개발자 및 전문가가...

    블로그
    15개 이상의 저렴하고 신뢰할 수 있...

    포괄적인 가이드에서 최고의 Socks5 프록시 및 HT...

    블로그
    20 인기 있는 SOCKS5 프록시 ...

    프록시 연결 도구는 귀하의 개인 정보와 보안을 보호하는...

    블로그
    Android 휴대폰에서 SOCKS5...

    v2rayNG 앱을 사용하여 Android 휴대폰에 S...

    이메일을 통해 직접 문의해 주세요 [email protected]

    추천 가맹점