Обзор библиотеки проксирования

Описание особенностей библиотеки проксирования libsocks

О SOCKS
Как настроить клиент для использования SOCKS
Как использовать SOCKS

О SOCKS

SOCKS - это пакет, состоящий из прокси-сервера, клиентских программ и библиотеки (libsocks) для адаптации ваших приложений в клиентские прокси-программы.

Изначально, SOCKS был написан David Koblas. Протокол SOCKS с тех пор претерпел изменения. Клиентская библиотека, поставляемая с момента печати, соответствует SOCKS v4.2. Поскольку сервер и клиенты должны использовать один и тот же протокол SOCKS, эта библиотека не работает с серверами предыдущих версий; клиенты, скомпилированные с этими библиотеками, не будут работать со старыми серверами.

Как настроить клиент для использования SOCKS


Note: Если ваш клиент использует UDP для передачи данных, вы не сможете использовать SOCKS. Чтобы узнать, использует ли ваш клиент UDP, найдите упоминание «SOCK_DGRAM» в исходном коде.

  1. Внутри или в самом начале функции main(), вы можете добавить вызов SOCKSinit(). Вы можете также и пропустить данный шаг; единственной причиной для прямого вызова SOCKSinit() является указание имени программы для отладочных сообщений из SOCKS клиента (вместо строки “SOCKSclient” по умолчанию).

  2. Добавьте следующие флаги компиляции:

    -Dconnect=Rconnect -Dgetsockname=Rgetsockname \ -Dbind=Rbind -Daccept=Raccept -Dlisten=Rlisten \ -Drcmd=Rrcmd -Dselect=Rselect

    При использовании Makefile, добавьте данные флаги к определению макроса CFLAGS.

    Эти флаги заменяют вызовы определенных функций аналогами, использующими сервер SOCKS:

    Не SOCKS функция: SOCKS функция:
    accept() Raccept()
    bind() Rbind()
    connect() Rconnect()
    getsockname() Rgetsockname()
    listen() Rlisten()
    rcmd() Rrcmd()
    select() Rselect()

  3. Слинкуйте библиотеку SOCKS путем добавления -l socks в параметры линковки.

    При использовании Makefile, добавьте данный флаг к определению макроса LDFLAGS.

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

Как использовать SOCKS

Библиотека SOCKS охватывает только некоторые функции сокетов, которые должны вызываться в определенном порядке:


Note: Необходимо использовать TCP сокеты; SOCKS не поддерживает UDP.

  1. Первая вызываемая функция должна быть либо connect() либо rcmd().

  2. При вызове connect() для неблокирующегося сокета, никакие операции ввода/вывода не могут происходить до следующего вызова connect() с теми же аргументами, возваратом -1 и установкой errno в EISCONN. Это требуется даже в том случае, если вызвать select() на запись, чтобы проверить готовность данного сокета.


    Note: Пока соединение еще не установлено, не пытайтесь запустить другое соединение через connect(), или начать новую последовательность через bind(), getsockname(), listen() и accept().

  3. Необходимо вызвать bind() после успешного вызова connect() для хоста конкретной службы.

  4. После вызова bind() должны последовать вызовы getsockname(), listen() и accept(), строго в данном порядке.

Большинство клиентских программ очень хорошо соответствуют этим предположениям и могут быть приведены к SOCKS без изменения кода, используя шаги, описанные в Как настроить клиент для использования SOCKS.

Некоторые клиентские программы вызывают bind() перед каждым connect(). Если bind() используется для запроса определенного порта или определенного сетевого интерфейса, то текущая реализация библиотеки SOCKS не может обеспечить данное использование. Хотя довольно часто, такой вызов bind() присутствует без единой на то причины и может быть удален без последствий.




Предыдущий раздел: Описание API библиотеки asyncmsg