linux c си сокет как прокси

Ускорить пинг Безопасное соединение Высокая скорость Быстрое подключение Хорошая цена

linux c си сокет как прокси

Как собрать свой прокси на Linux: сокеты в C без посредников

linux c си сокет как прокси — это не просто набор слов из man-страниц. Это точка входа в мир низкоуровневого сетевого программирования, где вы полностью контролируете трафик между клиентом и сервером. В этом гайде разберём, как написать простой, но рабочий TCP-прокси на чистом C под Linux, какие подводные камни ждут на пути и почему «сделай сам» иногда безопаснее коммерческого VPN.

Почему «просто сокет» — это уже прокси?

Многие думают, что прокси — это обязательно Squid, Shadowsocks или Tor. На деле всё начинается с socket(), bind(), listen(), accept(), connect() и бесконечного цикла пересылки байтов. Простейший TCP-прокси — это программа, которая:

  1. Слушает соединения на локальном порту (например, 8080).
  2. При получении нового клиента — соединяется с целевым хостом (указанным в запросе или жёстко заданным).
  3. Копирует данные из одного сокета в другой и обратно.

Вот базовая структура:

// pseudo-code
while ((client_fd = accept(listen_fd, ...)) != -1) {
    target_fd = connect_to_target(target_host, target_port);
    proxy_loop(client_fd, target_fd); // двунаправленная пересылка
    close(client_fd);
    close(target_fd);
}

Такой код не шифрует трафик, не обходит DPI и не скрывает ваш IP от конечного сервера. Но он перенаправляет трафик — а это и есть суть прокси. А дальше — детали реализации.

Чего вам НЕ говорят в других гайдах

Большинство туториалов в интернете заканчиваются на «вот работает!». Но реальный мир сложнее:

  • Утечки через DNS: если ваш клиент разрешает доменные имена до подключения к прокси, провайдер видит все запрашиваемые сайты. Решение — использовать SOCKS5 с поддержкой DOMAIN или перехватывать getaddrinfo() через LD_PRELOAD.
  • TCP-таймауты и half-open соединения: при обрыве связи один сокет может «висеть» минутами. Без корректной обработки SO_KEEPALIVE и таймаутов ваш прокси быстро исчерпает файловые дескрипторы.
  • Отсутствие TLS — риск MITM: если вы проксируете HTTP без шифрования, любой в публичной сети (кафе, метро) может подменить контент. Даже HTTPS не спасает, если клиент не проверяет сертификаты (например, мобильное приложение).
  • DPI легко распознаёт «голый» TCP-трафик: если вы просто пересылаете байты без обфускации, российские провайдеры (Ростелеком, МТС) могут заблокировать соединение как «подозрительное». WireGuard или Shadowsocks с шейкером решают это.
  • Free VPN ≠ ваш прокси: бесплатные сервисы часто работают по принципу «вы — продукт». Они логируют всё, внедряют JavaScript-трекеры и даже перепродают ваш трафик. Ваш собственный прокси на VPS — дороже, но предсказуемее.

От «echo-сервера» к настоящему прокси: шаг за шагом

Шаг 1. Минимальный TCP-форвардер

Создадим программу, которая перенаправляет весь трафик с локального порта 9000 на example.com:80.

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define LISTEN_PORT 9000
#define TARGET_HOST "93.184.216.34" // example.com
#define TARGET_PORT 80

void forward(int src, int dst) {
    char buffer[4096];
    ssize_t n;
    while ((n = recv(src, buffer, sizeof(buffer), 0)) > 0) {
        if (send(dst, buffer, n, 0) != n) break;
    }
}

int main() {
    int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(LISTEN_PORT);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr));
    listen(listen_fd, 10);

    printf("Proxy listening on port %d\n", LISTEN_PORT);
    while (1) {
        int client_fd = accept(listen_fd, NULL, NULL);
        int target_fd = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in target_addr = {0};
        target_addr.sin_family = AF_INET;
        target_addr.sin_port = htons(TARGET_PORT);
        inet_pton(AF_INET, TARGET_HOST, &target_addr.sin_addr);
        connect(target_fd, (struct sockaddr*)&target_addr, sizeof(target_addr));

        if (!fork()) {
            // Child process
            forward(client_fd, target_fd);
            forward(target_fd, client_fd); // обратно
            exit(0);
        }
        close(client_fd);
        close(target_fd);
    }
}

Компилируем:

gcc -o simple_proxy simple_proxy.c
./simple_proxy

Проверяем:

curl -x http://127.0.0.1:9000 http://example.com

Работает? Отлично. Но это только начало.

Шаг 2. Добавляем поддержку HTTP CONNECT

Без этого HTTPS-трафик не пройдёт. Клиент отправляет:

CONNECT google.com:443 HTTP/1.1
Host: google.com:443

Прокси должен ответить:

HTTP/1.1 200 Connection Established

И только потом начинать пересылку байтов. Парсинг этой команды — обязательное условие для работы с браузерами.

Шаг 3. Обфускация против DPI

Чтобы обойти блокировки, можно:

  • Добавить случайные паузы между пакетами.
  • Использовать TLS-обёртку (stunnel).
  • Реализовать простой шифр XOR с известным ключом (не для безопасности, а для маскировки сигнатуры).

Для серьёзной защиты лучше сразу интегрировать WireGuard или использовать готовый протокол типа VMess (из проекта V2Ray).

Когда ваш самописный прокси опаснее, чем ничего

