Inicio Qué es un proxy Cómo construir un proxy Socks5 simple con NodeJS

Cómo construir un proxy Socks5 simple con NodeJS

perfil de usuario
Pandada Publicado el 2023-10-19
0

Configuración de un servidor proxy Socks5 simple con Node.js

Este código es una implementación simple de un servidor proxy SOCKS5 usando el módulo net de Node.js. Un servidor proxy SOCKS5 reenvía las solicitudes de red del cliente a los servidores de destino. Admite varios tipos de direcciones, incluidos IPv4, IPv6 y nombres de dominio. En esta implementación, la operación admitida es CONNECT, que establece una conexión TCP.

Explicación de la funcionalidad del código

  • Importar módulos:
    const net = require('net');
    Importe el módulo net de Node.js para crear servidores y clientes TCP.
  • Crear servidor:
    let server = net.createServer(function (socket) {
    // lógica del servidor
    });
    Utilice el método net.createServer para crear un servidor TCP. Cada vez que se conecta un nuevo cliente, se ejecuta la función de devolución de llamada, donde el objeto socket representa la conexión con el cliente.
  • Manejar datos del cliente:
    socket.once('datos', función (datos) {
            // Maneja los datos enviados por el cliente
    });
    Utilice socket.once para escuchar el primer fragmento de datos enviado por el cliente, que suele ser la solicitud de protocolo de enlace SOCKS5.
  • Validar protocolo SOCKS5:
    if (!data || data[0] !== 0x05) return socket.destroy();
    Validar que los datos enviados por el cliente se ajusten al protocolo SOCKS5. En caso contrario, destruya la conexión.
  • Enviar respuesta:
    socket.write(Buffer.from([5, 0]), función (err) {
            // Lógica después de enviar la respuesta
    });
    Envíe una respuesta al cliente indicando que no se necesita autenticación.
  • Manejar solicitud de conexión:
    socket.once('datos', (datos) => {
            // Analiza la dirección y el puerto de destino y establece la conexión
    });
    Escuche nuevamente los datos del cliente, que esta vez es la solicitud de conexión. Analice la dirección y el puerto de destino, luego intente conectarse al servidor de destino.
  • Establecer conexión con el servidor de destino:
    let remoto = net.connect(puertoremoto, dirección remota, función () {
             // Lógica después de una conexión exitosa
    });
    Utilice el método net.connect para intentar conectarse al servidor de destino. En caso de éxito, ejecute la función de devolución de llamada.
  • Reenvío de datos:
    remote.pipe(socket);
    socket.pipe(remoto);
    Utilice el método pipe para lograr el reenvío de datos bidireccional entre el cliente y el servidor de destino.
  • Manejo de errores:
    remote.on('error', función (err) {
            // Manejar errores al conectarse al servidor de destino
    });
    socket.on('error', función (err) {
    // Manejar errores de conexión del cliente
    });
    Escuche eventos de error y destruya la conexión correspondiente cuando ocurra un error.
  • Iniciar servidor:
    server.listen(11100);
    El servidor escucha en el puerto 11100, esperando conexiones del cliente.
  • Código completo

    const net = require('net');
    const neto = requerir('neto');
    dejar servidor = net.createServer (función (socket) {
        socket.once('datos', función (datos) {
            if (!data || data[0] !== 0x05) return socket.destroy();
            let addrLen = 0, RemoteAddr = nulo, RemotePort = nulo;
            socket.write(Buffer.from([5, 0]), función (err) {
                si (err) socket.destroy();
                socket.once('datos', (datos) => {
                    if (data.length < 7 || data[1] !== 0x01) return socket.destroy();  // Sólo admite CONECTAR 
                    prueba {
                        tipo de dirección = datos[3]; // tipo de dirección del servidor de destino ADDRESS_TYPE
                        if (addrtype === 3) { // dirección de dominio 0x03
                            addrLen = datos[4];  // El primer byte de la dirección del dominio es la longitud, los bytes restantes son la matriz de bytes del nombre del dominio
                        } else if (addrtype!== 1 && addrtype!== 4) {
                            devolver socket.destroy();
                        }
                        puerto remoto = datos.readUInt16BE(datos.longitud - 2); // Los dos últimos bytes son el valor del puertoif (addrtype === 1) { // 0x01 dirección IP V4
                            dirección remota = data.slice(3, 7).join('.');
                        } else if (addrtype === 4) { // 0x04 dirección IP V6
                            // remoteAddr = data.slice(3, 19);// La longitud de IP V6 es 16
                            return socket.write(Buffer.from([0x05, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));  // No es compatible con IP V6
                        } else { // Dirección de dominio 0x03, el primer byte es la longitud, los bytes restantes son la matriz de bytes del nombre de dominio
                            addr remoto = data.slice(5, 5 + addrLen).toString("binario");
                        }
                        let remoto = net.connect(puertoremoto, dirección remota, función () {
                            console.log(`conectando: ${remoteAddr}:${remotePort}`);
                            socket.write(Buffer.from([0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), función (err) {
                                si (errar) {
                                    console.error(`error:${err.message}`);
                                    devolver socket.destroy();
                                }
                                tubo.remoto(enchufe);
                                socket.pipe(remoto);
                            });
                        });
                        remoto.on('error', función (err) {
                            console.error(`Error al conectarse al servidor remoto ${remoteAddr}:${remotePort}, error: ${err.message}`);
                            remoto.destruir();
                            socket.destroy();
                        });
                    } atrapar (e) {
                        consola.error(e);
                    }
                });
            });
        });
        socket.on('error', function (err) { console.error(`error:${err.message}`); });
    });
    servidor.escuchar(11100);
    
    

    Uso

  • Guarde el código anterior como socks5.js.
  • Ejecute node Socks5.js en la línea de comando para iniciar el servidor proxy SOCKS5.
  • Configure su cliente para usar el proxy SOCKS5, estableciendo la dirección del proxy en la IP del servidor y el puerto 11100.
  • Notas

    • Este código es una implementación simple y no incluye funciones avanzadas como la autenticación.
    • Tenga en cuenta las optimizaciones de seguridad y rendimiento cuando lo utilice en un entorno de producción.
    • Si necesita admitir más funciones del protocolo SOCKS5, se requieren más extensiones de código.
    li { tipo de estilo de lista: ninguno; }

    Cómo construir un proxy Socks5 simple con NodeJS preguntas frecuentes de la reseña

    SOCKS5 (Socket Secure 5) es un protocolo de red utilizado para servicios de proxy. Permite a los usuarios enrutar sus conexiones de red a través de un servidor proxy para evitar restricciones geográficas o mejorar la privacidad. Al igual que Shadowsocks y otras herramientas proxy, los servidores proxy SOCKS5 se pueden utilizar para proteger la privacidad del usuario y acceder a sitios web restringidos.

    Puede configurar la información del servidor proxy en la configuración de su navegador. En la configuración, debe especificar la dirección IP y el número de puerto del servidor proxy SOCKS5. Una vez configuradas, todas las solicitudes de red del navegador se enrutarán a través del servidor proxy especificado.
    Artículo anterior 24 navegadores antihuellas (Resumen) La tecnología de huellas dacti...
    Artículo siguiente Explicación detallada de los tipos y usos del servidor proxy Proxy Server son herramientas ...
    blog
    Cómo construir un pr...

    Configuración de un servidor p...

    Por favor contáctenos directamente por correo electrónico [email protected]

    Comerciantes recomendados