Server proksi SOCKS diimplementasikan dengan kerangka konkurensi kooperatif python yang kuat, asyncio .
Instal dengan pip jika Python versi 3.8.0 atau lebih tinggi tersedia.
pip install asyncio-socks-server
Atau tarik image buruh pelabuhan dari registri Docker Hub.
docker pull amaindex/asyncio-socks-server
Saat diinstal dengan pip, Anda dapat memanggil asyncio-socks-server dari baris perintah:
asyncio_socks_server [-h] [-v]
[-H HOST] [-P PORT] [-A METHOD]
[--access-log] [--debug] [--strict]
[--env-prefix ENV_PREFIX]
[--config PATH]
Di mana:
asyncio_socks_server
: Anda dapat menggunakan python -m asyncio_socks_server dalam pengembangan.-h
, --help
: Menampilkan pesan bantuan dan keluar.-v
, --version
: Tampilkan nomor versi program dan keluar.-H HOST
, --host HOST
: Alamat host untuk mendengarkan (default 0.0.0.0).-P PORT
, --port PORT
: Port untuk mendengarkan (default 1080).-A METHOD
, --auth METHOD
: Metode otentikasi (default 0). Nilai yang mungkin: 0 (tanpa autentikasi), 2 (autentikasi nama pengguna/kata sandi)--access-log
: Menampilkan log akses.--debug
: Bekerja dalam mode debug.--strict
: Bekerja dengan kepatuhan ketat terhadap RFC1928 dan RFC1929. Jika nilai METHOD
adalah 2, yaitu ketika otentikasi nama pengguna/kata sandi ditentukan, Anda perlu menyediakan file konfigurasi yang berisi nama pengguna dan kata sandi dalam format json dengan opsi --config
. Anda juga dapat mencantumkan opsi lain di file konfigurasi selain perintah:
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
Selain itu, variabel lingkungan apa pun yang diberi nama dimulai dengan AIOSS_
juga akan diterapkan ke opsi tersebut. Awalan dapat diubah dengan menentukan opsi --env-prefix
, misalnya:
export MY_LISTEN_HOST=127.0.0.1
export MY_LISTEN_PORT=9999
asyncio_socks_server --env-prefix MY_
CATATAN: Urutan pemuatan opsi adalah: file konfigurasi, variabel lingkungan, opsi perintah. Yang terakhir akan menimpa yang pertama jika pilihan diberikan dalam berbagai cara.
Alternatifnya, jika Anda menggunakan image buruh pelabuhan, Anda dapat meluncurkan server asyncio-socks dengan perintah berikut:
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
mode jaringan direkomendasikan karena server asyncio-socks menggunakan beberapa port secara dinamis. Jika Anda juga ingin memberikan file konfigurasi, sebaiknya dipasang secara manual.
docker run
--rm
--net=host
-v /host/path/config.json:/config.json
amaindex/asyncio-socks-server
--config /config.json
Karena berbagai alasan, asyncio-socks-server telah membuat beberapa kompromi pada detail implementasi protokol. Oleh karena itu, dalam adegan berikut, perilaku server asyncio-socks akan berbeda dari yang dijelaskan dalam RFC1928 dan RFC1929.
Dalam negosiasi SOCKS5, permintaan UDP ASSOCIATE yang dibentuk sebagai berikut digunakan untuk membuat asosiasi dalam proses relai UDP untuk menangani datagram UDP:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
Biasanya, bidang DST.ADDR dan DST.PORT berisi alamat dan port yang diharapkan klien gunakan untuk mengirim datagram UDP untuk asosiasi, atau menggunakan nomor port dan alamat nol jika klien tidak memiliki informasi ini. Oleh karena itu, ketika klien bekerja di jaringan yang menggunakan NAT, DST.ADDR dengan semua nol harus digunakan untuk menghindari kesalahan. Namun jika beberapa klien tidak mengikuti prinsip ini dengan benar, asyncio-socks-server meneruskan semua datagram UDP yang diterimanya secara default alih-alih menggunakan DST.ADDR dan DST.PORT untuk membatasi akses.
Setelah klien memilih otentikasi nama pengguna/kata sandi selama negosiasi, klien akan melakukan sub-negosiasi dengan server. Sub-negosiasi ini dimulai dengan klien mengajukan permintaan:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
Bidang VER berisi versi sub-negosiasi saat ini, yaitu X'01' namun sering dianggap sebagai X'05' karena agak kontra-intuitif. Jadi asyncio-socks-server mengizinkan permintaan dengan VER X'05' dalam mode non-ketat.
--strict
Untuk menonaktifkan kompromi yang dijelaskan di atas, Anda dapat menentukan opsi --strict
:
asyncio_socks_server --strict