BGP: كيف تتفق شبكات العالم على الطريق
درس 4 من 4
4BGP: كيف تتفق شبكات العالم على الطريق
الصورة الكبيرةOSPF الذي تعلمته يعمل داخل شبكة واحدة يملكها طرف واحد. لكن من يربط شبكة STC بشبكة Google بشبكة جامعة في اليابان؟ لا أحد يملك الإنترنت كله، فكل شبكة تعلن لجيرانها «أنا أصل لهذه العناوين»، والجيران ينقلون الخبر. هذا BGP، وهو البروتوكول الذي يمسك الإنترنت معًا، وخطأ واحد فيه قد يُخفي شركة كاملة عن العالم.
ماذا تشاهد في الرسم: كل AS يضيف رقمه إلى بداية المسار قبل أن ينقل الإعلان. هكذا يعرف المستقبل من أين جاء الطريق، ويرفض أي طريق فيه رقمه هو (منع الحلقات).
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
تخيّل شركات شحن بين المدن. كل شركة تقول لجيرانها: «أوصل إلى الرياض، والطريق عبري يمر بشركتين». الجار يختار ليس الأسرع بالضرورة، بل الأرخص له أو صاحب العقد الأفضل. BGP هو هذه المحادثة بين الأنظمة المستقلة: كل AS (مزوّد إنترنت، أو شركة كبيرة، أو جامعة) له رقم، ويعلن عناوينه، ويختار طرقه بسياساته. ولو أعلنت شركة خطأً «أنا أوصل إلى عناوين YouTube» وصدّقها الجيران، ذهبت حركة العالم إليها.
BGP-4 (RFC 4271) بروتوكول path vector يعمل على TCP 179 بين جيران مضبوطين يدويًا. eBGP بين ASes مختلفة (المسافة الإدارية 20 في Cisco)، وiBGP داخل AS واحد (200) ويحتاج full mesh أو Route Reflectors. أرقام AS: 16 بت أو 32 بت (RFC 6793)، والخاصة 64512–65534 و4200000000–4294967294. ترتيب اختيار أفضل مسار في Cisco باختصار: Weight الأعلى، ثم Local Preference الأعلى، ثم المحلي، ثم AS_PATH الأقصر، ثم Origin، ثم MED الأقل، ثم eBGP قبل iBGP، ثم أقرب قفزة تالية بمقياس IGP، ثم أقدم مسار وأقل Router ID. التحكم بالخروج: Local Preference. بالدخول: AS_PATH prepending وMED. الأمن: فلاتر بادئات، وRPKI حيث يوقّع صاحب العناوين ROA وتتحقق الموجّهات (RFC 6811) فترفض ما يُعلن من AS غير مخوّل.
قبل أن تبدأ
🗺️التوجيه وOSPF
تعرف جدول التوجيه وأطول تطابق وOSPF.
6️⃣IPv6 في الواقع
تعرف البادئات /48 و/32.
الفكرة الجوهرية
1النظام المستقل والجلسة
AS شبكة تحت إدارة واحدة ولها سياسة توجيه واحدة، ورقم من سجل إقليمي (في منطقتنا RIPE NCC). جاران في BGP يفتحان جلسة TCP على المنفذ 179، ثم يتبادلان الجداول مرة، وبعدها التحديثات فقط ورسائل keepalive. لا اكتشاف تلقائي مثل OSPF: كل جار يُكتب يدويًا، لأن العلاقة بين شبكتين عقد تجاري لا مصادفة.
router bgp 64500 neighbor 203.0.113.1 remote-as 65001 ! provider A neighbor 198.51.100.1 remote-as 65002 ! provider B address-family ipv4 network 192.0.2.0 mask 255.255.255.0 ! announce ONLY your own prefix neighbor 203.0.113.1 prefix-list OURS out neighbor 198.51.100.1 prefix-list OURS out ip prefix-list OURS permit 192.0.2.0/24
2كيف يختار BGP الطريق؟
BGP لا ينظر إلى سرعة الوصلة. يمر على قائمة صفات بالترتيب، وأول صفة تحسم تنهي المقارنة. أهم ثلاث تحفظها: Local Preference (الأعلى يفوز، وتضبطه داخل شبكتك لتقرر من أين تخرج)، وAS_PATH (الأقصر يفوز)، وMED (الأقل يفوز، اقتراح من الجار عن أفضل باب للدخول إليه).
في الحالة الأولى يتعادل A وC في طول المسار، فيحسم MED الأقل لصالح A. ثم تغلب السياسة الطول، ثم يطيل A مساره فيخسر.
routes = [ # three ways to reach 8.8.8.0/24 as seen by your edge routers
{"via": "provider A", "local_pref": 100, "as_path": [65001, 15169], "med": 0, "ebgp": True},
{"via": "provider B", "local_pref": 100, "as_path": [65002, 3356, 15169], "med": 0, "ebgp": True},
{"via": "partner C", "local_pref": 100, "as_path": [65003, 15169], "med": 50, "ebgp": True},
]
def best(routes):
# local pref (higher), AS path (shorter), MED (lower), eBGP over iBGP
return min(routes, key=lambda r: (-r["local_pref"], len(r["as_path"]), r["med"], not r["ebgp"]))
print("default choice:", best(routes)["via"])
routes[1]["local_pref"] = 200 # policy: provider B is cheaper, prefer it outbound
print("after policy :", best(routes)["via"])
routes[1]["local_pref"] = 100
routes[0]["as_path"] = [65001, 65001, 65001, 15169] # A prepends to push traffic away
print("after prepend :", best(routes)["via"])3iBGP داخل شبكتك
حين يكون لك أكثر من موجّه حافة، يجب أن تعرف كل الموجّهات ما تعلمه الآخرون من الخارج، وهذا دور iBGP. قاعدة مهمة: موجّه iBGP لا ينقل ما تعلمه من جار iBGP إلى جار iBGP آخر (لمنع الحلقات داخل AS لا يتغير فيه AS_PATH)، فتحتاج full mesh: n(n-1)/2 جلسة. مع 20 موجّهًا هذا 190 جلسة، لذلك تستخدم الشبكات الكبيرة Route Reflector.
لهذا لا ترى full mesh في شبكات المزوّدين الكبيرة.
for n in (3, 5, 10, 20, 50):
mesh = n * (n - 1) // 2
with_rr = n - 1 # every router peers only with one reflector
print(f"{n:>3} routers: full mesh {mesh:>5} sessions | one route reflector {with_rr:>3}")4حين يخطئ BGP: الاختطاف وRPKI
BGP صُمم على الثقة: من يعلن عناوين يُصدَّق. في فبراير 2008 أعلنت Pakistan Telecom بادئة أدق من بادئة YouTube لحجبه محليًا، فتسربت للعالم واختفى YouTube نحو ساعتين، لأن أطول تطابق يفوز دائمًا. وفي 4 أكتوبر 2021 سحب أمر صيانة في Facebook إعلانات BGP لخوادم DNS الخاصة بها، فاختفت Facebook وInstagram وWhatsApp نحو ست ساعات. الحماية: فلاتر صارمة على ما تعلنه وما تقبله، وRPKI: صاحب العناوين ينشر ROA موقّعة تقول «هذا الـ AS وحده يعلن هذه البادئة بهذا الطول»، والموجّهات ترفض المخالف. وانضم إلى مبادرة MANRS التي تجمع هذه الممارسات.
هذا منطق التحقق من الأصل في RFC 6811 مصغّرًا: البادئة الأدق من AS غريب تُرفض.
import ipaddress
roas = [("192.0.2.0/24", 24, 64500)] # prefix, max length, authorised origin AS
def validate(prefix, origin):
net = ipaddress.ip_network(prefix)
covering = [r for r in roas if net.subnet_of(ipaddress.ip_network(r[0]))]
if not covering:
return "not-found"
ok = any(net.prefixlen <= maxlen and origin == asn for _, maxlen, asn in covering)
return "valid" if ok else "INVALID -> drop"
print("192.0.2.0/24 from AS64500:", validate("192.0.2.0/24", 64500))
print("192.0.2.0/25 from AS64999:", validate("192.0.2.0/25", 64999)) # a hijack
print("192.0.2.0/24 from AS64999:", validate("192.0.2.0/24", 64999)) # wrong origin
print("203.0.113.0/24 from AS65010:", validate("203.0.113.0/24", 65010))مثال محلول
المسألة: شركتك (AS 64500) متصلة بمزوّد أ (وصلة 1 Gbps رخيصة) ومزوّد ب (10 Gbps غالية). الإدارة تريد: الخروج عبر أ، والدخول عبر أ، وب احتياطي للاتجاهين.
الحل: الخروج: اضبط Local Preference = 200 للطرق القادمة من أ، و100 (الافتراضي) لطرق ب، فتفضّل كل موجّهاتك أ. الدخول: أطل مسارك نحو ب بتكرار رقمك ثلاث مرات (64500 64500 64500) فيراه العالم أطول ويفضّل أ. الأمان: prefix-list يعلن 192.0.2.0/24 فقط، وفلتر يرفض استقبال بادئاتك أنت من الخارج، وROA في RIPE لبادئتك. التحقق: show ip bgp 0.0.0.0 يجب أن تُظهر أ بعلامة >، وأداة looking glass عامة تُظهر مسارك عبر ب أطول.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| BGP يختار أسرع طريق. | يختار حسب السياسة وطول المسار بعدد الأنظمة، ولا يعرف سرعة الوصلات ولا ازدحامها. |
| BGP للمزوّدين فقط ولا يحتاجه مهندس الشركات. | أي شركة لها مزوّدان أو مركز بيانات أو شبكة سحابية هجينة تتعامل مع BGP. وشبكات مراكز البيانات الحديثة تستخدمه داخليًا. |
| اختطاف المسارات شيء نظري. | تحدث حوادث تسرّب واختطاف كل أسبوع تقريبًا، وبعضها أخفى خدمات عالمية لساعات. |
أين تقابله في العمل
🏦شركة بمزوّدَين
BGP يجعل الإنترنت يعمل إن سقط أحد المزوّدَين.
☁️السحابة الهجينة
الوصلات المخصصة إلى AWS وAzure تتبادل الطرق بـ BGP.
🛰️مزوّد الإنترنت
يدير جلسات مع مئات الجيران ونقاط التبادل.
اختبر فهمك
على أي منفذ تعمل جلسة BGP؟
BGP يعتمد على TCP للتوصيل الموثوق، على المنفذ 179.
تريد أن تخرج كل حركة شركتك عبر المزوّد أ. ماذا تغيّر؟
Local Preference تُضبط داخل شبكتك وتحكم الخروج، والأعلى يفوز.
لماذا اختفى YouTube في 2008 رغم أن إعلانه الأصلي بقي موجودًا؟
الموجّه يفضّل دائمًا البادئة الأطول، مهما كان مصدرها.
ما فائدة RPKI؟
ROA موقّعة تربط البادئة بالأصل المسموح، والموجّه يرفض المخالف.
كم جلسة iBGP تحتاج 10 موجّهات في full mesh؟
n(n-1)/2 = 10×9/2 = 45.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا لا يكتشف BGP جيرانه تلقائيًا مثل OSPF؟
لأن كل جلسة علاقة متفق عليها بين جهتين، وفتحها تلقائيًا خطر أمني وتجاري.
كيف تجعل الإنترنت يدخل إليك عبر مزوّد بعينه؟
تطيل AS_PATH في إعلانك نحو المزوّد الآخر، أو ترسل MED أقل لجارك نفسه. وتذكّر: هذا اقتراح وليس أمرًا.
ما الخطأ في إعادة إعلان طرق مزوّد إلى مزوّد آخر؟
تصبح ممرًا (route leak) لحركة لا تخصك، فتختنق وصلتك وقد تؤذي الإنترنت.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.