
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) يرتبط بجدول توجيه واحد من التكوين.
يتم توجيه الطلبات المستلمة على كل خادم وفقًا لجدول التوجيه المطابق. إذا تم تقييم جميع الكتل على أنها
false فسيتم استخدام المسار الافتراضي. إذا لم يتم تعريف default، فسيتم إسقاط الاتصالات افتراضيًا.
حقول الكتلة:
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 لكل خادم مفتوح.