Универсальный прокси-сервер. SOCKS протокол

Такой прокси сервер контролирует права клиента для доступа к внешним ресурсам и передаёт запрос к серверу. SOCKS может использоваться и противоположным способом, разрешая внешним клиентам соединяться с серверами за межсетевым экраном (брандмауэром).

В отличие от HTTP прокси серверов, SOCKS передаёт все данные от клиента, ничего не добавляя от себя, то есть с точки зрения конечного сервера, SOCKS прокси является обычным клиентом. SOCKS более универсален - не зависит от конкретных протоколов уровня приложений (7-го уровня модели OSI) и базируется на стандарте TCP/IP - протоколе 4-го уровня. Зато HTTP прокси кэширует данные и может более тщательно фильтровать содержимое передаваемых данных.

Этот протокол был разработан Дэвидом Кобласом (David Koblas), системным администратором MIPS Computer Systems. После того, как в году MIPS вошла в состав Silicon Graphics (SGI), Коблас сделал доклад о SOCKS на Симпозиуме по Безопасности Usenix (Usenix Security Symposium), и SOCKS стал публично доступным. Протокол был расширен до четвёртой версии Ин-Да Ли (Ying-Da Lee) из NEC Systems Laboratory.

Протокол SOCKS 4

SOCKS 4 предназначен для работы через фаервол без аутентификации для приложений типа клиент-сервер, работающих по протоколу TCP , таких, как TELNET , FTP и таких популярных протоколов обмена информацией, как HTTP , WAIS и GOPHER . По существу, SOCKS-сервер можно рассматривать как межсетевой экран, поддерживающий протокол SOCKS.

Типичный запрос SOCKS 4 выглядит следующим образом (каждое поле - один байт):

Запрос Клиента к SOCKS-Серверу:

  • поле 1: номер версии SOCKS, 1 байт (должен быть 0x04 для этой версии)
  • поле 2: код команды, 1 байт:
    • 0x02 = назначение TCP/IP порта (binding)
  • поле 3: номер порта, 2 байта
  • поле 4: IP-адрес , 4 байта
  • поле 5: ID пользователя, строки переменной длины, завершается null-байтом (0x00). Поле предназначено для идентификации пользователя (см. Ident)

Ответ Сервера SOCKS-Клиенту:

  • поле 1: null-байт
  • поле 2: код ответа, 1 байт:
    • 0x5a = запрос предоставлен
    • 0x5b = запрос отклонён или ошибочен
    • 0x5c = запрос не удался, потому что не запущен identd (или не доступен с сервера)
    • 0x5d = запрос не удался, поскольку клиентский identd не может подтвердить идентификатор пользователя в запросе
  • поле 3: 2 произвольных байта, должны быть проигнорированы
  • поле 4: 4 произвольных байта, должны быть проигнорированы

Протокол SOCKS 5

SOCKS 5 расширяет модель SOCKS 4, добавляя к ней поддержку UDP , обеспечение универсальных схем строгой аутентификации и расширяет методы адресации, добавляя поддержку доменных имен и адресов IPv6 . Начальная установка связи теперь состоит из следующего:

  • Клиент подключается, и посылает приветствие, которое включает перечень поддерживаемых методов аутентификации
  • Сервер выбирает из них один (или посылает ответ о неудаче запроса, если ни один из предложенных методов не приемлем)
  • В зависимости от выбранного метода, между клиентом и сервером может пройти некоторое количество сообщений
  • Клиент посылает запрос на соединение, аналогично SOCKS 4
  • Сервер отвечает, аналогично SOCKS 4

Методы аутентификации пронумерованы следующим образом:

  • 0x00 - аутентификация не требуется
  • 0x01 - GSSAPI
  • 0x02 - имя пользователя / пароль
  • 0x03-0x7F - зарезервировано IANA
  • 0x80-0xFE - зарезервировано для методов частного использования

Начальное приветствие от клиента:

  • поле 2: количество поддерживаемых методов аутентификации, 1 байт
  • поле 3: номера методы аутентификации, переменная длина, 1 байт для каждого поддерживаемого метода

Сервер сообщает о своём выборе:

  • поле 1: Версия SOCKS, 1 байт (0x05 для этой версии)
  • поле 2: выбранный метод аутентификации, 1 байт, или 0xFF, если не было предложено приемлемого метода

Последующая идентификация зависит от выбранного метода.

