Frod

06.08.2026

linux c си прокси сервер

Frod — свобода без границ

Разработка прокси-сервера на Linux с помощью Си

В этом руководстве мы рассмотрим процесс разработки прокси-сервера на Linux с помощью Си. Прокси-сервер — это сервер, который располагается между клиентом и сервером и обрабатывает запросы клиента, передавая их на сервер. Эта технология широко используется для обеспечения анонимности и защищенности в Интернете.

Основные понятия

В первую очередь нам нужно понять основные понятия прокси-сервера:

  • Клиент — это компьютер или устройство, которое отправляет запросы к серверу.
  • Сервер — это компьютер или устройство, которое обрабатывает запросы клиента.
  • Прокси-сервер — это сервер, который располагается между клиентом и сервером и обрабатывает запросы клиента.

Установка необходимых библиотек

Чтобы начать разработку прокси-сервера, нам нужно установить необходимые библиотеки. В частности, нам понадобится библиотека libevent, которая используется для асинхронного обслуживания событий.

sudo apt-get update
sudo apt-get install libevent-dev

Создание прокси-сервера

Теперь мы можем приступить к созданию прокси-сервера. Мы создадим простой сервер, который будет принимать соединения и передавать их на сервер.

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

#define MAX_BUFFER_SIZE 1024

int main() {
 int sock = socket(AF_INET, SOCK_STREAM, 0);
 struct sockaddr_in server_addr;
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(8080);
 inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

 if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1) {
 perror("bind");
 return 1;
 }

 if (listen(sock, 3) == -1) {
 perror("listen");
 return 1;
 }

 struct event_base *base = event_base_new();
 struct event *ev = event_new(base, sock, EV_READ | EV_PERSIST, proxy_read_cb, NULL);
 event_add(ev, NULL);

 event_base_dispatch(base);
 event_free(ev);
 event_base_free(base);

 return 0;
}

Обработка запросов

Теперь нам нужно обрабатывать запросы клиента. Мы создадим функцию proxy_read_cb, которая будет вызываться при приходе новых данных на сокет.

void proxy_read_cb(struct event_base *base, void *data, short events, void *arg) {
 struct bufferevent *bev = bufferevent_openssl_socket_new(base, socket, -1, BUFFER_EVENT_SSL_ACCEPTING, BUFFER_EVENT_ADD_FD);
 bufferevent_setcb(bev, proxy_read_cb, NULL, NULL);
 bufferevent_enable(bev, EV_READ);
}

Работа с SSL

В частности, нам нужно работать с SSL, чтобы обеспечить защищенность соединения.

void proxy_read_cb(struct bufferevent *bef, void *data, short events, void *arg) {
 if (events & BEV_EVENT_EOF) {
 printf("Connection closed\n");
 } else if (events & BEV_EVENT_ERROR) {
 printf("Error occurred\n");
 } else {
 printf("Received data: %s\n", bufferevent_get_input(bef, MAX_BUFFER_SIZE));
 }
}

Запуск прокси-сервера

Теперь мы можем запустить прокси-сервер.

gcc proxy_server.c -o proxy_server -levent -lcrypto
./proxy_server

Использование прокси-сервера

Чтобы использовать прокси-сервер, нам нужно настроить клиент на то, чтобы использовать порт 8080.

curl -x http://localhost:8080 http://example.com

Вывод

В этом руководстве мы рассмотрели процесс разработки прокси-сервера на Linux с помощью Си. Мы создали простой сервер, который принимает соединения и передает их на сервер. Мы также внедрили работу с SSL, чтобы обеспечить защищенность соединения.