Skip to content

Instantly share code, notes, and snippets.

@longbill
Last active May 15, 2024 08:04
Show Gist options
  • Select an option

  • Save longbill/d321fc371e6dda9acf40decdb923c048 to your computer and use it in GitHub Desktop.

Select an option

Save longbill/d321fc371e6dda9acf40decdb923c048 to your computer and use it in GitHub Desktop.

Revisions

  1. longbill revised this gist Oct 24, 2018. 1 changed file with 48 additions and 25 deletions.
    73 changes: 48 additions & 25 deletions socks5.js
    Original file line number Diff line number Diff line change
    @@ -1,45 +1,68 @@
    const net = require('net')
    net.createServer(client => {
    let state = 0;
    client.on('data', data => {

    if (state === 0) {
    client.write(Buffer.from([5, 0]));
    state = 1;
    } else if (state === 1) {
    state = 2;
    client.removeAllListeners('data');

    let atyp = data[3];
    let responseAddr = atyp === 3 ? data.slice(5, data[4]+5) : data.slice(4,8);
    let serverStr = atyp === 3 ? responseAddr.toString() : responseAddr.join('.');

    let port = data.slice(data.length-2, data.length);
    let portNum = port[0]*256 + port[1];
    client.once('data', data => {
    client.write(Buffer.from([5, 0]));

    client.once('data', data => {
    data = [...data];
    let ver = data.shift();
    let cmd = data.shift(); //1: connect, 2: bind, 3: udp
    let rsv = data.shift();
    let atyp = data.shift(); //1: ipv4(4bytes followed), 3: domain, 4: ipv6(16 bytes followed)
    let dstAddr, dstPort, serverStr = '';
    if (atyp === 1) {
    dstAddr = data.splice(0, 4);
    serverStr = dstAddr.join('.');
    } else if (atyp === 3) {
    let domainLength = data.shift();
    dstAddr = data.splice(0, domainLength);
    serverStr = Buffer.from(dstAddr).toString();
    dstAddr.unshift(domainLength);
    } else if (atyp === 4) {
    dstAddr = data.splice(0, 16);
    serverStr = [];
    for(let i = 0; i < 8; i++) {
    serverStr.push(Buffer.from(dstAddr.slice(i * 2, 2)).toString('hex'));
    }
    serverStr = serverStr.join(':');
    } else {
    client.destroy();
    return;
    }

    dstPort = data.splice(0, 2);
    const portNum = dstPort[0] * 256 + dstPort[1];

    let server = `${serverStr}:${portNum}`;
    console.log('>', server);
    const serverName = `${serverStr}:${portNum}`;
    console.log('>', serverName);

    let dstServer = net.connect({
    const dstServer = net.connect({
    host: serverStr,
    port: portNum
    });

    dstServer.on('error', err => {
    console.log(`!Server Error(${server}):`, err.message);
    console.log(`!Server Error(${serverName}):`, err.message);
    client.destroy();
    });

    client.on('error', err=>{
    console.log(`!Client Error(${server}):`, err.message);
    console.log(`!Client Error(${serverName}):`, err.message);
    dstServer.destroy();
    });

    client.write(Buffer.from([data[0], 0, 0, atyp]));
    client.write(Buffer.concat([responseAddr, port]));
    if (data && data.length > 0) {
    dstServer.write(Buffer.from(data));
    }

    client.write(Buffer.concat([
    Buffer.from([ver, 0, 0, atyp]),
    Buffer.from(dstAddr),
    Buffer.from(dstPort)
    ]));

    dstServer.pipe(client);
    client.pipe(dstServer);

    }
    });
    });
    }).listen(8787, '127.0.0.1');
  2. longbill revised this gist Oct 23, 2018. 1 changed file with 27 additions and 28 deletions.
    55 changes: 27 additions & 28 deletions socks5.js
    Original file line number Diff line number Diff line change
    @@ -1,46 +1,45 @@
    'use strict';
    //by Chunlong Liu (http://jszen.com)
    const net = require('net')

    net.createServer( client => {
    net.createServer(client => {
    let state = 0;
    client.on('data', data=>{
    if (state == 0) {
    client.write(new Buffer([5,0]));
    client.on('data', data => {

    if (state === 0) {
    client.write(Buffer.from([5, 0]));
    state = 1;
    } else if (state == 1) {
    } else if (state === 1) {
    state = 2;
    client.removeAllListeners('data');

    let atyp = data[3];

    let serverStr = atyp == 3 ? data.slice(5,data[4]+5).toString() : data.slice(4,8).join('.');
    let responseAddr = atyp == 3 ? data.slice(4, data[4]+5) : data.slice(4,8);
    let responseAddr = atyp === 3 ? data.slice(5, data[4]+5) : data.slice(4,8);
    let serverStr = atyp === 3 ? responseAddr.toString() : responseAddr.join('.');

    let port = data.slice(data.length-2,data.length);
    let portNum = port[0]*256+port[1];
    let port = data.slice(data.length-2, data.length);
    let portNum = port[0]*256 + port[1];

    console.log('> '+serverStr+':'+portNum);
    let server = `${serverStr}:${portNum}`;
    console.log('>', server);

    let dstServer = net.connect({
    host:serverStr,
    port:portNum
    }, ()=>{
    client.write(new Buffer([data[0],0,0,atyp]));
    client.write(Buffer.concat([responseAddr,port]));

    dstServer.pipe(client);
    client.pipe(dstServer);
    host: serverStr,
    port: portNum
    });
    dstServer.on('error', err=>{
    console.log('!Server Error('+serverStr+':'+portNum+'): '+err);

    dstServer.on('error', err => {
    console.log(`!Server Error(${server}):`, err.message);
    client.destroy();
    });

    client.on('error', err=>{
    console.log('!Client Error('+serverStr+':'+portNum+'): '+err);
    console.log(`!Client Error(${server}):`, err.message);
    dstServer.destroy();
    });

    state=2;
    client.write(Buffer.from([data[0], 0, 0, atyp]));
    client.write(Buffer.concat([responseAddr, port]));
    dstServer.pipe(client);
    client.pipe(dstServer);

    }
    });
    }).listen(8787);

    }).listen(8787, '127.0.0.1');
  3. longbill created this gist Nov 8, 2016.
    46 changes: 46 additions & 0 deletions socks5.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,46 @@
    'use strict';
    //by Chunlong Liu (http://jszen.com)
    const net = require('net')

    net.createServer( client => {
    let state = 0;
    client.on('data', data=>{
    if (state == 0) {
    client.write(new Buffer([5,0]));
    state = 1;
    } else if (state == 1) {

    let atyp = data[3];

    let serverStr = atyp == 3 ? data.slice(5,data[4]+5).toString() : data.slice(4,8).join('.');
    let responseAddr = atyp == 3 ? data.slice(4, data[4]+5) : data.slice(4,8);

    let port = data.slice(data.length-2,data.length);
    let portNum = port[0]*256+port[1];

    console.log('> '+serverStr+':'+portNum);

    let dstServer = net.connect({
    host:serverStr,
    port:portNum
    }, ()=>{
    client.write(new Buffer([data[0],0,0,atyp]));
    client.write(Buffer.concat([responseAddr,port]));

    dstServer.pipe(client);
    client.pipe(dstServer);
    });
    dstServer.on('error', err=>{
    console.log('!Server Error('+serverStr+':'+portNum+'): '+err);
    client.destroy();
    });
    client.on('error', err=>{
    console.log('!Client Error('+serverStr+':'+portNum+'): '+err);
    dstServer.destroy();
    });

    state=2;
    }
    });
    }).listen(8787);