Запрос клиента:

  • поле 1: номер версии SOCKS (должен быть 0x05 для этой версии)
  • поле 2: код команды, 1 байт:
    • 0x01 = установка TCP/IP соединения
    • 0x02 = назначение TCP/IP порта (binding)
    • 0x03 = ассоциирование UDP-порта
  • поле 3: зарезервированный байт, должен быть 0x00
  • поле 4: тип адреса, 1 байт:
    • 0x01 = адрес IPv4
    • 0x03 = имя домена
    • 0x04 = адрес IPv6
  • поле 5: назначение адреса
    • 4 байта для адреса IPv4
    • 16 байт для адреса IPv6
  • поле 6: номер порта, 2 байта

Ответ сервера:

  • поле 1: номер версии SOCKS, 1 байт (0x05 для этой версии)
  • поле 2: код ответа, 1 байт:
    • 0x00 = запрос предоставлен
    • 0x01 = ошибка SOCKS-сервера
    • 0x02 = соединение запрещено набором правил
    • 0x03 = сеть недоступна
    • 0x04 = хост недоступен
    • 0x05 = отказ в соединении
    • 0x06 = истечение TTL
    • 0x07 = команда не поддерживается / ошибка протокола
    • 0x08 = тип адреса не поддерживается
  • поле 3: байт зарезервирован, должен быть 0x00
  • поле 4: тип последующего адреса, 1 байт:
    • 0x01 = адрес IPv4
    • 0x03 = имя домена
    • 0x04 = адрес IPv6
  • поле 5: назначение адреса
    • 4 байта для адреса IPv4
    • первый байт - длина имени, затем следует имя домена без завершающего нуля на конце
    • 16 байт для адреса IPv6
  • поле 6: номер порта, 2 байта

Реализации

  • Sun Java System Web Proxy Server - кеширующий прокси сервер для Solaris, Linux, Windows. Поддерживает HTTPS, NSAPI I/O фильтры, динамическую реконфигурацию и обратный прокси.
  • DeleGate - многофункциональный шлюз прикладного уровня и прокси сервер, работающий на различных платформах. Кроме SOCKS также поддерживает HTTP(S), FTP , NNTP , SMTP , POP , IMAP , LDAP , Telnet , DNS и другие протоколы.
  • 3proxy - легкий прокси-сервер с поддержкой SOCKS-proxy
  • WinGate - многопротокольный прокси сервер с поддержкой SOCKS для Windows.
  • OpenSSH позволяет динамически создавать туннели, заданные через подмножество протокола SOCKS.

См. также

  • Tor - анонимная сеть луковой маршрутизации , с SOCKS интерфейсом.

Ссылки

  • RFC 1928 (англ.) - SOCKS Protocol Version 5
  • RFC 1928 (рус.) - Протокол SOCKS 5
  • RFC 1929 (англ.) - Username/Password Authentication for SOCKS V5
  • RFC 1961 (англ.) - GSS-API Authentication Method for SOCKS Version 5
  • SOCKS: A protocol for TCP proxy across firewalls (англ.) - Протокол SOCKS 4

Wikimedia Foundation . 2010 .

Смотреть что такое "SOCKS" в других словарях:

    SOCKS - is an Internet protocol that allows client server applications to transparently use the services of a network firewall. SOCKS is an abbreviation for SOCKetS [ ]… … Wikipedia

    SOCKS - Saltar a navegación, búsqueda SOCKS es un protocolo de Internet que permite a las aplicaciones Cliente servidor usar de manera transparente los servicios de un firewall de red. SOCKS es una abreviación de SOCKetS . Los clientes que hay detrás… … Wikipedia Español

    Сетевой протокол, который позволяет клиент серверным приложениям прозрачно использовать сервисы за межсетевыми экранами (фаерволами). SOCKS это сокращение от «SOCKetS» (сокеты, гнёзда). Клиенты за межсетевым экраном, нуждающиеся в доступе к… … Википедия

    Socks - im Briefing Room des Weißen Hauses Betty Currie und Socks … Deutsch Wikipedia

    Socks - sobre el pupitre de la Sala de Prensa de la Casa Blanca. Socks (en español: Calcetines, marzo de 1989 20 de febrero de 2009) fue el gato de la familia del Presidente de los Estados Unidos Bill Clinton durante su presidencia. Fue la única mascota… … Wikipedia Español

Анонимность в сети — тема не новая. И вы наверняка устанавливали к себе на комп прогу типа A4Proxy, SocksChain
и им подобные. Лично я не люблю, когда для работы с проксями нужна какая-то отдельная прога. Во-первых
некрасиво, когда много окон на панели задач или значков в трее, во-вторых проги эти требуют кряков, а их
искать лень 🙂 Поэтому я и написал классы для поддержки SOCKS5-серверов, которые я теперь могу заюзать
в какой-нибудь своей проге. И вот теперь хочу всем рассказать, как это делать.

