ساکس net.socks
SOCKS4، SOCKS4a و SOCKS5: کارخواه با ورود، BIND و UDP ASSOCIATE، کارساز با کاربر، قاعدههای دسترسی و راه جایگزینپذیر رسیدن به مقصد، و یک اتصالدهنده برای زنجیرهی پراکسی.
واردسازی شبکه.ساکس
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
SOCKS پروتکل پراکسی ساده و بسیار پشتیبانیشده است: برنامه از پراکسی میخواهد از طرف او به جایی وصل شود و سپس از راه آن اتصال مثل اتصال مستقیم حرف میزند. این بسته هر دو سمت را دارد. اتصال کارخواه است؛ شروع یک کارساز راه میاندازد. به تونل هم وصل میشود: به شکل ورودی ساکس۵ یا ورودی ساکس۴ که میتواند یک درگاه را با پراکسی HTTP شریک شود، و به شکل رابط ساکس که یک گام از زنجیرهی پراکسی است. برای دیدن اینکه تکهها در یک برنامه چگونه کنار هم مینشینند، ساختن برنامهای به سبک v2ray یا VPN را بخوانید.
ایدههای اصلی:
- کارخواه یک مقدار است:
کلاینت جدیدیاکلاینت جدید با احراز هویتیککلاینتپر میکند واتصالیکنتیجه اتصالبا یک جریان برمیگرداند. شکست هم مقدار است:موفقنادرست است وکدوخطادلیل را میگویند. - پیشفرض SOCKS5 است. برای کارسازهای قدیمیتر
نسخهراساکس۴یاساکس۴ایبگذارید. SOCKS4 نشانی IPv4 میفرستد؛ SOCKS4a میگذارد کارساز نام را حل کند. - نامی که به پراکسی SOCKS5 یا SOCKS4a فرستاده شود را پراکسی حل میکند، پس جستجو روی دستگاه شما انجام نمیشود.
- کارساز یک
پیکربندی سروراست که بهشروعداده میشود. شیوهی رسیدنش به مقصدها یک تابع بازخوان (تعیین اتصال به مقصد) یا یکتونل.شمارهگیر(تعیین شمارهگیر) است، و همینطور به قاعدههای مسیریابی و زنجیرهی پراکسی وصل میشود. ایجاد نشست یو دی پییک رلهی UDP باز میکند وپیوند درخواستمنتظر یک اتصال ورودی میماند. هر دو ویژگی SOCKS5 هستند که کارساز میتواند خاموششان کند.
چیزهایی که آدم را گیر میاندازد:
- کارساز روی
bind_hostگوش میدهد که پیشفرضش127.0.0.1است.0.0.0.0(یا یک نشانی) را فقط عمداً بدهید. کارساز SOCKS بدون ورود که از بیرون در دسترس باشد یک پراکسی باز است و هر کسی میتواند از آن سوءاستفاده کند. کاربر الزامی کنید (افزودن کاربر)، با دیوار آتش محدودش کنید یا پشت تونل بگذارید. - ورود رمزشده نیست. نام کاربری و گذرواژهی SOCKS5 به شکل متن ساده میرود. آن را روی درگاه محلی یا از راه تونل رمزشده به کار ببرید، یا وقتی پراکسی روی TLS در دسترس است
امنرا بگذارید. سمت کارساز این بسته فقط TCP ساده حرف میزند. - SOCKS4 گذرواژه ندارد. کارسازی که ورود بخواهد کارخواههای SOCKS4 را رد میکند و
اجازه ساکس۴میتواند SOCKS4 را خاموش کند. اجازه پیوندبهطور پیشفرض خاموش است چون BIND پراکسی را وادار میکند برای کارخواه درگاهی باز کند و رلهی UDP هم همین را با یک درگاه UDP میکند. این سوکتها هم بهbind_hostبسته میشوند و همان نشانی به کارخواه گزارش میشود.- UDP قطعه ندارد. فقط قطعهی ۰ پشتیبانی میشود و UDP روی SOCKS4 وجود ندارد.
- IPv6 سرتاسر کار میکند. CONNECT و BIND در TCP و رلهی UDP هدفهای IPv6 (نوع نشانی ۴) را میبرند و سرور میتواند روی
::1یا روی::برای هر دو خانواده گوش دهد. رلهی UDP بسته به نشانی IPv4 هم با یک سوکت خروجی دوم به هدفهای IPv6 میرسد. SOCKS4 همچنان IPv4 است. - جریانها را ببندید.
جریانیک اتصال باز است. پایان کار ببندیدش.
استفاده از پراکسی SOCKS در برنامه
برای پراکسی یک کارخواه بسازید، به یک مقصد وصل شوید و از جریان استفاده کنید. پراکسی اینجا یک کارساز محلی است تا نمونه هرجا اجرا شود؛ در کار واقعی نشانی پراکسیای است که به آن اعتماد دارید.
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع ریشه:
target := start_echo()
ناپایا proxy_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(proxy_cfg، درست)
proxy := ساکس.شروع(proxy_cfg)
client := ساکس.کلاینت جدید("127.0.0.1"، proxy.درگاه)
result := ساکس.اتصال(client، "127.0.0.1"، target)
اگر وارونه result.موفق:
سرچاپ "پراکسی نپذیرفت:"، result.کد، result.خطا
برگشت
پایان
result.جریان.نوشتن("hello from behind the proxy")
سرچاپ result.جریان.خواندن(100)
result.جریان.بستن()
ساکس.توقف(proxy)
پایانشمارهگیری اتصال همین کار را میکند ولی یک اتصال TCP ساده برمیگرداند، برای کدی که از پیش از net.tcp استفاده میکند. برای پراکسیای که ورود میخواهد کلاینت جدید با احراز هویت را به کار ببرید. برای عبور از دو پراکسی پشت هم تونل.زنجیره و نمونهی زنجیرهی پایین را ببینید.
راه انداختن کارساز SOCKS
پیکربندی سرور جدید پیکربندی یک درگاه را میدهد؛ افزودن کاربر ورود را روشن میکند؛ شروع درگاه را میبندد و بیدرنگ برمیگردد و توقف پایانش میدهد. شیوهی رسیدن کارساز به مقصد بخشی است که معمولا تغییرش میدهید: اتصال مستقیم را برای پراکسی ساده بگذارید، با تعیین اتصال به مقصد یک تابع بازخوان برای مسیریابی با نام بگذارید، یا با تعیین شمارهگیر یک تونل.شمارهگیر بدهید تا از قاعدهها، زنجیرهها و فهرستهای مسدود تونل استفاده کند. اجازه میتواند پیش از هر اتصال، فرمان، میزبان یا درگاه را رد کند.
برای گذاشتن SOCKS روی همان درگاه پراکسی HTTP، به جای صدا زدن شروع یک ورودی ساکس۵ را به یک تونل.پروتکل ترکیبی بدهید. رسیدگی یک جریان تکی را که خودتان پذیرفتهاید سرویس میدهد.
ناپایا config := ساکس.پیکربندی سرور جدید(1080)
ساکس.افزودن کاربر(config، "alice"، "یک گذرواژهی بلند و تصادفی")
server := ساکس.شروع(config)
اگر وارونه server.موفق:
سرچاپ "درگاه ۱۰۸۰ مشغول است"
پایان
چه باید دانست
- کارساز روی
bind_host(بهطور پیشفرض loopback) گوش میدهد. ورود یا دیوار آتش به کار ببرید، هرگز پراکسی باز نگذارید. - ورود متن ساده است. SOCKS4 اصلا ورود ندارد.
- در SOCKS5 و SOCKS4a نام را پراکسی حل میکند و در SOCKS4 کارخواه.
شروعحلقهی پذیرش را روی نخ خودش اجرا میکند؛ اتصالها روی نخهای دیگر.توقففقط کارخواههای تازه را میایستاند.- رمزگشاها (
رمزگشایی درخواست،رمزگشایی پاسخ،رمزگشایی درخواست ساکس۴،رمزگشایی نشانی) بایتهای مصرفشده، ۰ برای «دادهی بیشتر لازم است» و ۱- برای نامعتبر را برمیگردانند، پس روی بافر در حال رشد کار میکنند. - هیچ گزارشی خودکار نوشته نمیشود.
گونهها
کلاینت Client
ساختار کلاینتکلاینت جدید یا کلاینت جدید با احراز هویت ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نسخه | version | صحیح = 5 | ساکس۵، ساکس۴ یا ساکس۴ای. پیشفرض SOCKS5 است. |
| میزبان | host | رشته = "" | نام میزبان یا IP کارساز پراکسی. |
| درگاه | port | صحیح = 0 | درگاه کارساز پراکسی. |
| نام کاربری | username | رشته = "" | نام کاربری برای SOCKS5 (یا فیلد شناسهی کاربر در SOCKS4). |
| گذرواژه | password | رشته = "" | گذرواژه برای SOCKS5. فقط وقتی نام کاربری هست فرستاده میشود. |
| مهلت میلیثانیه | timeout_ms | صحیح = 10000 | اتصال و دستدهی چند میلیثانیه میتواند طول بکشد. پیشفرض ۱۰۰۰۰. |
| امن | tls | منطقی = نادرست | درست یعنی نخست اتصال به پراکسی در TLS پیچیده شود (SOCKS روی TLS). پیشفرض نادرست. |
| نام سرور | server_name | رشته = "" | نامی که وقتی امن روشن است در گواهی پراکسی فرستاده و بررسی میشود. خالی یعنی همان میزبان. |
| بدون اعتبارسنجی | insecure | منطقی = نادرست | درست یعنی بررسی گواهی نادیده گرفته شود. فقط برای آزمون. |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع say(label: رشته، r: ساکس.نتیجه اتصال):
سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان
تابع ریشه:
echo := start_echo()
ناپایا server_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(server_cfg، درست)
server := ساکس.شروع(server_cfg)
سرچاپ "server up:"، server.موفق
client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
سرچاپ client.نسخه برابر ساکس.ساکس۵، client.مهلت میلیثانیه، client.امن
r := ساکس.اتصال(client، "127.0.0.1"، echo)
say("connect"، r)
r.جریان.نوشتن("hello through socks5")
سرچاپ r.جریان.خواندن(100)
r.جریان.بستن()
by_name := ساکس.اتصال(client، "localhost"، echo)
by_name.جریان.نوشتن("by name")
سرچاپ by_name.جریان.خواندن(100)
by_name.جریان.بستن()
conn := ساکس.شمارهگیری اتصال(client، "127.0.0.1"، echo)
تی سی پی.نوشتن(conn، "plain tcp conn")
سرچاپ تی سی پی.خواندن(conn، 100)
تی سی پی.بستن(conn)
say("refused"، ساکس.اتصال(client، "127.0.0.1"، تی سی پی.درگاه آزاد()))
say("no such host"، ساکس.اتصال(client، "no-such-host.invalid"، 80))
ساکس.توقف(server)
پایاننتیجه دستدهی HandshakeResult
ساختار نتیجه دستدهی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی کارساز درخواست را پذیرفت. |
| کد | code | صحیح = 0 | کد پاسخ، کد موفق و خانوادهی کد ساکس۴ پذیرفته را ببینید. |
| خطا | err | رشته = "" | دلیل خوانا در صورت شکست. |
| نشانی محلی | bound | نشانی | نشانیای که کارساز گزارش میدهد: آنچه بسته (برای BIND) یا آنچه از آن وصل شده. |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع ریشه:
echo := start_echo()
ناپایا first_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(first_cfg، درست)
first := ساکس.شروع(first_cfg)
ناپایا second_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(second_cfg، درست)
second := ساکس.شروع(second_cfg)
hop := ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، first.درگاه)، "127.0.0.1"، second.درگاه)
سرچاپ "first hop:"، hop.موفق
onward := ساکس.دستدهی کلاینت(hop.جریان، ساکس.کلاینت جدید(""، 0)، ساکس.فرمان اتصال، "127.0.0.1"، echo)
سرچاپ "second hop:"، onward.موفق
hop.جریان.نوشتن("through two proxies")
سرچاپ hop.جریان.خواندن(100)
hop.جریان.بستن()
ناپایا chain := تونل.زنجیره جدید(تونل.مستقیم())
تونل.افزودن گام(chain، ساکس.رابط جدید(ساکس.کلاینت جدید("127.0.0.1"، first.درگاه)))
تونل.افزودن گام(chain، ساکس.رابط جدید(ساکس.کلاینت جدید("127.0.0.1"، second.درگاه)))
سرچاپ chain.نام()
s := chain.اتصال(تونل.نشانی جدید("127.0.0.1"، echo))
s.نوشتن("same thing with a chain")
سرچاپ s.خواندن(100)
s.بستن()
connector := ساکس.رابط جدید(ساکس.کلاینت جدید("127.0.0.1"، first.درگاه))
سرچاپ connector.نام()، connector.کارساز().متن() برابر "127.0.0.1:" + first.درگاه
ساکس.توقف(first)
ساکس.توقف(second)
پایاننتیجه اتصال ConnectResult
ساختار نتیجه اتصالاتصال یا پیوند درخواست: جریان در صورت موفقیت و دلیل در غیر این صورت.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی پراکسی شما را به مقصد وصل کرد. |
| کد | code | صحیح = 0 | کد پاسخ. |
| خطا | err | رشته = "" | دلیل خوانا در صورت شکست. |
| جریان | stream | dyn تونل.جریان | جریان باز به مقصد (از راه پراکسی). وقتی موفق درست است معتبر است. |
| نشانی محلی | bound | نشانی | نشانیای که پراکسی گزارش میدهد. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
نشست یو دی پی UDPSession
ساختار نشست یو دی پیایجاد نشست یو دی پی ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی نشست ساخته شد. |
| خطا | err | رشته = "" | دلیل خوانا اگر ساخته نشد. |
| کنترل | control | dyn تونل.جریان | اتصال TCP که نشست را زنده نگه میدارد. بستنش نشست را پایان میدهد. |
| سوکت | sock | یو دی پی.سوکت یو دی پی | سوکت UDP که برای فرستادن و گرفتن دیتاگرام به کار میرود. |
| میزبان رله | relay_host | رشته = "" | نشانی رلهای که پراکسی داد. |
| درگاه رله | relay_port | صحیح = 0 | درگاه رلهای که پراکسی داد. |
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.ساکس
واردسازی شبکه.یو دی پی
واردسازی رشته
تابع udp_echo(arg: صحیح۶۴):
s := یو دی پی.سوکت یو دی پی { توصیفگر = arg }
buf := حافظه.تخصیص(2048 برگردان طبیعی۶۴)
تا درست:
ناپایا host := ""
ناپایا port := 0
n := یو دی پی.دریافت بایت(s، buf، 2048، host، port)
اگر n کوچکتر 0:
بشکن
پایان
یو دی پی.ارسال بایت(s، host، port، buf، n)
پایان
پایان
تابع ریشه:
echo := یو دی پی.پیوند(0)
echo_port := یو دی پی.درگاه(echo)
ساکس.برو(udp_echo، echo.توصیفگر برگردان تهی*)
ناپایا server_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(server_cfg، درست)
server := ساکس.شروع(server_cfg)
client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
session := ساکس.ایجاد نشست یو دی پی(client)
سرچاپ "associated:"، session.موفق، session.میزبان رله
ساکس.تنظیم مهلت یو دی پی(session، 2000)
سرچاپ "sent:"، ساکس.ارسال یو دی پی(session، "127.0.0.1"، echo_port، "datagram one")
buf := حافظه.تخصیص(1024 برگردان طبیعی۶۴)
ناپایا from := ساکس.نشانی {}
n := ساکس.دریافت بایت یو دی پی(session، buf، 1024، from)
سرچاپ "received:"، n، "from"، from.میزبان، from.درگاه برابر echo_port
(buf برگردان طبیعی۸*)[n] = 0 برگردان طبیعی۸
سرچاپ رشته.رونوشت(buf برگردان رشته)
سرچاپ "bytes sent:"، ساکس.ارسال بایت یو دی پی(session، "127.0.0.1"، echo_port، "raw" برگردان تهی*، 3)
حافظه.آزادسازی(buf)
ساکس.بستن نشست یو دی پی(session)
ناپایا four := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
four.نسخه = ساکس.ساکس۴
سرچاپ "socks4 has no udp:"، ساکس.ایجاد نشست یو دی پی(four).موفق
ساکس.توقف(server)
پایانخروجی Outbound
ساختار خروجی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی به مقصد رسید. |
| کد | code | صحیح = 1 | کد پاسخ SOCKS که به کارخواه داده میشود. پیشفرض ۱، شکست کلی. |
| خطا | err | رشته = "" | دلیل خوانا، برای گزارشها. |
| جریان | stream | dyn تونل.جریان | جریان به مقصد وقتی موفق درست است. |
| نشانی محلی | bound | نشانی | نشانی محلی اتصال خروجی که به کارخواه گزارش میشود. |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع say(label: رشته، r: ساکس.نتیجه اتصال):
سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان
تابع ریشه:
echo := start_echo()
ناپایا routed := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(routed، درست)
ساکس.تعیین اتصال به مقصد(routed، (host: رشته، _port: صحیح): اگر host برابر "echo.internal": برگشت ساکس.اتصال مستقیم("127.0.0.1"، echo، 2000) پایان برگشت ساکس.خروجی { موفق = نادرست، کد = ساکس.کد شبکه در دسترس نیست، خطا = "no route" } پایان)
routed_server := ساکس.شروع(routed)
client := ساکس.کلاینت جدید("127.0.0.1"، routed_server.درگاه)
say("known name"، ساکس.اتصال(client، "echo.internal"، 1))
say("unknown name"، ساکس.اتصال(client، "other.internal"، 1))
ساکس.توقف(routed_server)
ناپایا acl := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(acl، درست)
acl.اجازه = (cmd: صحیح، _host: رشته، port: صحیح): برگشت وارونه (cmd برابر ساکس.فرمان اتصال و port برابر 25) پایان
acl_server := ساکس.شروع(acl)
acl_client := ساکس.کلاینت جدید("127.0.0.1"، acl_server.درگاه)
say("allowed"، ساکس.اتصال(acl_client، "127.0.0.1"، echo))
say("port 25"، ساکس.اتصال(acl_client، "127.0.0.1"، 25))
ساکس.توقف(acl_server)
ناپایا blocked := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(blocked، درست)
ساکس.تعیین شمارهگیر(blocked، تونل.مسدود())
blocked_server := ساکس.شروع(blocked)
say("block dialer"، ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، blocked_server.درگاه)، "127.0.0.1"، echo))
ساکس.توقف(blocked_server)
ناپایا direct := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(direct، درست)
ساکس.تعیین شمارهگیر(direct، تونل.مستقیم())
direct_server := ساکس.شروع(direct)
say("direct dialer"، ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، direct_server.درگاه)، "127.0.0.1"، echo))
ساکس.توقف(direct_server)
پایانآمار رله RelayStats
ساختار آمار رلهرله در هر جهت چند بایت جابهجا کرد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| از اول به دوم | a_to_b | صحیح۶۴ = 0 | بایتها از جریان اول به دوم. |
| از دوم به اول | b_to_a | صحیح۶۴ = 0 | بایتها از جریان دوم به اول. |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تونل
واردسازی استخر
تابع job(a: پویا تونل.جریان، b: پویا تونل.جریان):
stats := ساکس.رله(a، b، 2000)
سرچاپ "relayed"، stats.از اول به دوم، stats.از دوم به اول
پایان
تابع ریشه:
near := تونل.لوله جدید()
far := تونل.لوله جدید()
client := تونل.سر اول لوله(near)
left := تونل.سر دوم لوله(near)
right := تونل.سر اول لوله(far)
server := تونل.سر دوم لوله(far)
workers := استخر.جدید کشسان(1 برگردان صحیح۶۴، 2 برگردان صحیح۶۴، 2 برگردان صحیح۶۴)
استخر.ارسال(workers، (): job(left، right) پایان)
client.نوشتن("hello")
سرچاپ server.خواندن(100)
server.نوشتن("world!")
سرچاپ client.خواندن(100)
client.بستن()
استخر.انتظار(workers)
استخر.توقف(workers)
پایاننشانی Address
ساختار نشانی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نوع | kind | صحیح = 0 | نوع آیپی۴، نوع دامنه یا نوع آیپی۶. |
| میزبان | host | رشته = "" | نام میزبان یا متن IP. |
| درگاه | port | صحیح = 0 | درگاه. |
// زبان: فارسی
واردسازی شبکه.ساکس
تابع ریشه:
methods := وکتور {} برگردان وکتور<طبیعی۸>
methods.بیفزا(0 برگردان طبیعی۸)
methods.بیفزا(2 برگردان طبیعی۸)
سرچاپ "greeting "، ساکس.به هگز(ساکس.رمزگذاری سلام(methods))
سرچاپ "choice "، ساکس.به هگز(ساکس.رمزگذاری انتخاب روش(ساکس.احراز هویت نام کاربری))
سرچاپ "auth "، ساکس.به هگز(ساکس.رمزگذاری درخواست احراز هویت("alice"، "pw"))
سرچاپ "auth ok "، ساکس.به هگز(ساکس.رمزگذاری پاسخ احراز هویت(درست))
target := ساکس.نشانی جدید("example.com"، 443)
سرچاپ target.نوع برابر ساکس.نوع دامنه، ساکس.دستهبندی میزبان("10.1.2.3") برابر ساکس.نوع آیپی۴، ساکس.دستهبندی میزبان("::1") برابر ساکس.نوع آیپی۶
request := ساکس.رمزگذاری درخواست(ساکس.فرمان اتصال، target)
سرچاپ "request "، ساکس.به هگز(request)
ناپایا parsed := ساکس.درخواست {}
سرچاپ ساکس.رمزگشایی درخواست(request، parsed)، parsed.فرمان برابر ساکس.فرمان اتصال، parsed.نشانی.میزبان، parsed.نشانی.درگاه
ناپایا partial := وکتور {} برگردان وکتور<طبیعی۸>
تکرار 5 در i:
partial.بیفزا(request[i])
پایان
سرچاپ "short "، ساکس.رمزگشایی درخواست(partial، parsed)
reply := ساکس.رمزگذاری پاسخ(ساکس.کد موفق، ساکس.نشانی جدید("10.0.0.1"، 1080))
سرچاپ "reply "، ساکس.به هگز(reply)
ناپایا answer := ساکس.پاسخ {}
سرچاپ ساکس.رمزگشایی پاسخ(reply، answer)، answer.کد، answer.نشانی.میزبان، ساکس.متن پاسخ(answer.کد)
سرچاپ ساکس.متن پاسخ(ساکس.کد اتصال رد شد)، "|"، ساکس.متن پاسخ(ساکس.کد ساکس۴ رد شد)
ناپایا ip := وکتور {} برگردان وکتور<طبیعی۸>
سرچاپ ساکس.تجزیه آیپی۴("192.168.1.20"، ip)، ساکس.قالب آیپی۴(ip، 0)
ناپایا ip6 := وکتور {} برگردان وکتور<طبیعی۸>
سرچاپ ساکس.تجزیه آیپی۶("2001:db8::1"، ip6)، ساکس.قالب آیپی۶(ip6، 0)
encoded := ساکس.رمزگذاری نشانی(target)
ناپایا back := ساکس.نشانی {}
سرچاپ ساکس.رمزگشایی نشانی(encoded، 0، back)، back.میزبان
udp := ساکس.رمزگذاری سرآیند یو دی پی(target، 0)
سرچاپ "udp header "، ساکس.به هگز(udp)
ناپایا header := ساکس.سرآیند یو دی پی {}
سرچاپ ساکس.رمزگشایی سرآیند یو دی پی(udp، header)، header.قطعه، header.نشانی.میزبان، header.طول سرآیند
four := ساکس.رمزگذاری درخواست ساکس۴(ساکس.فرمان اتصال، "127.0.0.1"، 80، "bob")
سرچاپ "socks4 req "، ساکس.به هگز(four)
ناپایا four_req := ساکس.درخواست {}
سرچاپ ساکس.رمزگشایی درخواست ساکس۴(four، four_req)، four_req.کاربر، four_req.نشانی.درگاه
four_reply := ساکس.رمزگذاری پاسخ ساکس۴(ساکس.کد ساکس۴ پذیرفته، "127.0.0.1"، 80)
سرچاپ "socks4 rep "، ساکس.به هگز(four_reply)
ناپایا four_ans := ساکس.پاسخ {}
سرچاپ ساکس.رمزگشایی پاسخ ساکس۴(four_reply، four_ans)، four_ans.کد
سرچاپ ساکس.نسخه ساکس۵، ساکس.نسخه ساکس۴، ساکس.بدون احراز هویت، ساکس.روش پذیرفتنی نیست، ساکس.فرمان پیوند، ساکس.فرمان یو دی پی، ساکس.نوع آیپی۴
سرچاپ ساکس.کد خطای کلی، ساکس.کد غیرمجاز، ساکس.ساکس۴ای
پایاندرخواست Request
ساختار درخواست| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نسخه | version | صحیح = 0 | نسخه ساکس۵ یا نسخه ساکس۴. |
| فرمان | cmd | صحیح = 0 | فرمان اتصال، فرمان پیوند یا فرمان یو دی پی. |
| نشانی | addr | نشانی | مقصد. |
| کاربر | user | رشته = "" | شناسهی کاربر در درخواست SOCKS4. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
پاسخ Reply
ساختار پاسخ| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نسخه | version | صحیح = 0 | نسخهی پاسخ. |
| کد | code | صحیح = 0 | کد پاسخ. |
| نشانی | addr | نشانی | نشانی درون پاسخ. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
سرآیند یو دی پی UDPHeader
ساختار سرآیند یو دی پی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| قطعه | frag | صحیح = 0 | شمارهی قطعه. فقط ۰ (بدون تکهتکهشدن) پشتیبانی میشود. |
| نشانی | addr | نشانی | مقصد یا مبدأ دیتاگرام. |
| طول سرآیند | length | صحیح = 0 | سرآیند چند بایت گرفت. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
پیکربندی سرور ServerConfig
ساختار پیکربندی سرورپیکربندی سرور جدید شروع کنید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| درگاه | port | صحیح = 0 | درگاهی که روی آن گوش داده میشود؛ ۰ یک درگاه آزاد برمیگزیند. |
| نیاز به احراز هویت | require_auth | منطقی = نادرست | درست وقتی کارخواهها باید وارد شوند. افزودن کاربر و تعیین احراز هویت آن را روشن میکنند. |
| کاربران | users | نگاشت<رشته، رشته> | نامهای کاربری و گذرواژههای پذیرفتهشده. |
| احراز هویت | auth | تابع(رشته، رشته): منطقی | بررسی سفارشی (user, password) -> bool که به جای کاربران به کار میرود. با تعیین احراز هویت تعیین میشود. |
| دارای احراز هویت سفارشی | has_auth | منطقی = نادرست | درست وقتی احراز هویت به کار میرود. |
| اجازه ساکس۴ | allow_v4 | منطقی = درست | درست یعنی SOCKS4 و SOCKS4a پذیرفته شود. پیشفرض درست. کارسازی که گذرواژه بخواهد SOCKS4 را در هر حال رد میکند. |
| اجازه پیوند | allow_bind | منطقی = نادرست | درست یعنی فرمان BIND مجاز باشد. پیشفرض نادرست، چون BIND برای کارخواه یک درگاه شنود باز میکند. |
| اجازه یو دی پی | allow_udp | منطقی = درست | درست یعنی نشست UDP ASSOCIATE مجاز باشد. پیشفرض درست. |
| میزبان پیوند | bind_host | رشته = "127.0.0.1" | نشانیای که سرور و سوکتهای UDP و BIND به آن بسته میشوند: پیشفرض 127.0.0.1، برای IPv6 loopback مقدار ::1 یا [::1]، برای IPv4 و IPv6 مقدار ::، و 0.0.0.0 برای همهی رابطهای IPv4. |
| مهلت دستدهی میلیثانیه | handshake_timeout_ms | صحیح = 10000 | کارخواه چند میلیثانیه وقت دارد دستدهی را تمام کند. پیشفرض ۱۰۰۰۰. |
| مهلت بیکاری میلیثانیه | idle_timeout_ms | صحیح = 0 | اتصال رلهشده را پس از این همه میلیثانیه سکوت قطع کن. ۰، پیشفرض، یعنی هرگز. |
| اتصال به مقصد | connect | تابع(رشته، صحیح): خروجی | تابع بازخوانی که به مقصد میرسد: (host, port) -> . پیشفرض اتصال مستقیم. با تعیین اتصال به مقصد یا تعیین شمارهگیر تعیین میشود. |
| اجازه | allow | تابع(صحیح، رشته، صحیح): منطقی | یک قاعدهی دسترسی (command, host, port) -> bool که پیش از هر درخواست پرسیده میشود؛ نادرست با «غیرمجاز» پاسخ میدهد. پیشفرض همه چیز را مجاز میداند. |
| سیاست مقصد | policy | تونل.سیاست مقصد | کدام مقصدها قابل دسترسیاند. بهطور پیشفرض نشانیهای حلقه محلی، خصوصی، پیوند محلی، فراداده و دیگر نشانیهای ویژه رد میشوند. به DestPolicy نگاه کنید. |
| اتصال سفارشی دارد | has_connect | منطقی = نادرست | درست وقتی یک اتصالدهندهی سفارشی تعیین شده است. آنگاه سیاست فقط نامها و نشانیهای صریح را میسنجد و اتصالدهنده باید خودش امن تفکیک کند. |
| بیشینه اتصال همزمان | max_connections | صحیح = 1024 | بیشترین شمار اتصال همزمان؛ بیشتر از آن بسته میشود (ساکس) یا با ۵۰۳ پاسخ داده میشود (اچتیتیپی). پیشفرض ۱۰۲۴ است و ۰ سقف را برمیدارد. |
| بیشینه دست دادن مبدا | max_per_source | صحیح = 32 | بیشترین دستدهیهای همزمان در جریان از یک نشانی مبدا. پیشفرض ۳۲ است و ۰ حد را برمیدارد. |
| مهلت کل دستدهی | handshake_deadline_ms | صحیح = 10000 | کل زمانی که یک اتصال برای پایان دستدهی دارد، به میلیثانیه، هر قدر هم آهسته بفرستد. پیشفرض ۱۰۰۰۰ است و ۰ آن را خاموش میکند. |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع say(label: رشته، r: ساکس.نتیجه اتصال):
سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان
تابع ریشه:
echo := start_echo()
ناپایا config := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(config، درست)
ساکس.افزودن کاربر(config، "alice"، "s3cret")
سرچاپ config.نیاز به احراز هویت
server := ساکس.شروع(config)
say("right password"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، server.درگاه، "alice"، "s3cret")، "127.0.0.1"، echo))
say("wrong password"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، server.درگاه، "alice"، "nope")، "127.0.0.1"، echo))
say("no credentials"، ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)، "127.0.0.1"، echo))
ساکس.توقف(server)
ناپایا custom := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(custom، درست)
ساکس.تعیین احراز هویت(custom، (user: رشته، password: رشته): برگشت user برابر "bob" و password برابر "pw" پایان)
سرچاپ custom.دارای احراز هویت سفارشی
second := ساکس.شروع(custom)
say("callback accepts"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، second.درگاه، "bob"، "pw")، "127.0.0.1"، echo))
say("callback refuses"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، second.درگاه، "bob"، "xx")، "127.0.0.1"، echo))
ساکس.توقف(second)
پایانسرور Server
ساختار سرورشروع آن را برمیگرداند و توقف پایانش میدهد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی درگاه بسته شد و کارساز در حال اجراست. |
| درگاه | port | صحیح = 0 | درگاهی که روی آن گوش میدهد؛ وقتی ۰ خواستهاید به کار میآید. |
| میزبان | host | رشته = "" | نشانیای که کارساز روی آن گوش میدهد. |
| شنونده | listener | تی سی پی.سرور | شنوندهی TCP زیرین. |
| پرچم توقف | stop_cell | صحیح۶۴* | پرچمی که توقف پاکش میکند تا حلقهی پذیرش تمام شود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
ورودی ساکس۵ Socks5Inbound
ساختار ورودی ساکس۵تونل.پذیرنده: خوشآمدگویی را میخواند، احراز هویت میکند و درخواست را از یک جریان میخواند، پس میتواند در یک تونل.پروتکل ترکیبی یا پشت تونل.شنود تی سی پی بنشیند. با ورودی جدید ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| پیکربندی | config | پیکربندی سرور | تنظیمات کارساز: کاربرها، فرمانهای مجاز و حدها. |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع ریشه:
echo := start_echo()
ناپایا config := ساکس.پیکربندی سرور جدید(0)
ساکس.افزودن کاربر(config، "u"، "p")
mixed_config := ساکس.پیکربندی سرور جدید(0)
ناپایا mixed := تونل.ترکیبی جدید()
تونل.تنظیم ساکس۵ ترکیبی(mixed، ساکس.ورودی جدید(config))
تونل.تنظیم ساکس۴ ترکیبی(mixed، ساکس.ورودی جدید ساکس۴(mixed_config))
سرچاپ ساکس.ورودی جدید(config).نام()، ساکس.ورودی جدید ساکس۴(mixed_config).نام()
forward := تونل.انتقالدهنده جدید(تونل.مستقیم()، mixed)
inbound := تونل.شنود تی سی پی(0)
تونل.سرویسدهی پسزمینه(inbound، mixed، forward)
five := ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، inbound.درگاه، "u"، "p")، "127.0.0.1"، echo)
five.جریان.نوشتن("five")
سرچاپ five.موفق، five.جریان.خواندن(100)
five.جریان.بستن()
سرچاپ "wrong password:"، ساکس.اتصال(ساکس.کلاینت جدید با احراز هویت("127.0.0.1"، inbound.درگاه، "u"، "x")، "127.0.0.1"، echo).موفق
ناپایا four := ساکس.کلاینت جدید("127.0.0.1"، inbound.درگاه)
four.نسخه = ساکس.ساکس۴
سرچاپ "socks4 with auth required:"، ساکس.اتصال(four، "127.0.0.1"، echo).کد
inbound.توقف()
listener := تی سی پی.پیوند(0)
port := تی سی پی.درگاه(listener)
ساکس.برو(serve_once، listener.توصیفگر برگردان تهی*)
direct := ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، port)، "127.0.0.1"، echo)
direct.جریان.نوشتن("handled by hand")
سرچاپ direct.جریان.خواندن(100)
direct.جریان.بستن()
پایان
تابع serve_once(arg: صحیح۶۴):
listener := تی سی پی.سرور { توصیفگر = arg }
c := تی سی پی.پذیرش(listener)
ساکس.رسیدگی(ساکس.پیکربندی سرور جدید(0)، تونل.پوشاندن تی سی پی(c))
پایاننام Name
تابع نام(): رشتهsocks5 را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
دستدهی Handshake
تابع دستدهی(s: dyn تونل.جریان): تونل.نشستتونل.نشست با مقصد برمیگرداند، یا پس از فرستادن پاسخ خطای درست یک نشست ناموفق.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
پاسخ Reply
تابع پاسخ(s: dyn تونل.جریان، sess: تونل.نشست، ok: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
ورودی ساکس۴ Socks4Inbound
ساختار ورودی ساکس۴تونل.پذیرنده. با ورودی جدید ساکس۴ ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| پیکربندی | config | پیکربندی سرور | تنظیمات کارساز. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
نام Name
تابع نام(): رشتهsocks4 را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
دستدهی Handshake
تابع دستدهی(s: dyn تونل.جریان): تونل.نشستنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
پاسخ Reply
تابع پاسخ(s: dyn تونل.جریان، _sess: تونل.نشست، ok: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
رابط ساکس SocksConnector
ساختار رابط ساکستونل.زنجیره: به یک کارساز SOCKS وصل میشود و از آن میخواهد ادامه بدهد. با رابط جدید ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کلاینت | client | کلاینت | تنظیمات کارخواه: نشانی کارساز، نسخه و اعتبارنامه. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam
کارساز Server
تابع کارساز(): تونل.نشانینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam
دستدهی Handshake
تابع دستدهی(s: dyn تونل.جریان، target: تونل.نشانی): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam
نام Name
تابع نام(): رشتهsocks5 یا socks4 را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam
پایاها و متغیرها
نسخههای کارخواه Socks…
نسخه.| نام | انگلیسی | مقدار |
|---|---|---|
| ساکس۵ | Socks5 | 5 |
| ساکس۴ | Socks4 | 4 |
| ساکس۴ای | Socks4a | 40 |
// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
تابع echo_conn(arg: صحیح۶۴):
c := تی سی پی.اتصال از توصیفگر(arg)
تا درست:
data := تی سی پی.خواندن(c، 4096)
اگر data.طول() برابر 0:
بشکن
پایان
تی سی پی.نوشتن(c، data)
پایان
تی سی پی.بستن(c)
پایان
تابع echo_accept(arg: صحیح۶۴):
srv := تی سی پی.سرور { توصیفگر = arg }
تا درست:
c := تی سی پی.پذیرش(srv)
اگر وارونه تی سی پی.اتصال معتبر(c):
بشکن
پایان
ساکس.برو(echo_conn، c.توصیفگر برگردان تهی*)
پایان
پایان
تابع start_echo(): صحیح:
listener := تی سی پی.پیوند(0)
ساکس.برو(echo_accept، listener.توصیفگر برگردان تهی*)
برگشت تی سی پی.درگاه(listener)
پایان
تابع say(label: رشته، r: ساکس.نتیجه اتصال):
سرچاپ label + ": ok=" + r.موفق + " code=" + r.کد + " " + r.خطا
پایان
تابع ریشه:
echo := start_echo()
ناپایا server_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(server_cfg، درست)
server := ساکس.شروع(server_cfg)
ناپایا client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
client.نسخه = ساکس.ساکس۴
r := ساکس.اتصال(client، "127.0.0.1"، echo)
say("socks4 by address"، r)
r.جریان.نوشتن("four")
سرچاپ r.جریان.خواندن(100)
r.جریان.بستن()
client.نسخه = ساکس.ساکس۴ای
client.نام کاربری = "tester"
named := ساکس.اتصال(client، "localhost"، echo)
say("socks4a by name"، named)
named.جریان.بستن()
say("socks4 refused"، ساکس.اتصال(client، "127.0.0.1"، تی سی پی.درگاه آزاد()))
ساکس.توقف(server)
ناپایا config := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(config، درست)
config.اجازه ساکس۴ = نادرست
off := ساکس.شروع(config)
ناپایا four := ساکس.کلاینت جدید("127.0.0.1"، off.درگاه)
four.نسخه = ساکس.ساکس۴
سرچاپ "socks4 switched off:"، ساکس.اتصال(four، "127.0.0.1"، echo).موفق
ساکس.توقف(off)
پایانبایتهای نسخه Ver…
| نام | انگلیسی | مقدار |
|---|---|---|
| نسخه ساکس۵ | VerSocks5 | 5 |
| نسخه ساکس۴ | VerSocks4 | 4 |
روشهای احراز هویت Auth…
| نام | انگلیسی | مقدار |
|---|---|---|
| بدون احراز هویت | AuthNone | 0 |
| احراز هویت نام کاربری | AuthUserPass | 2 |
| روش پذیرفتنی نیست | AuthNoAcceptable | 255 |
فرمانها Cmd…
فرمان.| نام | انگلیسی | مقدار |
|---|---|---|
| فرمان اتصال | CmdConnect | 1 |
| فرمان پیوند | CmdBind | 2 |
| فرمان یو دی پی | CmdUDPAssociate | 3 |
نوعهای نشانی Atyp…
نوع.| نام | انگلیسی | مقدار |
|---|---|---|
| نوع آیپی۴ | AtypIPv4 | 1 |
| نوع دامنه | AtypDomain | 3 |
| نوع آیپی۶ | AtypIPv6 | 4 |
کدهای پاسخ SOCKS5 Rep…
کد برمیگرداند.| نام | انگلیسی | مقدار |
|---|---|---|
| کد موفق | RepSucceeded | 0 |
| کد خطای کلی | RepGeneralFailure | 1 |
| کد غیرمجاز | RepNotAllowed | 2 |
| کد شبکه در دسترس نیست | RepNetUnreachable | 3 |
| کد میزبان در دسترس نیست | RepHostUnreachable | 4 |
| کد اتصال رد شد | RepConnRefused | 5 |
| کد زمان تمام | RepTTLExpired | 6 |
| کد فرمان پشتیبانی نمیشود | RepCmdNotSupported | 7 |
| کد نوع نشانی پشتیبانی نمیشود | RepAtypNotSupported | 8 |
کدهای پاسخ SOCKS4 Rep4…
| نام | انگلیسی | مقدار |
|---|---|---|
| کد ساکس۴ پذیرفته | Rep4Granted | 90 |
| کد ساکس۴ رد شد | Rep4Rejected | 91 |
| کد ساکس۴ بدون شناسایی | Rep4NoIdentd | 92 |
| کد ساکس۴ کاربر ناشناس | Rep4BadUser | 93 |
تابعها
کلاینت جدید NewClient
تابع کلاینت جدید(host: رشته، port: صحیح): کلاینتنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
کلاینت جدید با احراز هویت NewClientAuth
تابع کلاینت جدید با احراز هویت(host: رشته، port: صحیح، username: رشته، password: رشته): کلاینتنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Auth.salam
دستدهی کلاینت ClientHandshake
تابع دستدهی کلاینت(s: dyn تونل.جریان، c: کلاینت، cmd: صحیح، host: رشته، port: صحیح): نتیجه دستدهینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam
اتصال Connect
تابع اتصال(c: کلاینت، host: رشته، port: صحیح): نتیجه اتصالنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
شمارهگیری اتصال DialConn
تابع شمارهگیری اتصال(c: کلاینت، host: رشته، port: صحیح): تی سی پی.اتصال شبکهاتصال ولی یک اتصال TCP ساده برای تابعهای net.tcp برمیگرداند. در شکست اتصال خالی.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
پیوند درخواست Bind
تابع پیوند درخواست(c: کلاینت، host: رشته، port: صحیح): نتیجه اتصالپذیرش پیوند را صدا بزنید.// زبان: فارسی
واردسازی شبکه.ساکس
واردسازی شبکه.تی سی پی
تابع ریشه:
ناپایا config := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(config، درست)
config.اجازه پیوند = درست
server := ساکس.شروع(config)
client := ساکس.کلاینت جدید("127.0.0.1"، server.درگاه)
first := ساکس.پیوند درخواست(client، "127.0.0.1"، 0)
سرچاپ "bind accepted:"، first.موفق، first.کد، first.نشانی محلی.درگاه بزرگتر 0
peer := تی سی پی.شماره گیری("127.0.0.1"، first.نشانی محلی.درگاه)
second := ساکس.پذیرش پیوند(first.جریان، client)
سرچاپ "peer connected:"، second.موفق
تی سی پی.نوشتن(peer، "from the inbound peer")
سرچاپ first.جریان.خواندن(100)
first.جریان.نوشتن("reply to the peer")
سرچاپ تی سی پی.خواندن(peer، 100)
تی سی پی.بستن(peer)
first.جریان.بستن()
ساکس.توقف(server)
ناپایا plain_cfg := ساکس.پیکربندی سرور جدید(0)
ساکس.اجازه آدرسهای خصوصی(plain_cfg، درست)
plain := ساکس.شروع(plain_cfg)
off := ساکس.پیوند درخواست(ساکس.کلاینت جدید("127.0.0.1"، plain.درگاه)، "127.0.0.1"، 0)
سرچاپ "bind not enabled:"، off.موفق، off.کد، off.خطا
ساکس.توقف(plain)
پایانپذیرش پیوند BindAccept
تابع پذیرش پیوند(s: dyn تونل.جریان، c: کلاینت): نتیجه دستدهینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Bind.salam
ایجاد نشست یو دی پی Associate
تابع ایجاد نشست یو دی پی(c: کلاینت): نشست یو دی پینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
ارسال بایت یو دی پی UDPSendBytes
تابع ارسال بایت یو دی پی(u: نشست یو دی پی، host: رشته، port: صحیح، ptr: تهی*، n: صحیح): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
ارسال یو دی پی UDPSend
تابع ارسال یو دی پی(u: نشست یو دی پی، host: رشته، port: صحیح، data: رشته): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
دریافت بایت یو دی پی UDPReceiveBytes
تابع دریافت بایت یو دی پی(u: نشست یو دی پی، buf: تهی*، max: صحیح، from &: نشانی): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
تنظیم مهلت یو دی پی UDPSetTimeout
تابع تنظیم مهلت یو دی پی(u: نشست یو دی پی، millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
بستن نشست یو دی پی CloseUDP
تابع بستن نشست یو دی پی(u: نشست یو دی پی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
برو Go
تابع برو(fn: صحیح۶۴، arg: تهی*): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Udp.salam
رله Relay
تابع رله(a: dyn تونل.جریان، b: dyn تونل.جریان، idle_ms: صحیح): آمار رلهنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Relay.salam
اتصال مستقیم DirectConnect
تابع اتصال مستقیم(host: رشته، port: صحیح، timeout_ms: صحیح): خروجیخروجی میپوشاند. نام حلنشدنی «میزبان در دسترس نیست» میدهد و ردشدن «اتصال رد شد».نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Policy.salam
اتصال با سیاست PolicyConnect
تابع اتصال با سیاست(p: تونل.سیاست مقصد، host: رشته، port: صحیح، timeout_ms: صحیح): خروجیتجزیه آیپی۴ ParseIPv4
تابع تجزیه آیپی۴(s: رشته، out &: وکتور<طبیعی۸>): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
تجزیه آیپی۶ ParseIPv6
تابع تجزیه آیپی۶(s: رشته، out &: وکتور<طبیعی۸>): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
قالب آیپی۴ FormatIPv4
تابع قالب آیپی۴(v: وکتور<طبیعی۸>، off: صحیح): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
قالب آیپی۶ FormatIPv6
تابع قالب آیپی۶(v: وکتور<طبیعی۸>، off: صحیح): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
دستهبندی میزبان ClassifyHost
تابع دستهبندی میزبان(host: رشته): صحیحنوع آیپی۴، برای IPv6 مقدار نوع آیپی۶ و برای هر چیز دیگر نوع دامنه را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
نشانی جدید NewAddress
تابع نشانی جدید(host: رشته، port: صحیح): نشانینشانی میسازد و نوع را از روی متن میزبان برمیگزیند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری نشانی EncodeAddress
تابع رمزگذاری نشانی(a: نشانی): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگشایی نشانی DecodeAddress
تابع رمزگشایی نشانی(data: وکتور<طبیعی۸>، off: صحیح، out &: نشانی): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری سلام EncodeGreeting
تابع رمزگذاری سلام(methods: وکتور<طبیعی۸>): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری انتخاب روش EncodeMethodChoice
تابع رمزگذاری انتخاب روش(method: صحیح): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری درخواست احراز هویت EncodeAuthRequest
تابع رمزگذاری درخواست احراز هویت(user: رشته، pass: رشته): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری پاسخ احراز هویت EncodeAuthReply
تابع رمزگذاری پاسخ احراز هویت(ok: منطقی): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری درخواست EncodeRequest
تابع رمزگذاری درخواست(cmd: صحیح، a: نشانی): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری پاسخ EncodeReply
تابع رمزگذاری پاسخ(code: صحیح، a: نشانی): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگشایی درخواست DecodeRequest
تابع رمزگشایی درخواست(data: وکتور<طبیعی۸>، out &: درخواست): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگشایی پاسخ DecodeReply
تابع رمزگشایی پاسخ(data: وکتور<طبیعی۸>، out &: پاسخ): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری سرآیند یو دی پی EncodeUDPHeader
تابع رمزگذاری سرآیند یو دی پی(a: نشانی، frag: صحیح): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگشایی سرآیند یو دی پی DecodeUDPHeader
تابع رمزگشایی سرآیند یو دی پی(data: وکتور<طبیعی۸>، out &: سرآیند یو دی پی): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری درخواست ساکس۴ Encode4Request
تابع رمزگذاری درخواست ساکس۴(cmd: صحیح، host: رشته، port: صحیح، user: رشته): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگشایی درخواست ساکس۴ Decode4Request
تابع رمزگشایی درخواست ساکس۴(data: وکتور<طبیعی۸>، out &: درخواست): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگذاری پاسخ ساکس۴ Encode4Reply
تابع رمزگذاری پاسخ ساکس۴(code: صحیح، host: رشته، port: صحیح): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
رمزگشایی پاسخ ساکس۴ Decode4Reply
تابع رمزگشایی پاسخ ساکس۴(data: وکتور<طبیعی۸>، out &: پاسخ): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
متن پاسخ ReplyText
تابع متن پاسخ(code: صحیح): رشتهconnection refused.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
به هگز ToHex
تابع به هگز(v: وکتور<طبیعی۸>): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Codec.salam
پیکربندی سرور جدید NewServerConfig
تابع پیکربندی سرور جدید(port: صحیح): پیکربندی سرورنمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
افزودن کاربر AddUser
تابع افزودن کاربر(cfg &: پیکربندی سرور، user: رشته، pass: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Auth.salam
تعیین احراز هویت SetAuth
تابع تعیین احراز هویت(cfg &: پیکربندی سرور، check: تابع(رشته، رشته): منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Auth.salam
تعیین اتصال به مقصد SetConnector
تابع تعیین اتصال به مقصد(cfg &: پیکربندی سرور، connect: تابع(رشته، صحیح): خروجی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Policy.salam
تعیین سیاست مقصد SetPolicy
تابع تعیین سیاست مقصد(cfg &: پیکربندی سرور، p: تونل.سیاست مقصد)اجازه آدرسهای خصوصی AllowPrivate
تابع اجازه آدرسهای خصوصی(cfg &: پیکربندی سرور، enabled: منطقی)رسیدگی Handle
تابع رسیدگی(cfg: پیکربندی سرور، s: dyn تونل.جریان)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
شروع Start
تابع شروع(cfg: پیکربندی سرور): سرورموفق را بررسی کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
توقف Stop
تابع توقف(sv: سرور)نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Connect.salam
خدمترسانی Serve
تابع خدمترسانی(cfg: پیکربندی سرور): منطقیرابط جدید NewConnector
تابع رابط جدید(c: کلاینت): رابط ساکسرابط ساکس میسازد. آن را با تونل.از طریق یا تونل.افزودن گام به کار ببرید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Chain.salam
ورودی جدید NewInbound
تابع ورودی جدید(cfg: پیکربندی سرور): ورودی ساکس۵نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
ورودی جدید ساکس۴ NewInbound4
تابع ورودی جدید ساکس۴(cfg: پیکربندی سرور): ورودی ساکس۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Inbound.salam
تعیین شمارهگیر SetDialer
تابع تعیین شمارهگیر(cfg &: پیکربندی سرور، d: dyn تونل.شمارهگیر)تونل.شمارهگیر به مقصدها برسد، پس میتواند قاعده، زنجیره یا فهرست مسدود به کار ببرد. جای تابع بازخوان اتصال را میگیرد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-socks-Policy.salam