Риск Последствие Как проверить
Утечка DNS Провайдер видит все посещённые домены browserleaks.com/dns
Отсутствие kill switch При падении прокси трафик идёт напрямую Отключите VPS — проверьте IP на ipleak.net
Логирование в памяти Случайный core dump раскроет сессии Не используйте printf() для дебага в продакшене
Нет PFS (Perfect Forward Secrecy) Расшифровка всего трафика при утечке ключа Используйте ephemeral ключи в TLS
Подмена SNI DPI может фильтровать по имени сайта Проверьте SNI через Wireshark

Сравнение: самописный прокси vs коммерческий VPN (RU-реалии)

Критерий Самописный прокси на VPS Бесплатный VPN Премиум-VPN (с аудитом)
Юрисдикция Вы выбираете (Нидерланды, Финляндия) Часто США/Кипр (14 Eyes) Швейцария, Панама, Сейшелы
Логирование Только то, что вы сами пишете Полные логи + поведенческие метрики No-logs policy + независимый аудит
Протокол TCP/UDP raw, возможно TLS Устаревший OpenVPN без PFS WireGuard, OpenVPN с AES-256-GCM
Цена (месяц) От 250 ₽ (Hetzner) Бесплатно От 300 ₽
Скорость До 95% от канала VPS 10–40 Мбит/с с ограничением 80–98% от вашего канала
Защита от DPI Требует доп. обфускации Часто не работает в РФ Встроена (Stealth, obfs4)
Kill switch Нужно реализовывать вручную Отсутствует или фейковый Есть в клиенте (Linux/Windows)

💡 Важно: с 2022 года в РФ многие VPS-провайдеры (включая Mail.ru Cloud) требуют паспорт при регистрации. Выбирайте зарубежные хостинги без KYC: Hetzner, OVH, DigitalOcean (но они могут блокировать по запросу Roskomnadzor).

Реальные сценарии использования в России

  1. Журналист в командировке
    Нужно передавать материалы без риска перехвата в гостиничном Wi-Fi. Самописный прокси на финском VPS + TLS-обёртка скроет трафик от локального провайдера.

  2. IT-специалист в кафе
    Подключается к корпоративному GitLab. Без прокси/VPN его SSH-ключи могут быть перехвачены. Прокси с поддержкой CONNECT защищает только нужный трафик (split tunneling).

  3. Пользователь торрентов
    Хочет избежать писем от правообладателей. Но! Простой TCP-прокси не скрывает peer-to-peer трафик. Нужен полноценный VPN с поддержкой UDP и no-logs.

  4. Обход блокировки Telegram
    Провайдеры блокируют по IP и SNI. Прокси с обфускацией (например, через WebSocket) может помочь, но WireGuard надёжнее.

  5. Защита от WebRTC-утечек
    Даже при использовании прокси браузер может «пробросить» ваш реальный IP через WebRTC. Отключайте его в настройках или используйте Firefox с media.peerconnection.enabled = false.

FAQ

VPN замедляет интернет на сколько реально?

Зависит от протокола и расположения сервера. WireGuard добавляет 5–15 мс пинга и снижает скорость на 2–8%. OpenVPN/TCP — до 30% потерь. Самописный TCP-прокси без шифрования — почти нулевые накладные расходы, но без защиты.

Меня найдёт спецслужба при использовании VPN?

Если вы используете бесплатный или логирующий VPN — да, по запросу суда. Премиум-провайдеры без логов (и вне юрисдикции 14 Eyes) технически не могут предоставить данные. Самописный прокси на вашем VPS — только если хостер передаст IP-логи (что бывает редко при оплате криптой).

WireGuard или OpenVPN — что безопаснее?

WireGuard современнее: меньше кода (меньше уязвимостей), встроен в ядро Linux, поддерживает roaming и быстрее. OpenVPN проверен годами, но требует OpenSSL и сложнее в настройке. Оба безопасны при правильной конфигурации.

Можно ли использовать прокси вместо VPN для стриминга Netflix?

Технически — да, но Netflix блокирует большинство VPS-IP. Премиум-VPN имеют «чистые» IP-пулы. Ваш самописный прокси с IP из Hetzner, скорее всего, не пройдёт геопроверку.

Как проверить, не утекает ли мой реальный IP?

Откройте ipleak.net и browserleaks.com. Проверьте: IPv4, IPv6, DNS, WebRTC, местоположение. Если хоть один пункт показывает ваш город — настройка некорректна.

Законно ли использовать прокси в России?

Использование прокси или VPN не запрещено. Запрещена деятельность, направленная на обход решений Роскомнадзора (например, массовое распространение заблокированного контента). Личное использование для защиты трафика — в рамках закона.

Вывод

linux c си сокет как прокси — это не волшебная таблетка, а инструмент. Он даёт контроль, но требует глубокого понимания сетей, безопасности и угроз. Самописный прокси отлично подходит для задач, где важна прозрачность: внутренние туннели, обфускация трафика, тестирование приложений. Но для защиты от государственного DPI, утечек DNS и анализа трафика лучше комбинировать его с проверенными решениями — WireGuard, TLS 1.3, no-logs политикой и kill switch. Помните: анонимность — это процесс, а не функция одной программы.

Ускорить пинг Безопасное соединение Высокая скорость Быстрое подключение Хорошая цена

Комментарии

jamesmoreno 08 Июн 2026 10:46

Question: Is there a max bet rule while a bonus is active?

Оставить комментарий

Решите простую математическую задачу для защиты от ботов