То, к каким серверам и по каким протоколам мы может обращаться через прокси, зависит от
типа этого прокси, т. е. протокола, по которому мы обращаемся к нему. Типов проксей существует нескольно:
HTTP-proxies, SOCKS4, SOCKS5, SSL CONNECT и т.д. HTTP-proxy наиболее распространены, их легче всего найти и инете, но работают они только с HTTP, к тому
же могут вставлять в заголовки запроса адрес клиента, то есть быть
не анонимными. Протокол SOCKS наиболее примечателен тем, что он инкапсулирует протоколы не прикладного, а
транспортного уровня, т.е. TCP/IP и UDP/IP. Поскольку только по этим протоколам возможна работа в Сети,
через SOCKS можно работать с любыми серверами, в том числе и такими же SOCKS и,
таким образом, организовывать цепочки SOCKS-серверов. По этой же причине ВСЕ SOCKS-сервера анонимны — невозможно
на уровне TCP/IP и UDP/IP передать дополнительную информацию, не нарушив работу вышестоящего
протокола.

Мы остановимся на протоколе SOCKS5. Его описание лежит в
. Для SOCKS5 стандартным является порт 1080, но, впрочем, на этот
стандарт никто особого внимания не обращает. Каждое SOCKS-соединение проходит стадию аутентификации, если она требуется, затем клиент
посылает команду. Команда может быть одна из трех:
CONNECT — исходящее TCP-соединение с указанным адресом. Использование этой команды мы рассмотрим
подробнее, так как она нужна наиболее часто. BIND — открыть порт (сервер выбирает порт и посылает клиенту адрес и порт) и принять TCP соединение.
Серверу может понадобится знать, кто будет соннектиться. На этот случай нужно передать эту инфу. UDP ASSOCIATE — открыть UDP-порт (сервер выбирает порт). Данные, предназначенные для конечного
хоста и данные от него идут тоже по UDP. Данные в SOCKS5 передаются в бинарном виде, а не в текстовом, как в HTTP, SMTP, POP3 и др.

Описание протокола

Сконнектившись с сервером, клиент шлет пакет, в котором указана версия протокола и поддерживаемые
методы аутентификации. Этот пакет имеет следующий формат:

BYTE Version;
BYTE nMethods;
BYTE methods

Версия должна быть 5. Каждый элемент methods определяет не только метод аутентификации, но и способ шифрования данных,
если оно используется. Из этих методов сервер выбирает один. Можно указывать любое количество методов, но, если сервер не требует аутентификации, то никакие методы,
кроме 0x00 (не использовать ни аутентификацию, ни шифрование) не потребуются. В ответ сервер шлет пакет следующего содержания:

BYTE Version
BYTE method,

где method — выбранный сервером метод или 0xFF (ни один из предложенных методов не поддерживается). Если метод 0x00, то можно сразу посылать команду.

Пакет команды имеет следующий формат:

BYTE Version; // 5
BYTE Cmd ; // 1 — CONNECT
BYTE Reserved; // 0

BYTE addr;
WORD port; // Байты в сетевом порядке, т. е. htons(Port);

Если используется доменное имя, то сначала идет байт длины, а затем строка без завершающего нуля.

Сервер посылает ответ:

BYTE Version; // 5
BYTE Rep ; // 0 — Ok
BYTE Reserved; // 0
BYTE AType; // 1 — IPv4; 3 — domain name; 4 — IPv6
BYTE addr;
WORD port;

Здесь адрес и порт — это адрес и порт, видимые хосту. Возвращается, как правило, IP-адрес, а не доменное
имя. Этот адрес может отличаться от того, по которому мы обращаемся к серверу, особенно, если сервер
используется по назначению, т. е. для выхода из локалки в инет. Если Rep не ноль, т. е. ошибка, то закрываем соединение, в
противном случае работаем с хостом. Мы не используем шифрование, поэтому просто передаем и принимаем данные, как при обычном соединении. Если одна из сторон закроет соединение с socks-сервером, то он сразу же закроет соединение с другой
стороной. Одно socks-соединение инкапсулирует одно TCP-соединение или попытку его установления,
так что если использовать socks для анонимного сканирования портов, то эта
процедура может занять пол дня.

Кодинг

Поскольку socks инкапсулирует TCP, целесообразно сделать класс socks-соединения производным от
класса сокета, но MFCшный CSocket не подходит, т.к. у него все методы
не виртуальные. Напишем свой класс сокета и назовем его, скажем, CTSocket

#include

class CTSocket
{
public:





virtual void Close();
virtual unsigned long GetHost(); // Узнать свой адрес. Это тоже может понадобиться.

private:
SOCKET sock;
};

