Cómo construir un proxy Socks5 simple con NodeJS

Pandada
Publicado el 2023-10-19
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
const net = require('net');
Importe el módulo net de Node.js para crear servidores y clientes TCP.
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.
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.
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.
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.
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.
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.
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.
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.
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
socks5.js.node Socks5.js en la línea de comando para iniciar el servidor proxy SOCKS5.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.
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 siguiente Explicación detallada de los tipos y usos del servidor proxy
Proxy Server son herramientas ...
Cómo construir un pr...
Configuración de un servidor p...
