لقد قمت بإعداد بروكسي SOCKS5، ويبدو أن حركة المرور تمر من خلاله، وعنوان IP في المتصفح يظهر كما هو مطلوب - لكن المواقع لا تزال ترى منطقتك الحقيقية أو يبدأ المزود في الاشتباه في شيء ما. السبب دائمًا تقريبًا هو نفسه: طلبات DNS تخرج مباشرة من جهاز الكمبيوتر الخاص بك، متجاوزة البروكسي. في هذه المقالة، سنستعرض لماذا يحدث ذلك، وما الفرق بين SOCKS5 و SOCKS5h، وكيفية سد هذه الثغرة في الكود والأدوات الجاهزة.
ما هو SOCKS5 وما الفرق بينه وبين SOCKS5h
SOCKS5 هو بروتوكول بروكسي يعمل على مستوى اتصالات TCP/UDP ولا يقوم بتحليل محتوى الحزم، على عكس بروكسي HTTP(S). وهذا يجعله عالميًا: يمكن من خلال SOCKS5 توجيه أي حركة مرور تقريبًا - متصفح، Telegram، عميل تورنت، سكربت في Python. لكن التنفيذ الكلاسيكي لـ SOCKS5 له ميزة مهمة: يتم تنفيذ حل أسماء النطاقات (DNS) افتراضيًا على جانب العميل، أي على جهاز الكمبيوتر الخاص بك، وليس على جانب خادم البروكسي.
SOCKS5h هو نفس البروتوكول، ولكن مع المعدل "h" (اسم المضيف)، الذي يشير إلى التطبيق العميل بعدم حل النطاق بنفسه، بل إرساله كما هو إلى خادم البروكسي، والذي سيقوم بعد ذلك بتنفيذ طلب DNS باسمه. الفرق في حرف واحد، لكن العواقب على الخصوصية واستقرار العمل - أساسية.
من المهم أن نفهم: SOCKS5h ليس بروتوكولًا منفصلًا، بل هو اتفاق على مستوى مكتبة أو تطبيق معين حول كيفية تشكيل الطلب إلى البروكسي. يعمل خادم البروكسي بنفس الطريقة في كلا الحالتين، الفرق فقط في من يبدأ حل DNS - العميل أو الخادم.
لماذا تتجاوز طلبات DNS البروكسي
عندما تتوجه إلى عنوان مثل https://example.com، يجب على التطبيق معرفة عنوان IP لهذا النطاق قبل إنشاء الاتصال. تُسمى هذه العملية حل DNS. عند العمل عبر SOCKS5 العادي، تقوم العديد من المكتبات والإعدادات النظامية بحل النطاق عبر خادم DNS النظامي - الذي تم تعيينه في إعدادات شبكة مزود الخدمة أو جهاز التوجيه الخاص بك.
ونتيجة لذلك، نحصل على وضع متناقض: حركة HTTP/TCP نفسها تمر عبر البروكسي وتبدو كما لو أن الطلب جاء من IP خادم البروكسي، بينما طلب DNS "ما هو IP لـ example.com؟" يذهب مباشرة من IP الحقيقي الخاص بك إلى خادم DNS لمزود الخدمة. وهذه هي تسرب DNS (DNS leak). يمكن لموقع أو خدمة تقوم بتحليل النشاط الشبكي على مستوى أعمق (وتستخدم مثل هذه الطرق للكشف أنظمة مكافحة الاحتيال في Facebook و Google و TikTok)، أن ترى عدم التطابق بين IP الاتصال ومصدر طلب DNS.
السبب هو أن بروتوكول SOCKS5 تم تطويره في الأصل كطبقة نقل للاتصالات IP الجاهزة، وليس لحل الأسماء. كان على مطوري المكتبات والأدوات تنفيذ وظيفة نقل طلب DNS عبر النفق بشكل منفصل - ومن هنا جاء SOCKS5h كإشارة واضحة "حل النطاق بنفسك، وليس أنا".
ما هي مخاطر تسرب DNS في الممارسة العملية
بالنسبة لمطور محلل أو سكربت أتمتة، فإن تسرب DNS ليس نظرية مجردة، بل هو سبب محدد للحظر وحظر الحسابات. دعونا نستعرض بعض السيناريوهات.
تحليل الأسواق والمواقع. إذا كنت تقوم بتحليل Wildberries أو Ozon أو أي مورد آخر عبر بروكسي من المنطقة المطلوبة، ولكن طلبات DNS تخرج عبر مزود الخدمة، يمكن لنظام مكافحة الروبوتات أن يسجل عدم تطابق الموقع الجغرافي ويزيد من مستوى الشك في الجلسة - حتى الوصول إلى CAPTCHA أو حظر IP البروكسي مؤقتًا.
تعدد الحسابات وتحكيم الحركة. عند العمل مع إعلانات Facebook أو إعلانات TikTok أو إعلانات Google عبر عدة حسابات، تقوم أنظمة مكافحة الاحتيال بتحليل العشرات من المعلمات، بما في ذلك بصمة DNS. إذا كانت طلبات DNS لعدة حسابات "مختلفة" تخرج فجأة عبر نفس خادم DNS لمزود الخدمة، فإن هذه إشارة إلى دمج الحسابات في مجموعة واحدة - ونتيجة لذلك، سلسلة من الحظر (chain-ban).
الأتمتة في Selenium/Playwright. السكربتات التي تحاكي إجراءات المستخدم في المتصفح تكون عرضة بشكل خاص: يمكن للمتصفح نفسه حل DNS عبر إعدادات النظام، متجاهلاً البروكسي المحدد فقط لحركة HTTP. في النهاية، تعطي جميع بصمات الشبكة الأخرى الموقع الحقيقي.
بالنسبة لمعظم هذه المهام، من الضروري استخدام بروكسي سكنية مع إعداد حل DNS بشكل صحيح على جانب الخادم - مما يقلل بشكل كبير من خطر الكشف بناءً على العلامات الشبكية.
كيفية التحقق مما إذا كان هناك تسرب DNS
قبل إصلاح المشكلة، من الجيد التأكد من أنها موجودة بالفعل. إليك بعض الطرق السريعة للتحقق.
- افتح موقع
dnsleaktest.comأوipleak.netعبر اتصال البروكسي الخاص بك وابدأ الاختبار المتقدم (Extended test). - قارن قائمة خوادم DNS في النتائج مع ما هو مزود الخدمة الخاص بك في الواقع. إذا رأيت مزود الخدمة بدلاً من مركز بيانات البروكسي - تم تأكيد التسرب.
- لأمر سطر الأوامر، استخدم مجموعة
tcpdumpأوWireshark، وقم بتصفية الحركة حسب المنفذ 53 (DNS) - إذا كانت الحزم تذهب مباشرة إلى خادم مزود الخدمة، وليس عبر نفق البروكسي، فإن المشكلة على جانبك. - في Python، يمكنك التحقق بسرعة من الحل يدويًا عبر
socket.getaddrinfo()قبل وبعد تشغيل البروكسي - إذا كان IP يتطابق مع النتيجة بدون بروكسي، فإن الحل يتم محليًا.
الإصلاح في Python (requests، PySocks، urllib3)
الخطأ الأكثر شيوعًا في سكربتات Python هو استخدام مكتبة requests مع PySocks بدون تحديد واضح للنمط socks5h. الفرق في رمز واحد، لكنه هو الذي يحدد من يقوم بحل النطاق.
import requests
# سيء: يتم حل DNS محليًا، متجاوزًا البروكسي
proxies_leak = {
"http": "socks5://user:pass@proxy_host:1080",
"https": "socks5://user:pass@proxy_host:1080",
}
# جيد: يتم حل DNS على جانب خادم البروكسي
proxies_safe = {
"http": "socks5h://user:pass@proxy_host:1080",
"https": "socks5h://user:pass@proxy_host:1080",
}
response = requests.get("https://example.com", proxies=proxies_safe, timeout=10)
print(response.status_code)
print(response.text[:200])
للعمل بشكل صحيح مع نمط socks5h عبر requests، ستحتاج إلى تثبيت الاعتماد:
pip install "requests[socks]" PySocks
إذا كنت تستخدم urllib3 على مستوى منخفض مباشرة، فسيبدو المثال كما يلي:
from urllib3.contrib.socks import SOCKSProxyManager
proxy = SOCKSProxyManager(
"socks5h://user:pass@proxy_host:1080",
num_pools=10
)
response = proxy.request("GET", "https://example.com")
print(response.status)
بالنسبة للسكربتات غير المتزامنة على aiohttp، يتم استخدام مكتبة aiohttp-socks، حيث يتم تحديد النمط بنفس الطريقة:
import aiohttp
from aiohttp_socks import ProxyConnector
connector = ProxyConnector.from_url("socks5h://user:pass@proxy_host:1080")
async def fetch():
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get("https://example.com") as resp:
print(await resp.text())
الإصلاح في curl
في curl أيضًا، هناك علامتان مختلفتان لبروكسي SOCKS5، والارتباك بينهما هو سبب كلاسيكي لتسرب DNS في سكربتات bash.
# سيء: الحل على الجهاز المحلي
curl --socks5 proxy_host:1080 https://example.com
# جيد: الحل على جانب خادم البروكسي
curl --socks5-hostname proxy_host:1080 https://example.com
# مع المصادقة
curl --socks5-hostname user:pass@proxy_host:1080 https://example.com
العلم --socks5-hostname هو نظير مباشر لـ socks5h في الأدوات الأخرى. إنه يخبر curl: "لا تلمس DNS، فقط أرسل النطاق إلى خادم البروكسي كما هو".
الإصلاح في Selenium و Playwright
مع أتمتة المتصفح، تكون الحالة أكثر تعقيدًا: يمكن لـ Chrome أو Firefox بشكل افتراضي حل DNS عبر إعدادات النظام، متجاهلاً البروكسي المحدد فقط على مستوى الطلب الشبكي. بالنسبة لـ Selenium مع Chrome، يجب تمكين الحل عبر البروكسي بشكل صريح باستخدام علامة تشغيل المتصفح.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--proxy-server=socks5://proxy_host:1080")
# علامة حاسمة: حل DNS عبر البروكسي
options.add_argument("--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE proxy_host")
driver = webdriver.Chrome(options=options)
driver.get("https://example.com")
في Playwright، تكون الحالة أبسط: تقوم المكتبة افتراضيًا بحل DNS عبر البروكسي إذا تم تحديده في إعدادات سياق المتصفح.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={"server": "socks5://proxy_host:1080"}
)
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
ومع ذلك، يُوصى دائمًا بالتحقق من السلوك الحقيقي عبر dnsleaktest.com بعد الإعداد - قد يختلف السلوك بين إصدارات Chromium.
الإعداد في متصفحات مكافحة الكشف
إذا كنت لا تكتب الكود، بل تعمل من خلال متصفحات مكافحة الكشف مثل Dolphin Anty أو AdsPower أو Multilogin أو GoLogin - الخبر الجيد هو أن معظمها يقوم بالفعل بحل DNS عبر خادم البروكسي تلقائيًا عند اختيار بروتوكول SOCKS5، دون الحاجة إلى تحديد "h" يدويًا. هذه واحدة من مزاياها الرئيسية مقارنة بالسكربتات المكتوبة يدويًا.
ومع ذلك، من الجيد التحقق من ذلك في الممارسة العملية: افتح ملف التعريف في متصفح مكافحة الكشف، وانتقل إلى dnsleaktest.com وابدأ الاختبار المتقدم داخل الملف الشخصي. إذا رأيت خوادم DNS تتوافق مع منطقة البروكسي الخاصة بك، وليس مع مزود الخدمة الحقيقي الخاص بك - فإن الإعداد صحيح. إذا لم يكن الأمر كذلك، فاتصل بدعم المتصفح المحدد لمكافحة الكشف أو قم بتغيير نوع البروكسي إلى HTTP(S)، حيث لا تحدث مشكلة حل DNS بشكل حاد، حيث يعمل بروكسي HTTP دائمًا مع عناوين URL كاملة.
بالنسبة لجمع الحسابات على Instagram و TikTok وإدارة حسابات إعلانات Facebook، فإن البروكسي المحمولة تُظهر أداءً جيدًا - بفضل التدوير الديناميكي لعناوين IP لمشغلي الشبكات الخلوية، فإنها نادرًا ما تقع تحت اشتباه أنظمة مكافحة الاحتيال، حتى لو حدث تسرب DNS صغير في مكان ما في السلسلة.
جدول مقارنة البروتوكولات
| البروتوكول | من يقوم بحل DNS | خطر التسرب | أين يتم تطبيقه |
|---|---|---|---|
| SOCKS5 | العميل (جهاز الكمبيوتر الخاص بك) | مرتفع | فقط إذا لم يكن DNS حرجًا (اختبارات محلية) |
| SOCKS5h | خادم البروكسي | منخفض | التحليل، تعدد الحسابات، الأتمتة |
| بروكسي HTTP/HTTPS | خادم البروكسي (افتراضي) | منخفض | حركة الويب، المتصفحات، طلبات API |
إذا كانت مهمتك هي جمع البيانات بسرعة دون ارتباط بمنطقة معينة للمستخدم، فكر في بروكسي مراكز البيانات - فهي أرخص بناءً على حجم الحركة وتعمل بشكل ممتاز مع SOCKS5h للتحليل، حيث تكون السرعة هي الأهم، وليس التمويه كمستخدم سكني.
قائمة التحقق قبل بدء المشروع
- تستخدم نمط
socks5h://، وليسsocks5://في جميع المكتبات والإعدادات. - بالنسبة لـ curl، تستخدم العلم
--socks5-hostname، وليس--socks5. - في Selenium، تمت إضافة العلم
--host-resolver-rulesأو يتم استخدام Playwright مع حل البروكسي المدمج. - تحقق من النتيجة على dnsleaktest.com أو ipleak.net بعد الإعداد، وليس قبله.
- في متصفح مكافحة الكشف، اختبرت بصمة DNS داخل الملف الشخصي نفسه، وليس فقط IP الخارجي.
- للمهام التي تتطلب مستوى عالٍ من الخصوصية، تفكر في استخدام بروكسي سكنية أو بروكسي محمولة بدلاً من مراكز البيانات.
الخاتمة
الفرق بين SOCKS5 و SOCKS5h هو حرف واحد فقط، لكنه يحدد من يقوم بحل طلب DNS: جهاز الكمبيوتر الخاص بك أو خادم البروكسي. تسرب DNS هو أحد أكثر الأسباب خفاءً، ولكنه شائع للكشف أثناء التحليل، تعدد الحسابات، وأتمتة حسابات الإعلانات. التحقق عبر dnsleaktest.com وتحديد نمط socks5h في الكود، أو أوامر curl، أو إعدادات أتمتة المتصفح يسد هذه الثغرة في بضع دقائق.
إذا كنت فقط تختار البنية التحتية للمهمة - فإن التحليل والعمل مع API يناسبهم بشكل أفضل بروكسي مراكز البيانات، لتعدد الحسابات ووسائل التواصل الاجتماعي - بروكسي سكنية، وللحصول على بصمة شبكة طبيعية عند العمل مع التطبيقات المحمولة - بروكسي محمولة. في أي من هذه الحالات، يظل الإعداد الصحيح لحل DNS عبر SOCKS5h خطوة إلزامية قبل بدء المشروع في الإنتاج.