강력한 Python 협력 동시성 프레임워크인 asyncio 로 구현된 SOCKS 프록시 서버입니다.
Python 버전 3.8.0 이상을 사용할 수 있는 경우 pip를 사용하여 설치합니다.
pip install asyncio-socks-server
또는 Docker Hub 레지스트리에서 Docker 이미지를 가져옵니다.
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인 경우, 즉 사용자 이름/비밀번호 인증을 지정한 경우 --config
옵션을 사용하여 사용자 이름과 비밀번호를 json 형식으로 포함하는 구성 파일을 제공해야 합니다. 다음 명령 대신 구성 파일에 다른 옵션을 나열할 수도 있습니다.
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_
참고: 옵션의 로드 순서는 구성 파일, 환경 변수, 명령 옵션입니다. 옵션이 여러 가지 방법으로 제공되면 후자가 전자를 덮어씁니다.
또는 docker 이미지를 사용하는 경우 다음 명령을 사용하여 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]
asyncio-socks-server는 여러 포트를 동적으로 사용하므로 네트워크 모드 host
권장합니다. 구성 파일도 제공하려면 수동으로 마운트해야 합니다.
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 데이터그램을 보내는 데 사용할 것으로 예상되는 주소와 포트가 포함되어 있으며, 클라이언트가 이 정보를 보유하지 않은 경우 모두 0인 포트 번호와 주소를 사용합니다. 따라서 클라이언트가 NAT를 사용하는 네트워크에서 작업하는 경우 오류를 방지하려면 모두 0인 DST.ADDR을 사용해야 합니다. 그러나 일부 클라이언트가 이 원칙을 올바르게 따르지 않는 경우 asyncio-socks-server는 DST.ADDR 및 DST.PORT를 사용하여 액세스를 제한하는 대신 기본적으로 수신하는 모든 UDP 데이터그램을 중계합니다.
클라이언트가 협상 중에 사용자 이름/비밀번호 인증을 선택하면 서버와 하위 협상을 수행합니다. 이 하위 협상은 클라이언트가 요청을 생성하는 것으로 시작됩니다.
+----+------+----------+------+----------+
|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