Главная Что такое прокси-сервер? Как создать простой прокси-сервер Socks5 с помощью NodeJS

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

user profile
Pandada Опубликовано 2023-10-19
0

Настройка простого прокси-сервера 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.
  • Проверка протокола 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.
  • Настройте свой клиент на использование прокси-сервера SOCKS5, указав в качестве адреса прокси-сервера IP-адрес и порт 11100.
  • Примечания

    • Этот код представляет собой простую реализацию и не включает расширенные функции, такие как аутентификация.
    • Рассмотрите возможность оптимизации безопасности и производительности при использовании в производственной среде.
    • Если вам необходимо поддерживать дополнительные функции протокола SOCKS5, потребуются дополнительные расширения кода.
    <стиль> ли { тип стиля списка: нет; }

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

    SOCKS5 (Socket Secure 5) — это сетевой протокол, используемый для прокси-сервисов. Это позволяет пользователям маршрутизировать свои сетевые подключения через прокси-сервер, чтобы обойти географические ограничения или повысить конфиденциальность. Подобно Shadowsocks и другим прокси-инструментам, прокси SOCKS5 можно использовать для защиты конфиденциальности пользователей и доступа к веб-сайтам с ограниченным доступом.

    Вы можете настроить информацию о прокси-сервере в настройках вашего браузера. В конфигурации необходимо указать IP-адрес и номер порта прокси-сервера SOCKS5. После настройки все сетевые запросы браузера будут направляться через указанный прокси-сервер.
    Предыдущая статья 24 браузера с защитой от отпечатков пальцев (краткое содержание) Технология снятия отпечатков п...
    Следующая статья Подробное объяснение типов и использования прокси-серверов Прокси-сервер — это важнейший ...
    blog
    Как создать простой ...

    Настройка простого прокси-серв...

    Пожалуйста, свяжитесь с нами напрямую по электронной почте [email protected]

    Рекомендуемые продавцы