強力な 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 の場合、つまりユーザー名/パスワード認証が指定されている場合は、ユーザー名とパスワードを含む構成ファイルを 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_
注:オプションのロード順序は、構成ファイル、環境変数、コマンド オプションです。オプションが複数の方法で指定されている場合、後者は前者を上書きします。
あるいは、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 を使用するネットワークで動作している場合は、エラーを避けるためにすべてゼロの 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