使用強大的 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]
建議使用網路模式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的網路中時,應該使用全0的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