linux c си сокет как прокси
linux c си сокет как прокси
Как собрать свой прокси на Linux: сокеты в C без посредников
linux c си сокет как прокси — это не просто набор слов из man-страниц. Это точка входа в мир низкоуровневого сетевого программирования, где вы полностью контролируете трафик между клиентом и сервером. В этом гайде разберём, как написать простой, но рабочий TCP-прокси на чистом C под Linux, какие подводные камни ждут на пути и почему «сделай сам» иногда безопаснее коммерческого VPN.
Почему «просто сокет» — это уже прокси?
Многие думают, что прокси — это обязательно Squid, Shadowsocks или Tor. На деле всё начинается с socket(), bind(), listen(), accept(), connect() и бесконечного цикла пересылки байтов. Простейший TCP-прокси — это программа, которая:
- Слушает соединения на локальном порту (например, 8080).
- При получении нового клиента — соединяется с целевым хостом (указанным в запросе или жёстко заданным).
- Копирует данные из одного сокета в другой и обратно.
Вот базовая структура:
// 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).
Реальные сценарии использования в России
-
Журналист в командировке
Нужно передавать материалы без риска перехвата в гостиничном Wi-Fi. Самописный прокси на финском VPS + TLS-обёртка скроет трафик от локального провайдера. -
IT-специалист в кафе
Подключается к корпоративному GitLab. Без прокси/VPN его SSH-ключи могут быть перехвачены. Прокси с поддержкой CONNECT защищает только нужный трафик (split tunneling). -
Пользователь торрентов
Хочет избежать писем от правообладателей. Но! Простой TCP-прокси не скрывает peer-to-peer трафик. Нужен полноценный VPN с поддержкой UDP и no-logs. -
Обход блокировки Telegram
Провайдеры блокируют по IP и SNI. Прокси с обфускацией (например, через WebSocket) может помочь, но WireGuard надёжнее. -
Защита от 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. Помните: анонимность — это процесс, а не функция одной программы.
Question: Is there a max bet rule while a bonus is active?