Прокси-сервер SOCKS, реализованный с помощью мощной инфраструктуры совместного параллелизма Python asyncio .
Установите с помощью pip, если доступен Python версии 3.8.0 или выше.
pip install asyncio-socks-server
Или извлеките образ Docker из реестра Docker Hub.
docker pull amaindex/asyncio-socks-server
При установке с помощью pip вы можете вызвать asyncio-socks-server из командной строки:
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
где:
asyncio_socks_server
: вы можете использовать python -m asyncio_socks_server при разработке.-h
, --help
: показать справочное сообщение и выйти.-v
, --version
: показать номер версии программы и выйти.-H HOST
, --host HOST
: адрес хоста для прослушивания (по умолчанию 0.0.0.0).-P PORT
, --port PORT
: порт для прослушивания (по умолчанию 1080).-A METHOD
, --auth METHOD
: метод аутентификации (по умолчанию 0). Возможные значения: 0 (без аутентификации), 2 (авторизация по имени пользователя и паролю).--access-log
: Показать журнал доступа.--debug
: Работа в режиме отладки.--strict
: работать в строгом соответствии с RFC1928 и RFC1929. Если значение METHOD
равно 2, то есть когда указана аутентификация по имени пользователя и паролю, вам необходимо предоставить файл конфигурации, содержащий имена пользователей и пароли в формате json, с опцией --config
. Вы также можете указать другие параметры в файле конфигурации вместо команды:
config.json
:
{
"LISTEN_HOST" : " 0.0.0.0 " ,
"LISTEN_PORT" : 1080 ,
"AUTH_METHOD" : 2 ,
"ACCESS_LOG" : true ,
"DEBUG" : true ,
"STRICT" : true ,
"USERS" : {
"username1" : " password1 " ,
"username2" : " password2 " ,
"username3" : " password3 "
}
}
asyncio_socks_server --config ${ENV} /config.json
Кроме того, к этому параметру также будет применена любая переменная среды, имя которой начинается с AIOSS_
. Префикс можно изменить, указав опцию --env-prefix
, например:
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
ПРИМЕЧАНИЕ. Порядок загрузки параметров следующий: файл конфигурации, переменные среды, параметры команды. Последний перезапишет первый, если параметры заданы несколькими способами.
Альтернативно, если вы используете образ докера, вы можете запустить asyncio-socks-server с помощью следующей команды:
docker run amaindex/asyncio-socks-server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
Рекомендуется использовать host
в сетевом режиме, поскольку asyncio-socks-server динамически использует несколько портов. Если вы также хотите предоставить файл конфигурации, его следует смонтировать вручную.
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
По разным причинам asyncio-socks-server пошел на некоторые компромиссы в деталях реализации протоколов. Поэтому в следующих сценах поведение asyncio-socks-server будет отличаться от описанного в RFC1928 и RFC1929.
При согласовании SOCKS5 запрос UDP ASSOCIATE, сформированный следующим образом, используется для установления ассоциации в процессе ретрансляции UDP для обработки дейтаграмм UDP:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
Обычно поля DST.ADDR и DST.PORT содержат адрес и порт, которые клиент планирует использовать для отправки датаграмм UDP для ассоциации, или используйте номер порта и адрес, состоящий только из нулей, если клиент не обладает этой информацией. Поэтому, когда клиент работает в сети, использующей NAT, во избежание ошибок следует использовать DST.ADDR со всеми нулями. Но в случае, если некоторые клиенты не следуют этому принципу правильно, asyncio-socks-server по умолчанию ретранслирует все полученные UDP-датаграммы вместо использования DST.ADDR и DST.PORT для ограничения доступа.
Как только клиент выбирает аутентификацию по имени пользователя и паролю во время согласования, он проведет дополнительное согласование с сервером. Это дополнительное согласование начинается с того, что клиент создает запрос:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
Поле VER содержит текущую версию дополнительного согласования, то есть X'01', но часто рассматривается как X'05', поскольку это немного нелогично. Таким образом, asyncio-socks-server разрешает запросы с VER X'05' в нестрогом режиме.
--strict
опция Чтобы отключить описанную выше компрометацию, вы можете указать опцию --strict
:
asyncio_socks_server --strict