Как создать простой прокси-сервер Socks5 с помощью NodeJS

Pandada
Опубликовано 2023-10-19
Настройка простого прокси-сервера Socks5 с помощью Node.js
Этот код представляет собой простую реализацию прокси-сервера SOCKS5 с использованием модуля net Node.js. Прокси-сервер SOCKS5 пересылает клиентские сетевые запросы на целевые серверы. Он поддерживает различные типы адресов, включая IPv4, IPv6 и доменные имена. В этой реализации поддерживается операция CONNECT, которая устанавливает TCP-соединение.
Описание функциональности кода
const net = require('net');
Импортируйте модуль Node.js net для создания TCP-серверов и клиентов.
let server = net.createServer(function (socket) {
// Логика сервера
});
Используйте метод net.createServer, чтобы создать TCP-сервер. Каждый раз, когда подключается новый клиент, выполняется функция обратного вызова, где объект socket представляет соединение с клиентом.
socket.once('data', function (data) {
// Обработка данных, отправленных клиентом
});
Используйте socket.once для прослушивания первого фрагмента данных, отправленного клиентом, который обычно представляет собой запрос установления связи SOCKS5.
if (!data || data[0] !== 0x05) return socket.destroy();
Убедитесь, что данные, отправленные клиентом, соответствуют протоколу SOCKS5. Если нет, разорвите соединение.
socket.write(Buffer.from([5, 0]), function (err) {
// Логика после отправки ответа
});
Отправьте клиенту ответ, указывающий, что аутентификация не требуется.
socket.once('data', (data) => {
// Анализируем целевой адрес и порт и устанавливаем соединение
});
Снова прослушайте данные от клиента, на этот раз это запрос на соединение. Проанализируйте целевой адрес и порт, а затем попытайтесь подключиться к целевому серверу.
let Remote = net.connect(remotePort, RemoteAddr, function () {
// Логика после успешного подключения
});
Используйте метод net.connect, чтобы попытаться подключиться к целевому серверу. В случае успеха выполните функцию обратного вызова.
remote.pipe(socket);
сокет.pipe(удаленный);
Используйте метод pipe для двунаправленной пересылки данных между клиентом и целевым сервером.
remote.on('error', function (err) {
// Обработка ошибок подключения к целевому серверу
});
socket.on('ошибка', функция (ошибка) {
// Обработка ошибок подключения клиента
});
Прослушивайте события ошибок и уничтожайте соответствующее соединение при возникновении ошибки.
server.listen(11100);
Сервер прослушивает порт 11100, ожидая клиентских подключений.Полный код
const net = require('net');
const net = require('net');
пусть сервер = net.createServer(функция (сокет) {
сокет.once('данные', функция (данные) {
if (!data || data[0] !== 0x05) return socket.destroy();
пусть addrLen = 0, RemoteAddr = NULL, RemotePort = NULL;
сокет.write(Buffer.from([5, 0]), функция (ошибка) {
если (ошибка) socket.destroy();
socket.once('data', (data) => {
if (data.length < 7 || data[1] !== 0x01) returnocket.destroy(); // Поддерживает только CONNECT
попробуй {
тип адреса = данные [3]; // ADDRESS_TYPE тип адреса целевого сервера
if (addrtype === 3) { // адрес домена 0x03
addrLen = данные [4]; // Первый байт адреса домена — это длина, остальные байты — массив байтов имени домена
} else if (addrtype !== 1 && addrtype !== 4) {
вернуть сокет.уничтожить();
}
удаленныйПорт = data.readUInt16BE(data.length - 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 socket.write(Buffer.from([0x05, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])); // Не поддерживать IP V6
} else { // 0x03 адрес домена, первый байт — длина, остальные байты — массив байтов имени домена
RemoteAddr = data.slice(5, 5 + addrLen).toString("двоичный");
}
let Remote = net.connect(remotePort, RemoteAddr, function () {
console.log(`connecting: ${remoteAddr}:${remotePort}`);
socket.write(Buffer.from([0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), function (err) {
если (ошибка) {
console.error(`error:${err.message}`);
вернуть сокет.уничтожить();
}
Remote.pipe (сокет);
сокет.труба(удаленный);
});
});
Remote.on('ошибка', функция (ошибка) {
console.error(`Не удалось подключиться к удаленному серверу ${remoteAddr}:${remotePort}, ошибка: ${err.message}`);
удаленный.уничтожить();
сокет.уничтожить();
});
} поймать (е) {
консоль.ошибка(е);
}
});
});
});
socket.on('error', function (err) { console.error(`error:${err.message}`); });
});
сервер.прослушивать(11100);
код>
Использование
socks5.js.node socks5.js в командной строке, чтобы запустить прокси-сервер SOCKS5.11100.Примечания
- Этот код представляет собой простую реализацию и не включает расширенные функции, такие как аутентификация.
- Рассмотрите возможность оптимизации безопасности и производительности при использовании в производственной среде.
- Если вам необходимо поддерживать дополнительные функции протокола SOCKS5, потребуются дополнительные расширения кода.
Частые вопросы о Как создать простой прокси-сервер Socks5 с помощью NodeJS
SOCKS5 (Socket Secure 5) — это сетевой протокол, используемый для прокси-сервисов. Это позволяет пользователям маршрутизировать свои сетевые подключения через прокси-сервер, чтобы обойти географические ограничения или повысить конфиденциальность. Подобно Shadowsocks и другим прокси-инструментам, прокси SOCKS5 можно использовать для защиты конфиденциальности пользователей и доступа к веб-сайтам с ограниченным доступом.
Вы можете настроить информацию о прокси-сервере в настройках вашего браузера. В конфигурации необходимо указать IP-адрес и номер порта прокси-сервера SOCKS5. После настройки все сетевые запросы браузера будут направляться через указанный прокси-сервер.
Предыдущая статья 24 браузера с защитой от отпечатков пальцев (краткое содержание)
Технология снятия отпечатков п...
Следующая статья Подробное объяснение типов и использования прокси-серверов
Прокси-сервер — это важнейший ...
Как создать простой ...
Настройка простого прокси-серв...