Реализацию этого класса каждый сможет написать сам (кто не знает как, RTFM MSDN), так что не буду ее
рассматривать. Теперь напишем класс socks-соединения. Он будет поддерживать только самый необходимый набор
функций: поддерживается только команда CONNECT, не поддерживается аутентификация и SOCKS-сервер
задается только IP-адресом, а не доменным именем. Больше в одной статье не поместится.

Class CSocksSocket: public CTSocket
{
public:
virtual BOOL CreateSocket();
virtual BOOL Connect(unsigned long ip, unsigned short port);
virtual BOOL Connect(LPCSTR name, unsigned short port);
virtual int Send(const char* str, int len);
virtual int Recv(char* buf, int max);
virtual BOOL Close();
virtual unsigned long GetHost();

CTSocket* pSocket;
unsigned long socks_ip;
unsigned short socks_port;

private:
char buffer; // Такого размера точно хватит
unsigned long l_ip; // Адрес, возвращаемый функцией
GetHost()

};

// Реализация
BOOL CSocksSocket::CreateSocket()
{
if (!pSocket->CreateSocket()) return FALSE;
if (!pSocket->Connect(socks_ip, socks_port)) return FALSE;
buffer = 5; // Ver
buffer = 1; // 1 method
buffer = 0; // no auth
pSocket->Send(buffer, 3);
int n = pSocket->Recv(buffer, 2);
if (n != 2) return FALSE;
method 0 not supported
return TRUE;
}

BOOL CSocksSocket::Connect(unsigned long ip, unsigned short port)
{
buffer = 5; // Ver
buffer = 1; // CONNECT
buffer = 0; // Reserved
buffer = 1; // IPv4
*((unsigned long*)(buffer + 4)) = ip;
*((unsigned short*)(buffer + 8)) = port;
pSocket->Send(buffer, 10);
int n = pSocket->Recv(buffer, 10);
if (n != 10) return FALSE;
if (buffer != 0) return FALSE; //
Can’t connect

return TRUE;
}

BOOL CSocksSocket::Connect(LPCSTR name, unsigned short port)
{
buffer = 5;
buffer = 1;
buffer = 0;
buffer = 3; // Domain name
int m = strlen(name);
buffer = m; //
Length byte
memcpy(buffer+5, name, m); //
Копируем строку без завершающего нуля
*((unsigned short*)(buffer + 5 + m)) = port;
pSocket->Send(buffer, m + 7);
int n = pSocket->Recv(buffer, 10);
if (n != 10) return FALSE;
if (buffer != 0) return FALSE;
if (buffer != 1) return FALSE; //
Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
l_ip = *((unsigned long*)(buffer + 4));
return TRUE;
}

int CSocksSocket::Send(const char* str, int len)
{
return pSocket->Send(str, len);
}

int CSocksSocket::Recv(char* buf, int max)
{
return pScoket->Recv(buf, max);
}

void CSocksSocket::Close()
{
pSocket->Close();
}

unsigned long CSocksSocket::GetHost()
{
return l_ip;
}

