
bbs هو موجّه لوكلاء SOCKS وHTTP. يعرض خدمة SOCKS5 (أو HTTP CONNECT) ويعيد توجيه الطلبات الواردة إلى وكلاء أو سلاسل وكلاء بناءً على هدف الطلب. يمكن ضبط التوجيه عبر سكربت PAC (إذا كان مبنيًا بدعم PAC)، أو من خلال ملف JSON.
يمكن العثور على نسخة bbs القديمة هنا
bbs هو موجّه لوكلاء SOCKS وHTTP. يقوم بتعريض خدمات SOCKS5 أو HTTP CONNECT أو إعادة توجيه المنافذ، ويحوّل الطلبات الواردة إلى وكلاء أو سلاسل من الوكلاء بناءً على هدف الطلب. يمكن ضبط التوجيه عبر نص PAC script (إذا تم البناء بدعم PAC)، أو عبر ملف JSON.
go install github.com/synacktiv/bbs@master
لتثبيت bbs مع دعم نصوص PAC:
go install -tags pac github.com/synacktiv/bbs@master
ملاحظة: يعتمد PAC على مكتبات خارجية غير مُدقَّقة.
تم توفير واجهة أوامر Python النصية bbscli.py لتسهيل إعداد bbs وتجنّب كتابة ملفات JSON يدويًا.
تتطلب مكتبة pyparsing، وهي مُتوفرة في حزم Debian:
apt install python3-pyparsing
إذا لم تكن المكتبة مُتوفرة في حزم توزيعتك، يمكن تثبيتها باستخدام pip:
pip install pyparsing
يتم التكوين في ملف JSON واحد يتكوّن من عدة أقسام:
يتم تمرير مسار ملف التكوين عبر الوسيط -c <path> (الافتراضي إلى ./bbs.json).
يعيد bbs تحميل ملفات التكوين عند استقبال SIGHUP، استخدم kill -HUP <pid> لإعادة التحميل.
فيما يلي مثال على هذا التكوين:
{
"proxies": {
"proxy1": {
"connstring": "socks5://127.0.0.1:1337",
"user": "user",
"pass": "s3cr3t"
},
"proxy2": {
"connstring": "http://127.0.0.1:1338"
}
},
"chains": {
"chain1": {
"proxyDns": true,
"tcpConnectTimeout": 1000,
"tcpReadTimeout": 2000,
"proxies": [
"proxy1",
"proxy2"
]
},
"direct": {
"proxies": []
}
},
"routes": {
"table1": {
"default": "direct",
"blocks": [
{
"comment": "Block1 comment",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "me\\.gandi\\.net"
},
"route": "chain1"
},
{
"comment": "Route non web traffic towards 10.35.0.0/16 through proxy2",
"rules": {
"rule1": {
"rule": "subnet",
"content": "10.35.0.0/16"
},
"op": "AND",
"rule2": {
"rule": "regexp",
"variable": "port",
"content": "^(80|443)$",
"negate": true
}
},
"route": "proxy2"
},
{
"comment": "Drop traffic to 445",
"rules": {
"rule": "regexp",
"variable": "port",
"content": "^445$"
},
"route": "drop"
},
{
"comment": "Route *.corp.local through chain1",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "(?i)^(.*\\.)?corp\\.local$"
},
"route": "chain1",
"disable": true
}
]
},
"table2": {
"default": "drop",
"blocks": [
{
"comment": "Route *.corp.local through chain2",
"rules": {
"rule": "regexp",
"variable": "host",
"content": "(?i)^(.*\\.)?corp\\.local$"
},
"route": "chain2"
}
]
}
},
"servers": [
"socks5://127.0.0.1:1081:table1",
"http://127.0.0.1:1080:table2",
"fwd://127.0.0.1:4445:chain1:10.0.0.1:445"
],
"hosts": {
"host1": "1.1.1.1",
"host2": "10.0.0.1",
"host3": "modified.host3",
"10.1.1.4": "10.1.1.5"
}
}
يجب تعريف الوكلاء (الخوادم الوسيطة) في قسم proxies كخريطة من بنى الوكلاء.
يتم اختيار مفاتيح الخريطة بحرية ولكن يجب أن تطابق المفاتيح المستخدمة في تعريف السلاسل.
بنى الوكلاء تكون كما يلي:
connstring مطلوب بالتنسيق protocol://host:port (protocol يمكن أن تكون socks5 أو httpconnect/http)user وpass اختياريانلكل وكيل مُعرَّف، يتم إنشاء سلسلة ضمنية (انظر الفقرة التالية) بنفس الاسم. لها معاملات افتراضية وتتكوّن من الوكيل المرتبط الواحد. إذا كنت تريد استخدام معاملات غير افتراضية، يجب عليك إنشاء سلسلة صراحةً.
يجب تعريف السلاسل في قسم chains كخريطة من بنى السلاسل.
يتم اختيار مفاتيح الخريطة بحرية ولكن يجب أن تطابق المفاتيح المستخدمة في تعريف التوجيهات،
ويجب أن تكون مختلفة عن مفاتيح خريطة قسم proxies.
تمتلك بنى السلاسل معاملات شبيهة بسلاسل الـ proxychains (راجع https://github.com/rofl0r/proxychains-ng):
proxyDns: قيمة منطقية، اختيارية، القيمة الافتراضية truetcpConnectTimeout: عدد صحيح، اختياري، القيمة الافتراضية 1000 (يُستخدم عند توصيل المقابس، سواء إلى أول وكيل
في السلسلة أو مباشرة إلى الهدف)tcpReadTimeout: عدد صحيح، اختياري، القيمة الافتراضية 2000 (يُستخدم عند قراءة استجابات المصافحة للوكلاء على المقابس المتصلة)proxies: قائمة سلاسل نصية، اختيارية، القيمة الافتراضية قائمة فارغةيجب أن يحتوي مفتاح proxies في chain على مصفوفة من أسماء الوكلاء المُعرَّفة كمفاتيح في قسم proxies.
كما ذُكر في الفقرة السابقة، لكل وكيل مُعرَّف في قسم proxies، يتم إنشاء سلسلة ضمنية (انظر الفقرة التالية) بنفس الاسم.
لها معاملات افتراضية وتتكوّن من الوكيل المرتبط الواحد.
نمط التكوين المدمج للتوجيه هو عبر ملف التكوين. فهو يربط العناوين بأسماء السلاسل.
يجب أن يحتوي الملف على خريطة من جداول التوجيه. يتم اختيار مفاتيح الخريطة بحرية
ولكن يجب أن تطابق المفاتيح المستخدمة في قسم servers.
يحتوي كل جدول توجيه على مفتاح default يمثل المسار الافتراضي ومفتاح blocks
وهو مصفوفة من كتل القواعد. تحتوي كل كتلة قاعدة على comment (تعليق)، ومجموعة rules (قواعد)،
واسم سلسلة مرتبط. يتم تقييم القواعد: بالنظر إلى عنوان بصيغة host:port، يمكن أن تكون
true أو false. بالنسبة لعنوان معيّن، يتم تقييم الكتل بترتيب تعريفها.
يمكن تعطيل الكتل عن طريق ضبط الحقل disable على true.
يتيح ذلك شكلاً من أشكال "التعليق"، وهو غير ممكن في JSON.
يتوقف التقييم عند أول كتلة تكون true ويتم إرجاع اسم السلسلة المرتبط بها.
كل خادم مفتوح (من قسم servers) يرتبط بجدول توجيه واحد من التكوين.
يتم توجيه الطلبات المستلمة على كل خادم وفقًا لجدول التوجيه المطابق. إذا تم تقييم جميع الكتل على أنها
فسيتم استخدام المسار الافتراضي. إذا لم يتم تعريف ، فسيتم إسقاط الاتصالات افتراضيًا.
حقول الكتلة:
comment (سلسلة نصية)rules (Rule أو RuleCombo)route (سلسلة نصية)disable (قيمة منطقية)حقول القاعدة:
rule (سلسلة نصية): نوع القاعدة، regexp، subnet.variable (سلسلة نصية): المتغير لتقييم regexp، host، port أو addr (host:port).content (سلسلة نصية): محتوى القاعدة، يعتمد على نوع القاعدة (انظر أدناه).negate (قيمة منطقية) [اختياري]: ما إذا كان يجب نفي القاعدة.حقول RuleCombo:
rule1 (Rule أو RuleCombo): المعامل الأيسر.op (سلسلة نصية): العامل، AND، And، and، &، &&، OR، Or، or، |، ||.rule2 (Rule أو RuleCombo): المعامل الأيمن.أنواع القواعد:
regexp: مطابقة المتغير المُعرَّف في variable (host، port أو addr=host:port) مع regexp في content.subnet: يتحقق مما إذا كان المضيف ضمن الشبكة الفرعية المُعرَّفة في content. إذا كان المضيف اسم نطاق وليس عنوان شبكة فرعية، تُرجع القاعدة false.يجب أن تُرجع كتل القواعد من قسم routes أو دالة PAC أسماء سلاسل مُعرَّفة،
وليس أسماء وكلاء. إذا كنت تريد استخدام وكيل واحد، فيجب عليك تغليفه
في سلسلة. اسم drop خاص ولا يحتاج إلى تعريف في
هذا التكوين. إذا أرجعت دالة PAC أو كتلة التوجيه drop كاسم
سلسلة، فسيتم إسقاط الاتصال.
إذا تم بناء bbs بدعم PAC وكانت وسائط -pac تشير إلى ملف PAC، فلن يتم استخدام
التوجيهات المعرفة في ملف التكوين. لا يدعم توجيه ملف PAC
جداول توجيه متعددة. سيتم استخدام نفس ملف PAC لكل خادم مفتوح.
يجب تعريف المستمعين الذين يفتحهم bbs في قسم servers كقائمة من
سلاسل الاتصال بالتنسيق protocol://bind_addr:bind_port:routing_table أو
protocol://bind_addr:bind_port:chain:dest_addr:dest_port.
protocol يمكن أن تكون http أو socks5 إذا تم توفير routing_tableprotocol يمكن أن تكون fwd إذا تم توفير chain وdest_addr وdest_portrouting_table أحد الجداول المعرّفة في قسم routeschain أحد السلاسل المعرّفة في قسم chainsيمكن ضبط تحليل اسم مضيف مخصص (مشابه لـ /etc/hosts) في قسم
hosts كخريطة من السلاسل النصية. تتوافق مفاتيح الخريطة مع اسم المضيف
والقيم مع عنوان IP الذي يجب أن يحلّ إليه المضيف.
تجدر الإشارة إلى أن مفاتيح الخريطة قد تكون أيضًا عناوين IP. في هذه الحالة، سيتم استبدال عنوان IP الخاص بالمفتاح بعنوان IP الخاص بالقيمة. وبالمثل، قد تكون قيم الخريطة أسماء مضيفين وستحل محل مفتاح الخريطة المقابل.
إذا تم تعريفها، يحدث تحليل الأسماء المخصص في بداية مرحلة الاتصال، بعد اتخاذ قرار التوجيه وقبل أي تحليل DNS محلي (إذا كانت السلسلة مُهيأة بـ proxyDns=false) وقبل إرسال عنوان الوجهة إلى الوكلاء المختلفين في السلسلة.
إذا تم بناء bbs بدعم PAC، يمكن ضبط التوجيه باستخدام نص PAC script
بدلاً من ملف تكوين JSON. ومع ذلك، يتطلب هذا استخدام مكتبة Go
غير موثوقة. يجب توفير مسار ملف PAC باستخدام -pac.
يجب أن يعرّف نص PAC الدالة FindProxyForURL(url, host). يجب أن تطابق
القيم التي تُرجعها هذه الدالة أسماء السلاسل (وليس الوكلاء)
المُعرَّفة في تكوين JSON.
falsedefault