// Ну, а теперь тестовая прога
void main()
{
WSADATA wsadata;
CTSocket tsock;
CSocksSocket ssock(&tsock);

WSAStartup(MAKEWORD(2,2), &wsadata);

ssock.socks_ip = inet_addr(«10.10.10.10»); // Впишите сюда нужный адрес
ssock.socks_port = 1080; //
Впишите сюда порт

if (!ssock.CreateSocket()) return; // Can’t connect to socks
// or auth required
if (!ssock.Connect(«www.mail.ru», htons(80))) return; //
www.mail.ru
// is inaccessible
LPSTR q = «HEAD / HTTP/1.1\xD\xAHost: www.mail.ru:80\xD\xAUser-Agent: xakep\xD\xA\xD\xA»;
ssock.Send(q, strlen(q));

char buf;
int n = ssock.Recv(buf, 1000);
buf[n] = 0;
printf("%s", buf);

Доброго времени суток, дорогие друзья, знакомые, читатели, почитатели и прочие личности. В этой статье, как Вы поняли из заголовка, речь пойдет о том, что такое SOCKS сервер и зачем он вообще нужен.

Конечно, эта информация пригодится скорее интересующимся людям, чем рядовому пользователю, но и ему, в принципе, может пригодится знание таких вещей.. ибо кто знает как жизнь повернется.

Общее и подробное описание SOCKS

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

Он передает данные, полученные от первого клиента второму и обратно. В отличии от , через SOCKS прокси можно пустить любой трафик (скажем, ). Кроме того SOCKS передает "чистые" данные, не добавляя от себя ничего лишнего, поэтому его сложнее выявить.

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

Второе, зачем можно использовать эти сервера, - это для анонимности, а именно скрытия . В таком случае к удаленному интернет-серверу подключение устанавливаете не Вы, а SOCKS прокси, поэтому конечный сервер вряд ли получит какую-либо информацию о Вас и Вашем компьютере.

Послесловие

Вот такие дела. Надеюсь теперь Вам хотя бы примерно понятно, что это такое вообще и зачем оно в общем и целом может быть необходим.

О том, как конкретно работать с SOCKS и прочими прокси для скрытия своего IP будет написано в отдельной статье, если конечно она кому-то будет нужна и интересна.

Как и всегда, если остались какие-то вопросы, мысли, дополнения и всё такое прочее, то добро пожаловать в комментарии к этому материалу.

При работе с прокси очень важно выбрать правильный тип прокси под ваши задачи, чтобы избежать возможных проблем и достигнуть поставленных целей. Чаще всего используются HTTP прокси и Socks5 прокси. Отличия между ними заключаются в степени анонимности, используемому протоколу, способу передачи данных, используемых при работе прокси, а также в некоторых дополнительных функциях. Давайте разберём каждый тип прокси отдельно.

Особенности HTTP прокси

Начнём с HTTP прокси. При своей работе они используют HTTP протокол, который предназначен для посещения сайтов, загрузки и передачи файлов, и при работе с некоторыми программами, которые используют этот протокол для соединения через прокси. Запросы, выполняемые при работе с HTTP прокси серверами, не отправляются напрямую, а используют прокси сервер как посредника, отправляя запросы от его имени.

Также в HTTP протоколе прокси доступно кэширование, что ускоряет загрузку страниц за счёт использования сохранённых файлов, а ещё контроль и фильтрация сетевого трафика, установка ограничения скорости, блокирование нежелательных ресурсов, сбор статистики путём сохранения логов и.т.д.

Прокси этого протокола отличаются по степени анонимности. Выделяются следующие типы HTTP прокси по анонимности:

Прозрачные прокси, которые не маскируют настоящий IP адрес, а также не скрывают факт использование прокси сервера для доступа к ресурсу. Такие прокси используются редко, в основном, чтобы перенаправить пользователя на другой прокси сервер,

Анонимные Прокси. Передают информацию о том, что используются прокси, однако, ваш IP адрес маскируется и подменяется другим IP адресом, предоставляя надёжный уровень безопасности.

Элитные прокси. Скрывают использование прокси, а также надёжно маскируют IP адрес, что делает их самыми безопасными среди HTTP прокси. Сервер, к которому вы попытаетесь получить доступ будет считать, что ваше подключение осуществляется напрямую, без использования прокси сервера.

Отдельно стоит выделить HTTPS прокси, которые используют протокол SSL. Они представляют собой подвид HTTP протокола, который использует защищённое соединение. Сетевой трафик, передаваемый этими прокси надёжно зашифрован, что гарантирует высочайший уровень анонимности. Как правило, такие прокси используются для обеспечения безопасности банковских сетей, в коммерческих организациях для создания безопасных корпоративных сетей и в прочих подключениях, требующих безопасности. Остальные особенности такие же, как и у HTTP протокола.

Особенности Socks5 прокси

Другой протокол, который пользуются популярностью у пользователей - Socks5. Прокси сервера, работающие с этим протоколом изначально анонимны, поскольку они пропускают сетевой трафик в чистом виде, не раскрывая HTTP заголовков. Поэтому сервер, к которому вы пытаетесь получить доступ, не узнает о использовании прокси сервера, а также не получит ваш IP адрес.

Socks5 прокси, поддерживают следующие сетевые протоколы: HTTP, HTTPS, FTP и их особенности: кеширование, SSL соединение, аутентификация. Помимо этого, прокси протокола Socks5 используют UDP и TPC соединения, что расширяет сферу их применения и делает их наиболее функциональными из современных прокси серверов. Изначально Socks5 протокол предназначался для работы с программным обеспечением. По этой причине, большинство программ поддерживает этот протокол для подключения через прокси. А ещё прокси сервера Socks5 имеют приятную особенность, которая позволяет выстраивать цепочки из прокси серверов, что полезно для решения некоторых задач при работе в интернете.

Если сравнивать прокси HTTP и Socks5, то предпочтительней использовать вторые. Так как они анонимней, поддерживают больше функций, а также работают с любыми сайтами и программами, поддерживающие соединение через прокси. вы можете у нас на сайте, оформив заказ в личном кабинете.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: