এই পর্বে যা শিখবেন
- একটি IGP দিয়ে কেন পুরো ইন্টারনেট চালানো যায় না, আর AS ও ASN কী (private আর documentation range-সহ)
- BGP session, চার ধরনের বার্তা, AS_PATH দিয়ে loop ঠেকানো, eBGP আর iBGP
- Transit, peering, valley-free export নিয়ম, tier আর IXP — বাংলাদেশের প্রেক্ষাপটসহ
- BGP attribute আর best-path selection হাতে আর simulator-এ, hot-potato routing, traffic engineering আর anycast
- Route leak আর hijack-এর ইতিহাস, আর prefix filter, IRR, RPKI/ROV, BGPsec ও MANRS দিয়ে প্রতিরক্ষা
১ · একটি IGP দিয়ে কেন পুরো ইন্টারনেট চলে না
পর্ব ২৩ আর ২৪-এ দেখেছেন distance vector (RIP) আর link state (OSPF) — দুটোই একটি প্রতিষ্ঠানের নিজের নেটওয়ার্কের ভেতরে সবচেয়ে কম খরচের পথ খোঁজে। পর্ব ২২-এ এদের নাম দেওয়া হয়েছে IGP (Interior Gateway Protocol). প্রশ্ন হলো: পুরো ইন্টারনেটকে একটি বিশাল OSPF বানালে সমস্যা কী? সমস্যা তিনটি — আকার, স্বাধীনতা আর নীতি।
আকার (scale)
ইন্টারনেটে সত্তর হাজারেরও বেশি AS, আর পুরো IPv4 routing table-এ প্রায় দশ লক্ষ prefix. Link state-এ প্রতিটি router-কে পুরো মানচিত্র রাখতে হয়, আর যেকোনো link-এর অবস্থা বদলালে খবর সবার কাছে flood হয়। বিশ্বের কোথাও প্রতি সেকেন্ডে কোনো না কোনো link ওঠানামা করছে — সবাইকে সব খবর পাঠালে router-গুলো শুধু হিসাবই করত।
মানচিত্র রাখা অসম্ভবস্বাধীনতা (autonomy)
প্রতিটি ISP নিজের ভেতরের নকশা গোপন রাখতে চায়, নিজের পছন্দের IGP আর নিজের metric চালাতে চায়। এক ISP-র “cost 10” আর অন্যটির “cost 10” একই জিনিস নয় — metric যোগ করে তুলনা করাই অর্থহীন।
ভেতরের খবর ভেতরেনীতি (policy)
সবচেয়ে ছোট পথ সবসময় কাঙ্ক্ষিত পথ নয়। “প্রতিযোগীর traffic আমি বিনা টাকায় বহন করব না”, “এই দেশের মধ্য দিয়ে আমার traffic যাবে না”, “সস্তা link-টি আগে” — এসব ব্যবসা আর আইনের সিদ্ধান্ত, দূরত্বের হিসাব নয়।
টাকা আর চুক্তিতাই ইন্টারনেটের routing দুই স্তরে ভাগ: প্রতিটি প্রতিষ্ঠানের ভেতরে IGP (intra-domain), আর প্রতিষ্ঠানগুলোর মাঝে EGP (Exterior Gateway Protocol, inter-domain). আজ ইন্টারনেটে চালু EGP একটিই: BGP (Border Gateway Protocol), সংস্করণ ৪, যার বর্তমান মূল মান RFC 4271 (২০০৬)।
ঢাকার একটি কুরিয়ার কোম্পানির কথা ভাবুন। দেশের ভেতরে নিজের শাখাগুলোর মধ্যে পার্সেল কোন পথে যাবে, তা কোম্পানি নিজে ঠিক করে — নিজের ম্যাপ, নিজের হিসাব (IGP). কিন্তু দুবাইয়ে পার্সেল পাঠাতে হলে অন্য কোম্পানির সাথে চুক্তি লাগে। কে কার পার্সেল কত টাকায় বহন করবে, তা ঠিক হয় চুক্তিতে, ম্যাপে সবচেয়ে ছোট রাস্তা দেখে নয়। আর অন্য কোম্পানিকে শুধু জানানো হয় “এই এলাকাগুলোর পার্সেল আমি পৌঁছে দিতে পারি, এই এই কোম্পানি ঘুরে”. এই “কোন এলাকা, কাদের ঘুরে” ঘোষণাই BGP.
| বিষয় | IGP (OSPF, IS-IS, RIP) | BGP (EGP) |
|---|---|---|
| পরিসর | একটি AS-এর ভেতরে | AS থেকে AS — পুরো ইন্টারনেট |
| লক্ষ্য | সবচেয়ে কম metric-এর পথ, দ্রুত convergence | নীতি মেনে পৌঁছানো যায় এমন পথ; loop নেই |
| প্রতিবেশী খোঁজা | নিজে নিজে (hello, multicast) | হাতে কনফিগার করা প্রতিবেশী, TCP সংযোগ |
| কী জানায় | link-এর অবস্থা বা দূরত্ব | prefix আর তার পথের AS-তালিকাসহ attribute |
| বিশ্বাস | সবাই একই প্রতিষ্ঠানের — পূর্ণ বিশ্বাস | প্রতিবেশী অন্য প্রতিষ্ঠান — filter আর যাচাই লাগে |
| টেবিলের আকার | শত থেকে কয়েক হাজার route | পুরো table-এ প্রায় দশ লক্ষ IPv4 prefix |
“EGP” নামটি প্রথমে একটি নির্দিষ্ট protocol-এর নাম ছিল (RFC 904, ১৯৮৪), যা ধরে নিত ইন্টারনেট একটি গাছের মতো — একটি কেন্দ্রীয় backbone-এর নিচে বাকিরা। নেটওয়ার্ক জালের মতো হয়ে উঠলে সেই ধারণা ভেঙে পড়ে। ১৯৮৯ সালে Kirk Lougheed আর Yakov Rekhter BGP-র প্রথম সংস্করণ নকশা করেন (RFC 1105); প্রচলিত গল্প হলো, প্রথম খসড়া লেখা হয়েছিল দুটি ন্যাপকিনে। নব্বইয়ের দশকের মাঝামাঝি CIDR-সমর্থনসহ BGP-4 আসে (পর্ব ১৬), আর সেটিই আজও চলছে।
২ · Autonomous system আর ASN
RFC 1930-এর সংজ্ঞায় autonomous system হলো এক বা একাধিক অপারেটরের চালানো IP prefix-এর একটি যুক্ত দল, যার বাইরের দিকে একটি স্পষ্ট routing নীতি আছে। সহজ কথায়: একটি ISP, একটি বিশ্ববিদ্যালয়, একটি ব্যাংক বা একটি বড় content কোম্পানির নেটওয়ার্ক — যে বাইরের দুনিয়ার কাছে এক সত্তা হিসেবে BGP বলে। প্রতিটি AS-এর একটি নম্বর, ASN (Autonomous System Number).
- বণ্টন: IP ঠিকানার মতোই — IANA থেকে পাঁচটি RIR-এর কাছে ব্লক, সেখান থেকে প্রতিষ্ঠানে (পর্ব ১৬)। বাংলাদেশের প্রতিষ্ঠানগুলো ASN পায় APNIC-এর কাছ থেকে (সরাসরি সদস্য হয়ে, বা কোনো সদস্য প্রতিষ্ঠানের মাধ্যমে)।
- ১৬ bit থেকে ৩২ bit: শুরুতে ASN ছিল ১৬ bit — ০ থেকে ৬৫,৫৩৫. এগুলো ফুরিয়ে আসছিল বলে ৩২ bit ASN আসে (প্রথমে RFC 4893, ২০০৭; এখন RFC 6793), মোট প্রায় ৪৩০ কোটি নম্বর। পুরোনো ১৬ bit-এর router-এর সাথে কথা বলতে একটি বিশেষ নম্বর ব্যবহার হয়: AS 23456 (AS_TRANS).
- লেখার ধরন: ৩২ bit ASN সাধারণ সংখ্যা হিসেবে লেখা হয় (asplain, যেমন 65551); কিছু জায়গায় “উপরের ১৬ bit.নিচের ১৬ bit” (asdot) — 65551 = 1.15, কারণ ৬৫,৫৫১ = ১ × ৬৫,৫৩৬ + ১৫ (RFC 5396).
| ASN | কী জন্য | সূত্র |
|---|---|---|
0 | সংরক্ষিত — কোনো route-এর পথে থাকতে পারে না | RFC 7607 |
23456 | AS_TRANS — পুরোনো ১৬ bit router-এর জন্য বদলি নম্বর | RFC 6793 |
64496–64511 | Documentation (১৬ bit) — বই আর উদাহরণে | RFC 5398 |
64512–65534 | Private ASN (১৬ bit) | RFC 6996 |
65535 | সংরক্ষিত | RFC 7300 |
65536–65551 | Documentation (৩২ bit) | RFC 5398 |
4200000000–4294967294 | Private ASN (৩২ bit) | RFC 6996 |
4294967295 | সংরক্ষিত (সবচেয়ে বড় ৩২ bit মান) | RFC 7300 |
এই পর্বের সব উদাহরণে শুধু documentation range-এর ASN (64496–64511, 65536–65551) আর documentation prefix (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 — documentation address) ব্যবহার করা হয়েছে, যাতে কোনো আসল প্রতিষ্ঠানের নম্বর ভুলবশত কনফিগারেশনে না ঢোকে। Private ASN private IP-র মতো: শুধু একটি ISP-র সাথে BGP চালানো গ্রাহককে ISP তা দিতে পারে, আর বাইরে ঘোষণার আগে AS_PATH থেকে মুছে দেয়।
তিন ধরনের AS
Stub AS
বাইরের সাথে একটিই সংযোগ (একটি provider). নিজের prefix ছাড়া কিছু ঘোষণা করে না। প্রায়ই BGP-রই দরকার হয় না — provider একটি static route দেয়, আর গ্রাহক ব্যবহার করে default route. মহল্লার কানাগলির শেষ বাড়ি।
একটি দরজাMultihomed AS
দুই বা বেশি provider — একটি নষ্ট হলে অন্যটি দিয়ে চলে। ব্যাংক, বিশ্ববিদ্যালয়, বড় অফিস। নিজের prefix সব provider-কে জানায়, কিন্তু অন্যের traffic বহন করে না। এক provider-এর route অন্য provider-কে জানিয়ে ফেললে সেটি route leak (অংশ ৪)।
দুই দরজা, কিন্তু রাস্তা নয়Transit AS
অন্যের traffic নিজের নেটওয়ার্ক দিয়ে পার করে — ISP আর বড় backbone. এদের ব্যবসাই হলো অন্যকে পুরো ইন্টারনেটে পৌঁছে দেওয়া (IP transit), টাকার বিনিময়ে।
মহাসড়ক৩ · BGP — path vector, session আর বার্তা
পর্ব ২৩-এর distance vector-এ প্রতিবেশী শুধু বলত “ওই গন্তব্যে আমার দূরত্ব ৩”. BGP বলে আরও বেশি: “203.0.113.0/24-এ যাওয়া যায়, আর পথটি এই AS-গুলোর ভেতর দিয়ে: 64498 64500”. পুরো পথের তালিকা পাঠায় বলে একে বলে path vector protocol. এর তিনটি বড় সুবিধা:
- Loop ধরা সহজ: কোনো ঘোষণার AS_PATH-এ নিজের ASN থাকলে AS সেটি সাথে সাথে ফেলে দেয় — ঘোষণাটি আগেই তার ভেতর দিয়ে গেছে। Distance vector-এর count-to-infinity (পর্ব ২৩) AS-স্তরে এভাবে এড়ানো যায়।
- নীতি প্রয়োগ: পথে কারা আছে দেখা যায়, তাই “এই AS-এর ভেতর দিয়ে যাওয়া পথ নেব না” জাতীয় নিয়ম লেখা যায়।
নিচের stepper একটি UPDATE বার্তার যাত্রা দেখায়। ছয়টি AS: দুটি বড় backbone 64496 আর 64497 (পরস্পর peer), তাদের customer আঞ্চলিক ISP 64498 আর 64499 (এরাও পরস্পর peer), 64498-এর customer 64500 — যে 203.0.113.0/24-এর মালিক — আর 64501, যার দুটি provider (64498 আর 64499). প্রতিটি AS পরের জনকে পাঠানোর আগে নিজের ASN AS_PATH-এর সামনে বসায়।
AS64496 ═══ peer ═══ AS64497 (backbone)
│ │
AS64498 ═══ peer ═══ AS64499 (আঞ্চলিক ISP)
│ ╲ ╱
AS64500 ╲── AS64501 ─╱ (64501-এর দুই provider)
203.0.113.0/24
│ = provider (ওপরে) – customer (নিচে) ═ = peer
| এই ধাপের UPDATE | |
| AS64498 | |
| AS64496 | |
| AS64497 | |
| AS64499 | |
| AS64501 |
- উৎস ঘোষণা করল। AS64500 নিজের prefix 203.0.113.0/24 তার provider 64498-কে জানাল। AS_PATH-এ শুধু তার নিজের নম্বর:
64500. NEXT_HOP হলো 64500-এর border router-এর ঠিকানা — “এই prefix-এর packet আমাকে দিন”. - 64498 নিজের নম্বর সামনে বসাল। Customer-এর route, তাই সবাইকে জানানো যায়: provider 64496, peer 64499 আর customer 64501 — সবাই পেল
64498 64500, NEXT_HOP এখন 64498-এর router. পথ এক AS লম্বা হলো। - 64496 জানাল peer-কে — আর 64498-কেও। তার কাছে route-টি customer থেকে শেখা, তাই সবাইকে জানানো চলে: 64497 পেল
64496 64498 64500. সরলতার জন্য ধরা হলো সে 64498-কেও ফেরত পাঠায়। - Loop ধরা পড়ল। 64498 দেখল AS_PATH
64496 64498 64500-এ তার নিজের নম্বর 64498 আছে — এই ঘোষণা আগেই তার ভেতর দিয়ে গেছে। ফেলে দিল — শুধু তালিকায় একটি খোঁজ, কোনো timer লাগল না। - Peer-এর route শুধু customer-কে। 64497 route-টি পেয়েছে peer থেকে, তাই জানাবে শুধু নিজের customer 64499-কে। 64499-এর এখন দুটি পথ: peer থেকে
64498 64500আর provider থেকে64497 64496 64498 64500. Peer-এর route সস্তা আর ছোট — সেটিই সেরা। - 64499-এর সেরা পথ peer-এর, তাই যায় শুধু customer-এ। 64499 provider 64497 বা peer 64498-কে কিছু জানায় না, শুধু customer 64501-কে:
64499 64498 64500. 64501-এর দুটি provider-পথের মধ্যে ছোটটি (64498 64500) জেতে। কেন এই “শুধু customer-কে” নিয়ম — অংশ ৪-এ।
Session: TCP port 179 আর হাতে বাঁধা প্রতিবেশী
OSPF-এর মতো BGP নিজে প্রতিবেশী খোঁজে না। দুই router-এর অপারেটর আগে থেকে ঠিক করেন কে কার BGP peer, তারপর দুই পাশে প্রতিবেশীর ঠিকানা আর ASN কনফিগার করেন। Router দুটি TCP port 179-এ সংযোগ খোলে (TCP-র handshake আর state পর্ব ২৯-এ)। TCP নির্ভরযোগ্য আর ক্রমিক পৌঁছানো নিশ্চিত করে, তাই BGP শুরুতে একবার পুরো table পাঠিয়ে পরে শুধু পরিবর্তন পাঠায় — RIP-এর মতো প্রতি ৩০ সেকেন্ডে পুরো table নয়।
| Type | বার্তা | কাজ |
|---|---|---|
| 1 | OPEN | TCP সংযোগের পর প্রথম বার্তা: version (4), নিজের ASN, hold time, BGP Identifier (router ID), আর capability (যেমন ৩২ bit ASN, IPv6 route বহন) |
| 2 | UPDATE | নতুন route ঘোষণা (prefix + path attribute) আর পুরোনো route প্রত্যাহার (withdrawal) — একই বার্তায় দুটোই থাকতে পারে |
| 3 | NOTIFICATION | ত্রুটির খবর (যেমন ভুল ASN); তারপর session বন্ধ |
| 4 | KEEPALIVE | “আমি বেঁচে আছি” — শুধু ১৯ byte-এর header. নিয়মিত পাঠানো হয় (সাধারণত hold time-এর তিন ভাগের এক ভাগ পরপর) |
| 5 | ROUTE-REFRESH | পরে যোগ হওয়া (RFC 2918): session না ভেঙে আবার পুরো table চাওয়া |
প্রতিটি BGP বার্তার header (১৯ byte)
┌──────────────────────────────────────────────┐
│ Marker — ১৬ byte, সব bit 1 (FF FF … FF) │
├───────────────────────┬──────────────────────┤
│ Length — ২ byte │ Type — ১ byte │
│ (১৯ থেকে ৪০৯৬) │ 1 OPEN … 4 KEEPALIVE │
└───────────────────────┴──────────────────────┘
UPDATE-এর বাকি অংশ: Withdrawn Routes │ Path Attributes │ NLRI (prefix-গুলো)
Hold time হলো কতক্ষণ প্রতিবেশীর কোনো বার্তা না পেলে session মৃত ধরা হবে। RFC 4271 hold time ৯০ সেকেন্ড আর KEEPALIVE ৩০ সেকেন্ড পরপর প্রস্তাব করে (vendor ভেদে ডিফল্ট আলাদা)। তাই নীরব ব্যর্থতা ধরতে মিনিট দেড়েক লাগতে পারে; বাস্তবে BFD-এর মতো দ্রুত পদ্ধতিও সাথে রাখা হয়।
BGP session-এর অবস্থাগুলো একটি finite state machine মেনে চলে: Idle (কিছুই হচ্ছে না, শুরু করার অপেক্ষা) → Connect (TCP সংযোগের চেষ্টা) → Active (চেষ্টা ব্যর্থ, আবার চেষ্টা বা প্রতিবেশীর সংযোগের অপেক্ষা) → OpenSent (OPEN পাঠানো হয়েছে) → OpenConfirm (প্রতিবেশীর OPEN পাওয়া গেছে, KEEPALIVE-এর অপেক্ষা) → Established (UPDATE বিনিময় চলছে)। Router-এর আউটপুটে অনেকক্ষণ “Active” দেখা মানে সাধারণত সমস্যা — TCP সংযোগই হচ্ছে না।
eBGP আর iBGP
দুই আলাদা AS-এর router-এর session হলো eBGP (external); একই AS-এর ভেতরের দুই router-এর session iBGP (internal). বড় ISP-র border router-গুলো বাইরের route শেখে, আর iBGP দিয়ে তা ভেতরের সব router-কে জানায়। নিয়মের পার্থক্য:
- AS_PATH: eBGP-তে পাঠানোর সময় নিজের ASN যোগ হয়; iBGP-তে AS_PATH বদলায় না — একই AS-এর ভেতরে আছেন।
- NEXT_HOP: eBGP-তে নিজের ঠিকানা বসে; iBGP-তে ডিফল্ট আচরণে বদলায় না (বাইরের প্রতিবেশীর ঠিকানাই থাকে)। ভেতরের router সেই ঠিকানায় পৌঁছায় IGP দিয়ে — তাই BGP-র পাশাপাশি IGP-ও লাগে (অথবা border router-এ “next-hop-self”).
- Full mesh: iBGP-তে AS_PATH বদলায় না বলে loop ধরার উপায় নেই। তাই নিয়ম: iBGP প্রতিবেশীর কাছে শেখা route আরেক iBGP প্রতিবেশীকে জানানো যাবে না। ফলে প্রতিটি router-কে প্রতিটি router-এর সাথে সরাসরি session রাখতে হয় — n টি router-এ n(n − ১)/২ টি session. ১০০টি router-এ ৪,৯৫০টি!
- সমাধান — route reflector: একটি (বা নিরাপত্তার জন্য দুটি) router-কে নিয়মের ব্যতিক্রম করা হয় (RFC 4456): সে client-দের কাছে শেখা route অন্য client-দের “প্রতিফলিত” করে। প্রতিটি client-এর তখন শুধু reflector-এর সাথে session. আরেক পদ্ধতি confederation — বড় AS-কে কয়েকটি ছোট ভেতরের AS-এ ভাগ করা (RFC 5065).
আপনার কম্পিউটারে BGP নেই — যাচাই করে দেখুন
সাধারণ host বা বাসার router BGP চালায় না; একটি default route-ই যথেষ্ট (পর্ব ২২)। BGP চলে ISP, data center আর বড় প্রতিষ্ঠানের border router-এ (Linux-এ BIRD বা FRRouting দিয়েও)। নিচের স্ক্রিপ্ট এই পাতার কোড-চালানোর container-এ খোঁজে: কোনো BGP software আছে কি না, port 179-এ কোনো TCP socket আছে কি না (/proc/net/tcp-এ port লেখা থাকে hex-এ: ১৭৯ = 00B3), আর kernel-এর route-গুলোর কয়টি BGP বসিয়েছে।
echo "== BGP software on this machine? =="
for d in bird bgpd gobgpd vtysh; do
command -v "$d" >/dev/null && echo " $d: found" || echo " $d: not found"
done
echo "== any TCP socket on port 179 (= 0x$(printf '%04X' 179))? =="
if grep -qi ':00B3 ' /proc/net/tcp /proc/net/tcp6 2>/dev/null; then
grep -i ':00B3 ' /proc/net/tcp /proc/net/tcp6
else
echo " none - this machine is not a BGP speaker"
fi
echo "== routes in this kernel =="
if command -v ip >/dev/null; then
echo " IPv4 routes: $(ip -4 route | wc -l), installed by BGP: $(ip -4 route | grep -c 'proto bgp')"
else
echo " ip not found; /proc/net/route entries: $(( $(wc -l < /proc/net/route) - 1 ))"
fiআসল রানের আউটপুট:
== BGP software on this machine? ==
bird: not found
bgpd: not found
gobgpd: not found
vtysh: not found
== any TCP socket on port 179 (= 0x00B3)? ==
none - this machine is not a BGP speaker
== routes in this kernel ==
IPv4 routes: 2, installed by BGP: 0
কোনো BGP software নেই (BIRD-এর bird, FRRouting-এর bgpd আর vtysh, GoBGP-র gobgpd), আর /proc/net/tcp-এ port 00B3-এর কোনো socket নেই — এই container BGP বলে না। Kernel-এ IPv4 route মাত্র ২টি (পর্ব ১৫-এর মতো: নিজের subnet আর একটি default), আর BGP-র বসানো (proto bgp) ০টি। তুলনা করুন: ইন্টারনেটের “full table” নেওয়া একটি border router-এ প্রায় দশ লক্ষ IPv4 route. আপনার কম্পিউটারের packet default route ধরে ISP-র router-এ যায়, আর সেখান থেকে শুরু হয় BGP-র জগৎ। নিজের ল্যাবে BGP দেখতে চাইলে কয়েকটি VM বা container-এ FRRouting চালিয়ে নিজেদের মধ্যে documentation ASN দিয়ে session বানাতে পারেন।
৪ · ব্যবসার সম্পর্ক — transit, peering আর valley-free নিয়ম
দুটি AS-এর মাঝে BGP session থাকা মানেই তারা সমান নয়। প্রতিটি সংযোগের পেছনে একটি ব্যবসায়িক চুক্তি, আর চুক্তি ঠিক করে কে কাকে কোন route জানাবে। মূল সম্পর্ক দুটি:
Customer – provider
Customer টাকা দেয়, provider তাকে পুরো ইন্টারনেটে পৌঁছে দেয় (transit). Provider customer-এর prefix সবাইকে জানায়, আর customer-কে দেয় পুরো table বা শুধু একটি default route.
টাকা যায় ওপরের দিকেSettlement-free peering
দুই AS নিজেদের customer-দের মধ্যের traffic বিনা টাকায় সরাসরি বিনিময় করে — কারণ দুজনেরই transit-এর খরচ কমে। কিন্তু peer আপনাকে বাকি ইন্টারনেটে পৌঁছে দেবে না। Traffic খুব অসমান হলে কখনো টাকা দিয়ে peering (paid peering) হয়।
সমানে সমানে, শুধু নিজেদেরটাকার দিক থেকেই পছন্দের ক্রম আসে: customer-এর দিকে traffic পাঠালে আয়, peer-এ খরচ নেই, provider-এ খরচ। তাই একই prefix-এর একাধিক route থাকলে সাধারণ নীতি: customer route > peer route > provider route — AS_PATH যত লম্বাই হোক। বাস্তবে এটি বসানো হয় LOCAL_PREF দিয়ে (যেমন customer 200, peer 150, provider 100 — সংখ্যাগুলো প্রতিটি নেটওয়ার্কের নিজের পছন্দ, কোনো মান নয়)।
Export নিয়ম — কাকে কোন route জানাবেন
২০০০–২০০১ সালে Lixin Gao আর Jennifer Rexford এই ব্যবসায়িক যুক্তিকে নিয়মে বাঁধেন, যা আজ Gao-Rexford নিয়ম নামে পরিচিত:
| Route কার কাছ থেকে শেখা | Customer-কে জানাবেন? | Peer-কে? | Provider-কে? |
|---|---|---|---|
| নিজের prefix | হ্যাঁ | হ্যাঁ | হ্যাঁ |
| Customer | হ্যাঁ | হ্যাঁ | হ্যাঁ — এজন্যই customer টাকা দেয় |
| Peer | হ্যাঁ | না | না |
| Provider | হ্যাঁ | না | না |
কেন “না”? Provider-এর route peer-কে জানালে peer সেই traffic আপনাকে দেবে, আর আপনি তা টাকা দিয়ে provider-কে দিয়ে বহন করাবেন — peer বিনা টাকায় সেবা পেল, বিল এলো আপনার নামে। Peer-এর route provider-কে জানালেও একই লোকসান।
এই নিয়ম মানলে প্রতিটি বৈধ পথের আকার হয় একটি পাহাড়ের মতো: উৎস থেকে কয়েক ধাপ ওপরে (customer → provider), তারপর বড়জোর একটি peer link পাশাপাশি, তারপর কয়েক ধাপ নিচে (provider → customer). মাঝে কোথাও নিচে নেমে আবার ওপরে ওঠা — একটি “উপত্যকা” (valley) — থাকতে পারে না। তাই নাম valley-free routing. ওপরের ছয় AS-এর ছবিতে কয়েকটি পথ যাচাই করি (AS_PATH ডান থেকে বামে পড়ুন — উৎস থেকে গ্রাহকের দিকে):
| কে শিখল | AS_PATH | উৎস থেকে ধাপগুলো | ফল |
|---|---|---|---|
| AS64501 | 64499 64498 64500 | 64500→64498 ওপরে, 64498→64499 peer, 64499→64501 নিচে | বৈধ |
| AS64499 | 64497 64496 64498 64500 | ওপরে, ওপরে, peer, নিচে | বৈধ |
| AS64497 | 64499 64498 64500 | ওপরে, peer (64498→64499), তারপর ওপরে (64499→64497) | অবৈধ — peer-এর পর ওপরে ওঠা; 64499 peer route provider-কে দিয়েছে |
| AS64497 | 64499 64501 64498 64500 | ওপরে, নিচে (64498→64501), আবার ওপরে (64501→64499), ওপরে | অবৈধ — উপত্যকা; 64501 route leak করেছে |
Gao আর Rexford আরও দেখান: সব AS যদি customer route-কে বেশি পছন্দ করে, এই export নিয়ম মানে, আর customer-provider সম্পর্কে কোনো চক্র না থাকে (কেউ পরোক্ষে নিজেরই provider নয়), তবে BGP-র route বাছাই নিশ্চিতভাবে একটি স্থির অবস্থায় পৌঁছায়। সাধারণ BGP-তে এই নিশ্চয়তা নেই — বিরোধী নীতিতে route চিরকাল দোলাচলে থাকতে পারে। অর্থাৎ যে নিয়ম টাকা বাঁচায়, সেটিই ইন্টারনেটকে স্থিরও রাখে।
এবার একই ছয় AS-এ পুরো propagation চালাই। Simulator প্রতিটি AS-এর প্রতিবেশীর সেরা route থেকে প্রার্থী বানায়, export নিয়ম মানে, নিজের ASN থাকা পথ বাতিল করে, আর সেরাটি বাছে (আগে সম্পর্ক — customer, peer, provider — তারপর ছোট AS_PATH, শেষে কম ASN-এর প্রতিবেশী)। কিছু না বদলানো পর্যন্ত চলে। তারপর একই কাজ আবার, কিন্তু এবার multihomed AS64501 নিয়ম ভেঙে সব route সবাইকে জানায় — একটি route leak.
// [provider, customer] or [a, b, "peer"]. AS 64500 originates 203.0.113.0/24.
const links = [[64496, 64497, "peer"], [64496, 64498], [64497, 64499],
[64498, 64499, "peer"], [64498, 64500], [64498, 64501], [64499, 64501]];
const rel = {}; // rel[a][n] = what n is for a
const set = (a, n, r) => ((rel[a] ??= {})[n] = r);
links.forEach(([a, b, p]) => p ? (set(a, b, "peer"), set(b, a, "peer"))
: (set(a, b, "cust"), set(b, a, "prov")));
const PREF = { self: 4, cust: 3, peer: 2, prov: 1 }; // LOCAL_PREF by relationship
const better = (x, y) => PREF[x.from] - PREF[y.from] || y.path.length - x.path.length ||
y.path[0] - x.path[0];
function simulate(leaker) {
const best = { 64500: { from: "self", path: [] } };
let loops, changed = true;
while (changed) {
changed = false; loops = [];
for (const a of Object.keys(rel).map(Number)) {
let cand = best[a]?.from === "self" ? best[a] : null;
for (const [n, r] of Object.entries(rel[a])) {
const b = best[n]; // valley-free: own/customer routes to all, others only to customers
if (!b || !(b.from === "self" || b.from === "cust" || rel[n][a] === "cust" || +n === leaker)) continue;
const path = [+n, ...b.path]; // n prepends its own ASN
if (path.includes(a)) { loops.push(`AS${a} rejects ${path.join(" ")}`); continue; }
if (!cand || better({ from: r, path }, cand) > 0) cand = { from: r, path };
}
if (JSON.stringify(cand) !== JSON.stringify(best[a])) { best[a] = cand; changed = true; }
}
}
return { best, loops };
}
const p = r => r.path.join(" ") || "(own prefix)", ok = simulate(0), leak = simulate(64501);
console.log("== valley-free == learned-from AS_PATH");
for (const a in ok.best) console.log(` AS${a} ${ok.best[a].from.padEnd(4)} ${p(ok.best[a])}`);
console.log("loop check:\n " + ok.loops.join("\n ") + "\n== AS64501 leaks ==");
for (const a in leak.best) if (p(leak.best[a]) !== p(ok.best[a]))
console.log(` AS${a} ${p(ok.best[a])} -> ${p(leak.best[a])} (${leak.best[a].from})`);আউটপুট:
== valley-free == learned-from AS_PATH
AS64496 cust 64498 64500
AS64497 peer 64496 64498 64500
AS64498 cust 64500
AS64499 peer 64498 64500
AS64500 self (own prefix)
AS64501 prov 64498 64500
loop check:
AS64498 rejects 64496 64498 64500
AS64500 rejects 64498 64500
== AS64501 leaks ==
AS64497 64496 64498 64500 -> 64499 64501 64498 64500 (cust)
AS64499 64498 64500 -> 64501 64498 64500 (cust)
স্বাভাবিক অবস্থা stepper-এর সাথে হুবহু মেলে। 64496 আর 64498 route পেয়েছে customer থেকে, 64497 আর 64499 peer থেকে, আর 64501 provider থেকে — দুটি provider-পথের মধ্যে ছোটটি। Loop check: 64496 route-টি যার কাছ থেকে শিখেছে, সেই 64498-কেও পাঠায়, আর 64498 নিজের নম্বর দেখে বাতিল করে; একইভাবে উৎস 64500 নিজের prefix-এর ফেরত ঘোষণা বাতিল করে।
Leak: 64501 provider 64498-এর কাছে শেখা 64498 64500 অন্য provider 64499-কে জানাল। 64499-এর চোখে এটি এখন customer route — peer route-এর চেয়ে প্রিয়, যদিও এক AS লম্বা। তাই 64499 সব traffic পাঠাল ছোট্ট 64501-এর ভেতর দিয়ে, আর customer route বলে জানাল নিজের provider 64497-কেও; 64497-ও peer route ছেড়ে customer route নিল। দুটি বড় নেটওয়ার্কের traffic এখন একটি ছোট AS-এর সরু link দিয়ে — ফল ভিড়, packet loss, বিভ্রাট। লক্ষ করুন, 64496 বদলায়নি: তার customer route আগে থেকেই সবচেয়ে প্রিয়। নিজে চেষ্টা করুন: simulate(64501)-এর জায়গায় simulate(64499) লিখে দেখুন — 64499 leak করলে কে কে প্রভাবিত হয়?
Route leak প্রায়ই দুর্ঘটনা: RFC 7908 (২০১৬) route leak-কে সংজ্ঞায়িত করে — কোনো ঘোষণাকে তার উদ্দেশ্যের বাইরে ছড়িয়ে দেওয়া। সবচেয়ে প্রচলিত কারণ একটি multihomed গ্রাহকের ভুল কনফিগারেশন (export filter নেই), আর provider-ও গ্রাহকের কাছ থেকে যা আসে তা যাচাই না করে নিয়ে নেয়। ২০১৯ সালের জুনে যুক্তরাষ্ট্রে এমনই একটি ঘটনায় একটি ছোট নেটওয়ার্কের leak একটি বড় provider যাচাই ছাড়া গ্রহণ করে ছড়িয়ে দেয়, আর কয়েক ঘণ্টা ধরে অনেক বড় সেবায় সমস্যা হয়। প্রতিরক্ষা দুই দিকেই: গ্রাহক export filter বসাবে, provider customer-এর কাছ থেকে শুধু তার নিজের prefix নেবে (অংশ ৮)।
৫ · Tier, IXP আর বাংলাদেশ
পর্ব ০২-এ ইন্টারনেটের স্তরগুলো মোটা দাগে দেখেছেন (network-types-topologies). এবার BGP-র চোখে:
- Tier-1: যে নেটওয়ার্ক কারও কাছ থেকে transit কেনে না, বাকি সব tier-1-এর সাথে peering করেই পুরো ইন্টারনেটে পৌঁছায় (“transit-free”). কোনো সরকারি তালিকা নেই, আর কে tier-1 তা নিয়ে সংজ্ঞা ও মত ভিন্ন।
- Tier-2: কিছু transit কেনে, আবার অনেকের সাথে peering করে, আর নিজেও অন্যকে transit বিক্রি করে। বেশিরভাগ বড় আঞ্চলিক আর জাতীয় ISP এমন।
- Tier-3 / access ISP: মূলত transit কেনে আর শেষ গ্রাহককে সংযোগ দেয়।
তবে আজকের ইন্টারনেট আর পরিষ্কার পিরামিড নয়। বড় content কোম্পানি আর CDN নিজস্ব backbone নিয়ে হাজারো ISP-র সাথে সরাসরি peering করে, ফলে অনেক traffic tier-1-কে ছোঁয়ই না। একে বলা হয় ইন্টারনেটের “চ্যাপ্টা হয়ে যাওয়া” (flattening).
IXP — এক জায়গায় অনেকের peering
দুই ISP peering করতে চাইলে তাদের মাঝে একটি তার লাগে। ৫০টি ISP সবাই সবার সাথে আলাদা তার টানলে লাগবে ৫০ × ৪৯ ÷ ২ = ১,২২৫টি link. IXP (Internet Exchange Point) এর সমাধান: একটি ভবনে একটি বড় switch-এর কাঠামো (layer 2), প্রতিটি সদস্য একটি port-এ যুক্ত হয়, আর সেই একই port দিয়ে অনেক সদস্যের সাথে BGP session চালায়। অনেক IXP-তে একটি route server থাকে — সদস্যরা শুধু তার সাথে একটি session খুলে সবার route পায় (multilateral peering). Route server নিজে traffic বহন করে না, শুধু route পৌঁছে দেয়, আর সাধারণত নিজের ASN AS_PATH-এ যোগ করে না (RFC 7947).
IXP-র লাভ: খরচ (দেশের traffic আর কেনা আন্তর্জাতিক transit দিয়ে যায় না), গতি আর স্থিতিস্থাপকতা। গতির একটি হিসাব: ঢাকার দুই ISP-র মধ্যে কোনো সরাসরি বা IXP-পথ না থাকলে তাদের traffic হয়তো সিঙ্গাপুরের মতো কোনো বিদেশি exchange ঘুরে আসে (একে বলে tromboning). ঢাকা থেকে সিঙ্গাপুর সরলরেখায় প্রায় ২,৯০০ কিমি. এক দিকের যাত্রা ঢাকা → সিঙ্গাপুর → ঢাকা = প্রায় ৫,৮০০ কিমি, আর round trip তার দ্বিগুণ = ১১,৬০০ কিমি. Fiber-এ আলো চলে প্রায় ২ × ১০৮ মিটার/সেকেন্ডে, অর্থাৎ প্রতি কিমিতে ৫ µs (পর্ব ০৫)। তাই শুধু propagation delay-ই কমপক্ষে ১১,৬০০ × ৫ µs = ৫৮ ms — বাস্তবের cable সরলরেখায় যায় না বলে এর চেয়ে বেশি। দেশের ভেতরের IXP দিয়ে একই RTT সাধারণত কয়েক ms.
বাংলাদেশের প্রেক্ষাপট (সাধারণ চিত্র, যাচাই করে নেবেন): দেশে ISP-দের মধ্যে traffic বিনিময়ের জন্য IXP আছে — পর্ব ০২-এ BDIX-সহ দেশীয় exchange-এর কথা এসেছে। আন্তর্জাতিক bandwidth দেশে আনা আর বাইরের নেটওয়ার্কের সাথে সংযোগের জন্য নিয়ন্ত্রক সংস্থা BTRC IIG (International Internet Gateway) লাইসেন্স দেয়; ISP-রা সাধারণত IIG-র কাছ থেকে আন্তর্জাতিক bandwidth কেনে। দেশের নেটওয়ার্কগুলোর ASN আর IP ঠিকানা আসে APNIC থেকে। লাইসেন্সের কাঠামো, IXP-র সংখ্যা আর সদস্য-তালিকা সময়ের সাথে বদলায় — তাই নির্দিষ্ট তথ্যের জন্য BTRC-র প্রকাশনা আর সংশ্লিষ্ট IXP-র নিজের ওয়েবসাইট দেখুন; কোন নেটওয়ার্ক কোন IXP-তে আছে, তা PeeringDB-র মতো উন্মুক্ত ডেটাবেসেও অনেক সময় পাওয়া যায়।
৬ · BGP attribute আর best-path selection
একটি router একই prefix-এর জন্য অনেক প্রতিবেশীর কাছ থেকে route পেতে পারে। বেছে নেয় প্রতিটি route-এর সাথে আসা path attribute দেখে। মূল attribute-গুলো:
| Attribute | কী বলে | কোথায় যায় | কোনটি ভালো |
|---|---|---|---|
| LOCAL_PREF | এই AS-এর নিজের পছন্দ — ব্যবসায়িক নীতি এখানেই বসে | শুধু AS-এর ভেতরে (iBGP); বাইরে যায় না | বেশি |
| AS_PATH | পথের AS-গুলোর তালিকা; loop ধরা আর দৈর্ঘ্য তুলনা | সবখানে, প্রতি eBGP-তে এক নম্বর বাড়ে | ছোট |
| ORIGIN | route কীভাবে BGP-তে ঢুকেছে: IGP (নিজে ঘোষণা), EGP (পুরোনো EGP protocol থেকে), INCOMPLETE (অন্য উৎস থেকে redistribute) | সবখানে | IGP < EGP < INCOMPLETE |
| MED | Multi-Exit Discriminator: প্রতিবেশী AS-কে ইঙ্গিত — “আমার কোন দরজা দিয়ে ঢুকলে ভালো” | শুধু পাশের AS পর্যন্ত, আর ছড়ায় না | কম |
| NEXT_HOP | এই prefix-এর packet কোন ঠিকানায় পাঠাতে হবে | eBGP-তে বদলায়, iBGP-তে সাধারণত নয় | পৌঁছানো যেতে হবে |
| COMMUNITY | ৩২ bit-এর লেবেল, “ASN:মান” আকারে (RFC 1997); নীতির সংকেত পাঠাতে | সাধারণত সামনে যায় (optional transitive) | তুলনা হয় না — নীতি ঠিক করে |
বাছাইয়ের ক্রম (সরল রূপ)
RFC 4271-এর বাছাই একটি ক্রমিক ছাঁকনি: প্রতিটি ধাপে যারা সেরা, শুধু তারাই পরের ধাপে যায়। আগের শর্ত: NEXT_HOP-এ পৌঁছানো যেতে হবে।
- সবচেয়ে বেশি LOCAL_PREF — নিজের নীতি সবার আগে।
- সবচেয়ে ছোট AS_PATH — কম AS পেরোনো।
- সবচেয়ে কম ORIGIN — IGP, তারপর EGP, তারপর INCOMPLETE.
- সবচেয়ে কম MED — তবে শুধু একই প্রতিবেশী AS থেকে আসা route-গুলোর মধ্যে তুলনা (ডিফল্ট আচরণ)।
- eBGP-তে শেখা route, iBGP-র চেয়ে আগে।
- NEXT_HOP পর্যন্ত সবচেয়ে কম IGP cost — নিজের নেটওয়ার্ক থেকে সবচেয়ে কাছের বের হওয়ার দরজা।
- Tie-breaker: সবচেয়ে কম BGP Identifier (router ID) যে router পাঠিয়েছে তার route, তারপর সবচেয়ে কম প্রতিবেশী-ঠিকানা।
Vendor-এর বাড়তি ধাপ মান নয়: Cisco-র router-এ সবার আগে আছে “weight” (শুধু ওই router-এর ভেতরের, বেশি ভালো) — এটি RFC-তে নেই, অন্য vendor-এ নেই বা অন্যভাবে আছে। “নিজের ঘোষণা করা route আগে”, “পুরোনো eBGP route আগে”, always-compare-med, multipath — এসবও vendor বা কনফিগারেশন-নির্ভর; নিজের router-এর ডকুমেন্টেশন দেখুন।
একটি উদাহরণ: AS64500-এর router R1-এর কাছে 203.0.113.0/24-এর জন্য সাতটি route. Route ১, ২, ৩ আর ৭ এসেছে iBGP দিয়ে (AS-এর অন্য border router থেকে), বাকিগুলো সরাসরি eBGP-তে। সব route-এর শেষ AS 64510 — prefix-টির উৎস।
| Route | AS_PATH | LOCAL_PREF | ORIGIN | MED | শেখা | IGP cost | Router ID |
|---|---|---|---|---|---|---|---|
| ১ | 64501 64510 | 100 | IGP | 30 | iBGP | 10 | 192.0.2.2 |
| ২ | 64501 64510 | 100 | IGP | 10 | iBGP | 30 | 192.0.2.3 |
| ৩ | 64502 64510 | 100 | IGP | 0 | iBGP | 20 | 192.0.2.4 |
| ৪ | 64503 64510 | 100 | INCOMPLETE | 0 | eBGP | 0 | 192.0.2.6 |
| ৫ | 64504 64511 64510 | 100 | IGP | 0 | eBGP | 0 | 192.0.2.7 |
| ৬ | 64505 64510 | 80 | IGP | 0 | eBGP | 0 | 192.0.2.8 |
| ৭ | 64506 64510 | 100 | IGP | 0 | iBGP | 20 | 192.0.2.5 |
| ১ · 64501 64510 | |
| ২ · 64501 64510 | |
| ৩ · 64502 64510 | |
| ৪ · 64503 64510 | |
| ৫ · 64504 64511 64510 | |
| ৬ · 64505 64510 | |
| ৭ · 64506 64510 | |
| বাকি আছে |
- শুরু: সাতটি প্রার্থী। সবার NEXT_HOP-এ পৌঁছানো যায়, কোনোটি import নীতিতে বাদ পড়েনি। এবার ছাঁকনি একে একে।
- ধাপ ১ — LOCAL_PREF. সবচেয়ে বেশি 100; route ৬-এর 80, বাদ। হয়তো 64505 একটি দামি provider. Route ৬-এর AS_PATH ছোট হলেও কিছু যায় আসে না — নীতি আগে।
- ধাপ ২ — AS_PATH-এর দৈর্ঘ্য। বাকিদের বেশিরভাগের পথে ২টি AS, route ৫-এ ৩টি (
64504 64511 64510) — বাদ। - ধাপ ৩ — ORIGIN. Route ৪-এর ORIGIN INCOMPLETE (অন্য কোনো উৎস থেকে BGP-তে redistribute করা), বাকিরা IGP — route ৪ বাদ। এটিই ছিল একমাত্র eBGP route যা এ পর্যন্ত টিকে ছিল।
- ধাপ ৪ — MED, শুধু একই প্রতিবেশীর মধ্যে। Route ১ আর ২ দুটোই AS64501 থেকে — তাদের MED তুলনা হয়: 30 বনাম 10, route ১ বাদ। Route ৩ (AS64502) আর ৭ (AS64506) আলাদা প্রতিবেশীর, তাদের MED 0 হলেও route ২-এর 10-এর সাথে তুলনা হয় না।
- ধাপ ৫ — eBGP বনাম iBGP. বাকি তিনটিই iBGP, তাই কেউ বাদ পড়ল না। (Route ৪ টিকে থাকলে এখানেই জিতত।)
- ধাপ ৬ — NEXT_HOP পর্যন্ত IGP cost. Route ২-এর বের হওয়ার দরজা ৩০ দূরে, ৩ আর ৭-এর ২০ — route ২ বাদ। সবচেয়ে কাছের দরজা দিয়ে traffic বের করে দেওয়া: hot-potato routing.
- ধাপ ৭ — router ID. Route ৩ এসেছে 192.0.2.4 থেকে, route ৭ এসেছে 192.0.2.5 থেকে; কম ID-র route ৩ জিতল। এই ধাপ শুধু সিদ্ধান্ত নিশ্চিত করতে।
একই হিসাব কোডে। keepBest প্রতিটি ধাপে একটি “score” হিসাব করে (কম ভালো), সবচেয়ে কম score-এর route-গুলো রাখে আর বাকিদের বাদের তালিকা ছাপে। MED-এর ধাপে আগে প্রতিটি প্রতিবেশী AS (AS_PATH-এর প্রথম নম্বর)-এর সবচেয়ে কম MED বের করা হয়।
// Router R1 in AS 64500 has 7 candidate routes for 203.0.113.0/24.
// ebgp: learned from a neighbour AS (true) or from an iBGP peer (false).
const ORIGIN = { IGP: 0, EGP: 1, INCOMPLETE: 2 };
let routes = [
{ id: 1, path: [64501, 64510], lp: 100, origin: "IGP", med: 30, ebgp: false, igp: 10, rid: "192.0.2.2" },
{ id: 2, path: [64501, 64510], lp: 100, origin: "IGP", med: 10, ebgp: false, igp: 30, rid: "192.0.2.3" },
{ id: 3, path: [64502, 64510], lp: 100, origin: "IGP", med: 0, ebgp: false, igp: 20, rid: "192.0.2.4" },
{ id: 4, path: [64503, 64510], lp: 100, origin: "INCOMPLETE", med: 0, ebgp: true, igp: 0, rid: "192.0.2.6" },
{ id: 5, path: [64504, 64511, 64510], lp: 100, origin: "IGP", med: 0, ebgp: true, igp: 0, rid: "192.0.2.7" },
{ id: 6, path: [64505, 64510], lp: 80, origin: "IGP", med: 0, ebgp: true, igp: 0, rid: "192.0.2.8" },
{ id: 7, path: [64506, 64510], lp: 100, origin: "IGP", med: 0, ebgp: false, igp: 20, rid: "192.0.2.5" },
];
const ip = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const keepBest = (name, score) => { // keep only routes with the lowest score
const best = Math.min(...routes.map(score));
const out = routes.filter(r => score(r) !== best).map(r => r.id);
routes = routes.filter(r => score(r) === best);
console.log(name.padEnd(27) + (out.length ? "drop " + out.join(",") : "no change").padEnd(16) +
"left: " + routes.map(r => r.id).join(","));
};
keepBest("1 highest LOCAL_PREF", r => -r.lp);
keepBest("2 shortest AS_PATH", r => r.path.length);
keepBest("3 lowest ORIGIN", r => ORIGIN[r.origin]);
// 4. MED: compared only between routes from the SAME neighbour AS (first AS in path)
const minMed = {};
routes.forEach(r => { const n = r.path[0]; minMed[n] = Math.min(minMed[n] ?? Infinity, r.med); });
keepBest("4 lowest MED (same nbr AS)", r => (r.med > minMed[r.path[0]] ? 1 : 0));
keepBest("5 eBGP over iBGP", r => (r.ebgp ? 0 : 1));
keepBest("6 lowest IGP cost to NH", r => r.igp);
keepBest("7 lowest router ID", r => ip(r.rid));
const w = routes[0];
console.log(`BEST: route ${w.id}, AS_PATH ${w.path.join(" ")}, router ID ${w.rid}`);আউটপুট:
1 highest LOCAL_PREF drop 6 left: 1,2,3,4,5,7
2 shortest AS_PATH drop 5 left: 1,2,3,4,7
3 lowest ORIGIN drop 4 left: 1,2,3,7
4 lowest MED (same nbr AS) drop 1 left: 2,3,7
5 eBGP over iBGP no change left: 2,3,7
6 lowest IGP cost to NH drop 2 left: 3,7
7 lowest router ID drop 7 left: 3
BEST: route 3, AS_PATH 64502 64510, router ID 192.0.2.4
প্রতিটি লাইন stepper-এর একটি ধাপ। ধাপ ১-এ route ৬ (LP 80), ধাপ ২-এ route ৫ (তিনটি AS), ধাপ ৩-এ route ৪ (INCOMPLETE), ধাপ ৪-এ route ১ (একই AS64501-এর route ২-এর চেয়ে বেশি MED). ধাপ ৫-এ “no change” — বাকি তিনটিই iBGP. ধাপ ৬-এ route ২ (IGP cost 30), আর ধাপ ৭-এ router ID দিয়ে route ৩ জিতল। নিজে চেষ্টা করুন: route ৪-এর origin: "INCOMPLETE" বদলে "IGP" করে চালানোর আগে অনুমান করুন — কোন ধাপে, কে জিতবে? (উত্তর অনুশীলন ২-এ।)
Hot-potato routing — গরম আলুর মতো দ্রুত হাত থেকে ছাড়া
ধাপ ৬-এর একটি বড় প্রভাব আছে। ধরুন একটি বাংলাদেশি ISP-র একই প্রতিবেশী AS-এর সাথে দুটি সংযোগ — একটি ঢাকায়, একটি চট্টগ্রামে। ঢাকার কোনো গ্রাহকের packet-এর জন্য দুটি route-ই সমান (একই LOCAL_PREF, AS_PATH, MED), তাই সিদ্ধান্ত হয় IGP cost দিয়ে: ঢাকার দরজাটি কাছে, তাই packet সেখান দিয়েই বের হয়, যদিও গন্তব্য হয়তো চট্টগ্রামের দিকে। প্রতিটি AS এভাবে নিজের খরচ কমাতে traffic যত তাড়াতাড়ি সম্ভব অন্যের ঘাড়ে দেয় — গরম আলুর মতো, তাই নাম hot-potato routing. ফল asymmetric routing: দুই দিকের AS-ই নিজের কাছের দরজা বাছে বলে যাওয়া আর ফেরার পথ আলাদা হয় (traceroute, পর্ব ২০)। উল্টোটি “cold-potato” — নিজের backbone-এ traffic যতটা সম্ভব দূর পর্যন্ত বহন করা।
৭ · Traffic engineering আর anycast
Traffic engineering মানে traffic কোন পথে যাবে তা নিজের ইচ্ছামতো সাজানো। বের হওয়া traffic (outbound) নিয়ন্ত্রণ সহজ: নিজের router-এ LOCAL_PREF বদলালেই হলো। কঠিন হলো ঢোকা traffic (inbound) — সেটি ঠিক হয় অন্যদের router-এর সিদ্ধান্তে। আপনি শুধু ঘোষণাকে এমনভাবে সাজাতে পারেন যাতে অন্যরা আপনার পছন্দের পথ বাছে। চারটি প্রচলিত কৌশল:
| কৌশল | কীভাবে | সীমা |
|---|---|---|
| AS-path prepending | Backup provider-এর দিকে নিজের ASN কয়েকবার বসিয়ে ঘোষণা: 64500 64500 64500 — পথ লম্বা দেখায়, অন্যরা মূল provider-এর পথ বাছে | AS_PATH-এর দৈর্ঘ্য দ্বিতীয় ধাপ; অন্য AS-এর LOCAL_PREF (যেমন “customer route আগে”) এর চেয়ে শক্তিশালী। অতিরিক্ত prepend অর্থহীন আর table-এর জায়গা নষ্ট |
| আরও নির্দিষ্ট prefix | /23 সব জায়গায়, আর তার দুটি /24 আলাদা আলাদা provider-এ। Longest prefix match-এ /24 জেতে (পর্ব ১৫, ২২) | বিশ্বব্যাপী সাধারণত IPv4-এ /24 আর IPv6-এ /48-এর চেয়ে নির্দিষ্ট prefix গৃহীত হয় না; আর সবাই এমন করলে global table বাড়ে — aggregation-এর উল্টো |
| MED | একই প্রতিবেশীর সাথে কয়েকটি সংযোগে কোনটি দিয়ে ঢুকতে হবে তা জানানো | শুধু ঠিক পাশের AS পর্যন্ত, আর সে মানবে কি না তার নীতি |
| Community | Provider-এর প্রকাশিত community দিয়ে অনুরোধ: যেমন “64496:80” মানে provider-এর ভেতরে LOCAL_PREF 80 বসানো, বা কোনো অঞ্চলের peer-কে না জানানো | প্রতিটি provider-এর নিজের তালিকা, মান নয়; কিছু well-known community সর্বজনীন |
সুপরিচিত well-known community: NO_EXPORT (65535:65281) — নিজের AS-এর বাইরে আর জানানো নিষেধ, আর NO_ADVERTISE (65535:65282) — কাউকেই জানানো নিষেধ. DDoS-এর সময় প্রতিরক্ষার জন্য BLACKHOLE (65535:666, RFC 7999): আক্রান্ত একটি ঠিকানার route এই চিহ্নসহ provider-কে পাঠালে provider সেই ঠিকানার traffic নিজের প্রান্তেই ফেলে দেয় — ঠিকানাটি বিচ্ছিন্ন হয়, কিন্তু বাকি নেটওয়ার্ক বাঁচে (পর্ব ৫০)। ৩২ bit ASN-এর যুগে “ASN:মান” আকারে জায়গা কম পড়ায় এসেছে large community (RFC 8092).
একটি multihomed AS64500-এর সরল কনফিগারেশন — শুধু নিজের prefix জানানো (leak ঠেকাতে), আর backup provider-এর দিকে prepend:
! উদাহরণ — FRRouting-ধাঁচের syntax; vendor ভেদে লেখার ধরন আলাদা
router bgp 64500
neighbor 192.0.2.1 remote-as 64496 ! মূল provider
neighbor 198.51.100.1 remote-as 64497 ! backup provider
address-family ipv4 unicast
network 203.0.113.0/24
neighbor 192.0.2.1 prefix-list OWN-ONLY out
neighbor 198.51.100.1 prefix-list OWN-ONLY out
neighbor 198.51.100.1 route-map PREPEND-BACKUP out
exit-address-family
!
ip prefix-list OWN-ONLY seq 10 permit 203.0.113.0/24
!
route-map PREPEND-BACKUP permit 10
set as-path prepend 64500 64500OWN-ONLY নিশ্চিত করে এক provider-এর কাছে শেখা কিছুই অন্য provider-এ যায় না — অংশ ৪-এর leak এখানেই আটকে যেত। বাস্তবে প্রতিটি প্রতিবেশীর দিকে ঢোকার filter-ও লাগে, আর FRRouting-এর নতুন সংস্করণে কোনো নীতি না থাকলে eBGP route গ্রহণ বা ঘোষণাই হয় না। এটি শেখার উদাহরণ, সরাসরি কপি করার কনফিগারেশন নয়।
Anycast — একই ঠিকানা, অনেক জায়গা
Anycast-এ একই prefix পৃথিবীর অনেক জায়গা থেকে ঘোষণা করা হয়। প্রতিটি AS নিজের best-path selection অনুযায়ী তার কাছে “সবচেয়ে ভালো” জায়গাটি বাছে — ফলে ব্যবহারকারী সাধারণত কাছের কোনো সার্ভারে পৌঁছায় (BGP-র অর্থে কাছে, ভৌগোলিকভাবে সবসময় নয়)। DNS-এর root server-গুলো এর বড় উদাহরণ: নাম মাত্র ১৩টি (a থেকে m.root-servers.net), কিন্তু anycast-এর কারণে বিশ্বজুড়ে এদের এক হাজারেরও বেশি instance (সর্বশেষ সংখ্যা root-servers.org-এ দেখা যায়; DNS পর্ব ৩৫-এ)। CDN আর public DNS resolver-ও anycast ব্যবহার করে (পর্ব ৩৮)। আরেকটি লাভ: DDoS-এর traffic অনেক জায়গায় ভাগ হয়ে যায়।
৮ · BGP-র নিরাপত্তা — leak, hijack আর RPKI
মূল BGP-তে কোনো যাচাই নেই: প্রতিবেশী যা বলে, router তা বিশ্বাস করে। দুটি প্রধান সমস্যা:
- Prefix hijack: অন্যের prefix নিজের বলে ঘোষণা — হুবহু একই prefix (তাহলে কাছের AS-গুলো ভুল পথ নেয়) বা আরও নির্দিষ্ট prefix (তাহলে longest prefix match-এ প্রায় সবাই ভুল পথ নেয়)। বেশিরভাগ ঘটনা টাইপের ভুল বা কনফিগারেশনের ভুল; কিছু ইচ্ছাকৃত।
- Route leak: সঠিক উৎস, কিন্তু ঘোষণা ভুল জায়গায় ছড়ানো — valley-free নিয়ম ভাঙা (অংশ ৪)।
তিনটি শিক্ষণীয় ঘটনা (বিস্তারিত নিয়ে সূত্রভেদে পার্থক্য আছে):
২০০৮ — YouTube আর Pakistan Telecom. দেশের ভেতরে YouTube বন্ধের একটি আরও নির্দিষ্ট /24 route ভুলবশত upstream হয়ে সারা বিশ্বে ছড়ায়, আর প্রায় দুই ঘণ্টা YouTube-এর বড় অংশের traffic ভুল জায়গায় যায় — পুরো গল্প পর্ব ১৭-এ (subnetting).
২০১০ — China Telecom. ৮ এপ্রিল প্রায় ১৮ মিনিট ধরে China Telecom-এর নেটওয়ার্ক থেকে অন্য অনেক নেটওয়ার্কের বহু হাজার prefix ঘোষিত হয়। কতটা traffic আসলে ঘুরে গিয়েছিল, তা নিয়ে মতভেদ আছে।
২০২১ — Facebook-এর বিভ্রাট (hijack নয়). অক্টোবরের ৪ তারিখে প্রায় ছয় ঘণ্টা Facebook, Instagram আর WhatsApp বন্ধ ছিল। কোম্পানির প্রকাশিত ব্যাখ্যা অনুযায়ী, রক্ষণাবেক্ষণের একটি কমান্ড ভুলবশত backbone-এর সংযোগ বিচ্ছিন্ন করে; তখন তাদের DNS সার্ভারগুলো নকশামতো নিজেদের prefix-এর BGP ঘোষণা প্রত্যাহার করে, আর বিশ্বের কাছে তাদের DNS অদৃশ্য হয়ে যায়। কেউ অন্যের prefix দখল করেনি — নিজের route নিজেই সরে গেছে।
প্রতিরক্ষার স্তরগুলো
- Prefix filtering: Provider গ্রাহকের কাছ থেকে শুধু তার নিজের (আর তার গ্রাহকদের) prefix নেবে — তালিকা আসে IRR বা RPKI থেকে। সাথে max-prefix সীমা, আর private বা documentation-এর মতো “bogon” আর /24-এর চেয়ে নির্দিষ্ট IPv4 prefix বাতিল।
- IRR (Internet Routing Registry): উন্মুক্ত ডেটাবেস, যেখানে নেটওয়ার্করা লিখে রাখে “এই prefix এই AS থেকে ঘোষিত হবে” (route object, RPSL ভাষায়, RFC 2622). দুর্বলতা: সব IRR-এ লেখার অধিকার কঠোরভাবে যাচাই হয় না, আর পুরোনো তথ্য পড়ে থাকে।
- RPKI আর ROV: নিচে বিস্তারিত — cryptography দিয়ে যাচাইযোগ্য “কে কোন prefix-এর উৎস হতে পারে”.
- BGPsec (RFC 8205, ২০১৭): পথের প্রতিটি AS স্বাক্ষর দেয়, তাই পুরো AS_PATH যাচাই করা যায়; কিন্তু ভারী আর সবার অংশগ্রহণ লাগে বলে প্রায় চালু হয়নি। হালকা বিকল্প ASPA (provider-সম্পর্ক যাচাই) নিয়ে IETF-এ কাজ চলছে।
- MANRS: Mutually Agreed Norms for Routing Security — ২০১৪ সালে শুরু হওয়া একটি স্বেচ্ছামূলক উদ্যোগ (Internet Society-র সহায়তায়), যেখানে নেটওয়ার্করা কয়েকটি ন্যূনতম কাজের প্রতিশ্রুতি দেয়: filtering, জাল উৎস-ঠিকানা ঠেকানো (ingress filtering), যোগাযোগের তথ্য হালনাগাদ রাখা, আর নিজের routing তথ্য IRR/RPKI-তে প্রকাশ।
RPKI, ROA আর ROV
RPKI (Resource Public Key Infrastructure, RFC 6480) হলো ঠিকানা-বণ্টনের পথ ধরে একটি certificate-এর শিকল: RIR প্রতিটি সদস্যকে certificate দেয়, যাতে লেখা থাকে কোন ঠিকানা-ব্লক তার। সেই certificate দিয়ে ঠিকানার মালিক সই করে একটি ROA (Route Origin Authorization) বানায়: “prefix 203.0.113.0/24, maxLength 24, উৎস AS64500” — অর্থাৎ এই prefix (বা maxLength পর্যন্ত তার ভেতরের অংশ) শুধু AS64500 ঘোষণা করতে পারবে। ISP-র validator software সব RIR-এর repository থেকে ROA নামিয়ে স্বাক্ষর যাচাই করে তালিকা router-এ পাঠায় (RPKI-to-Router protocol, RFC 8210).
Router প্রতিটি ঘোষণার শুধু উৎস যাচাই করে — একে বলে Route Origin Validation (ROV), RFC 6811. নিয়ম:
- NotFound: কোনো ROA এই prefix-কে ঢাকে না — কিছু বলা যায় না (আজও অনেক prefix-এর ROA নেই)। সাধারণত গ্রহণ করা হয়।
- Valid: অন্তত একটি ঢাকা ROA-তে উৎস ASN মেলে আর prefix-এর দৈর্ঘ্য maxLength-এর মধ্যে।
- Invalid: ঢাকা ROA আছে, কিন্তু একটিও মেলেনি — ভুল উৎস, বা অনুমতির চেয়ে বেশি নির্দিষ্ট prefix. ROV চালু নেটওয়ার্ক এটি ফেলে দেয়।
- ROA
/24 · max 24 · AS64500RIR-এর repository - Validator
স্বাক্ষর যাচাইRTR দিয়ে router-এ - AS64499
ROV চালুপ্রতিটি UPDATE যাচাই - AS64511
ভুল ঘোষণাঅন্যের prefix
| ঘোষণা | |
| ROV-এর ফল | |
| AS64499 (ROV চালু) | |
| AS64497 (ROV নেই) | |
| AS64499-এর গ্রাহকদের traffic |
- মালিক ROA প্রকাশ করল। AS64500 তার RIR-এর RPKI ব্যবস্থায় সই করা ROA বানাল: 203.0.113.0/24, maxLength 24, উৎস AS64500. বাংলাদেশের নেটওয়ার্কের জন্য সাধারণত APNIC-এর ব্যবস্থায়।
- Validator তালিকা বানাল। AS64499-এর validator ROA নামিয়ে certificate-এর শিকল যাচাই করে (prefix, maxLength, ASN)-এর তালিকা router-এ পাঠাল। AS64497 ROV চালায় না — তার কাছে কোনো তালিকা নেই।
- সঠিক ঘোষণা: Valid. AS_PATH-এর শেষ (উৎস) AS64500, prefix /24 — ROA-র সাথে মেলে। দুজনেই গ্রহণ করল।
- Hijack — একই prefix, ভুল উৎস। AS64511 (ভুল কনফিগারেশন বা ইচ্ছায়) 203.0.113.0/24 নিজের বলে ঘোষণা করল। ঢাকা ROA আছে কিন্তু উৎস মেলে না → Invalid. AS64499 বাতিল করল। AS64497 যাচাই করে না; AS64511 যদি তার কাছের হয়, ছোট AS_PATH দেখে সে ভুল পথটিই নিতে পারে।
- আরও নির্দিষ্ট prefix — আরও বিপজ্জনক। এবার AS64511 ঘোষণা করল 203.0.113.0/25. ROV ছাড়া (আর /24-এর চেয়ে নির্দিষ্ট IPv4 prefix বাদ দেওয়ার filter-ও না থাকলে) এটি ভয়ংকর: longest prefix match-এ /25 সবসময় /24-কে হারায়, তাই AS64497-এর কাছে ঠিকানার অর্ধেকের traffic চলে যায় AS64511-এ। ROV-এ এটি Invalid (দৈর্ঘ্য ২৫ > maxLength ২৪) — AS64499 বাতিল করল। এজন্যই maxLength যতটা সম্ভব ছোট রাখা উচিত (RFC 9319).
- ROV-এর সীমা — জাল উৎস। চতুর ঘোষণাকারী AS_PATH লিখল
64511 64500— উৎস দেখতে AS64500, তাই ROV বলে Valid. ROV শুধু উৎস যাচাই করে, পুরো পথ নয়। তবে পথটি এক AS লম্বা, তাই সাধারণত আসল পথের কাছে হারে; পুরোপুরি ঠেকাতে লাগবে পথ-যাচাই (ASPA, BGPsec). শিক্ষা: ROV অনেক ভুল আর সহজ hijack থামায়, সব নয় — আর যত বেশি নেটওয়ার্ক ROV চালায়, তত কম জায়গায় ভুল ছড়ায়।
এবার ROV-এর নিয়মটি কোডে। দুটি ROA 203.0.113.0/24-এর জন্য (একটি মালিকের, একটি ধরা যাক তার DDoS-সুরক্ষা সেবাদাতার, যে প্রয়োজনে prefix-টি ঘোষণা করে), আর একটি 192.0.2.0/24-এর জন্য maxLength 25 দিয়ে। covers দেখে ROA-র prefix ঘোষণাটিকে ঢাকে কি না (পর্ব ১৬–১৭-এর mask-এর হিসাব)।
// Route Origin Validation (RFC 6811) for IPv4 announcements.
const roas = [ // [prefix, maxLength, origin ASN] - signed objects from the RPKI
["203.0.113.0/24", 24, 64500],
["203.0.113.0/24", 24, 64510], // a second ROA: e.g. a DDoS-protection provider
["192.0.2.0/24", 25, 64501],
];
const anns = [ // [prefix, origin ASN] as seen in BGP UPDATEs
["203.0.113.0/24", 64500], ["203.0.113.0/24", 64510], ["203.0.113.0/24", 64511],
["203.0.113.0/25", 64511], ["203.0.113.128/25", 64500],
["192.0.2.128/25", 64501], ["192.0.2.0/26", 64501], ["198.51.100.0/24", 64502],
];
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const parse = p => { const [ip, len] = p.split("/"); return { net: toInt(ip), len: +len }; };
const mask = len => (len === 0 ? 0 : (0xffffffff << (32 - len)) >>> 0);
const covers = (roa, r) => roa.len <= r.len && ((r.net & mask(roa.len)) >>> 0) === roa.net;
function validate(prefix, origin) {
const r = parse(prefix);
const covering = roas.filter(([p]) => covers(parse(p), r));
if (covering.length === 0) return ["NOT-FOUND", "no ROA covers this prefix"];
const match = covering.find(([, maxLen, asn]) => asn === origin && r.len <= maxLen);
if (match) return ["VALID", `ROA ${match[0]} max /${match[1]} AS${match[2]}`];
const why = covering.some(([, , asn]) => asn === origin) ? "longer than maxLength" : "wrong origin AS";
return ["INVALID", why];
}
console.log("announcement origin state reason");
for (const [p, asn] of anns) {
const [state, why] = validate(p, asn);
console.log(`${p.padEnd(20)} AS${asn} ${state.padEnd(9)} ${why}`);
}আউটপুট:
announcement origin state reason
203.0.113.0/24 AS64500 VALID ROA 203.0.113.0/24 max /24 AS64500
203.0.113.0/24 AS64510 VALID ROA 203.0.113.0/24 max /24 AS64510
203.0.113.0/24 AS64511 INVALID wrong origin AS
203.0.113.0/25 AS64511 INVALID wrong origin AS
203.0.113.128/25 AS64500 INVALID longer than maxLength
192.0.2.128/25 AS64501 VALID ROA 192.0.2.0/24 max /25 AS64501
192.0.2.0/26 AS64501 INVALID longer than maxLength
198.51.100.0/24 AS64502 NOT-FOUND no ROA covers this prefix
প্রথম দুটি Valid — একই prefix-এর দুটি ROA থাকলে যেকোনো একটির সাথে মিললেই চলে। তৃতীয়টি stepper-এর hijack: ঢাকা ROA আছে, উৎস AS64511 মেলে না → Invalid. চতুর্থটি আরও নির্দিষ্ট hijack, সেটিও Invalid. পঞ্চমটি সবচেয়ে শিক্ষণীয়: উৎস সঠিক AS64500, তবু Invalid — কারণ ROA-তে maxLength 24, আর ঘোষণাটি /25. মালিক /25 ঘোষণা করতে চাইলে আগে ROA বদলাতে হবে, নইলে ROV-চালু নেটওয়ার্ক তার নিজের route ফেলে দেবে। 192.0.2.128/25 Valid (maxLength 25-এর মধ্যে), কিন্তু 192.0.2.0/26 Invalid. শেষটি NotFound — 198.51.100.0/24-কে কোনো ROA ঢাকে না। নিজে চেষ্টা করুন: roas-এ ["198.51.100.0/24", 24, 64502] যোগ করুন — শেষ লাইনের ফল কী হবে?
শেখার জন্য দেখার টুল
অনেক ISP-র looking glass, University of Oregon-এর Route Views আর RIPE NCC-র RIS-এর মতো route collector, আর RIR-দের RPKI ও whois-এর তথ্যে ইন্টারনেটের BGP নিজের চোখে দেখা যায়। এগুলো শুধু দেখার জন্য — নিজের নয় এমন নেটওয়ার্কে কিছু ঘোষণা বা পরীক্ষা করবেন না।
আরও গভীরে: RFC 4271 প্রতিটি BGP router-এর ভেতরে তিন রকম table-এর কথা বলে: প্রতিটি প্রতিবেশীর কাছ থেকে আসা কাঁচা route (Adj-RIB-In), নীতি আর বাছাইয়ের পর সেরাগুলো (Loc-RIB, যা থেকে FIB বানানো হয় — পর্ব ১৫), আর প্রতিটি প্রতিবেশীকে পাঠানোর জন্য বাছাই করা route (Adj-RIB-Out). ADD-PATH (RFC 7911) প্রতি prefix-এ একাধিক পথ জানাতে দেয়। BGP এখন শুধু ইন্টারনেটে নয় — বড় data center-এর ভেতরেও leaf-spine নেটওয়ার্কে IGP-র বদলে eBGP চালানো হয় (RFC 7938; পর্ব ৫২)।
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- BGP কোন transport ব্যবহার করে, কেন? — TCP port 179; নির্ভরযোগ্য, ক্রমিক পৌঁছানো TCP দেয়, তাই BGP শুধু পরিবর্তন পাঠায়।
- BGP-কে path vector বলে কেন, loop কীভাবে ঠেকায়? — প্রতিটি route-এর সাথে পুরো AS_PATH যায়; নিজের ASN থাকলে route বাতিল।
- eBGP আর iBGP-এর পার্থক্য? iBGP-তে full mesh কেন? — eBGP দুই AS-এর মাঝে, iBGP একই AS-এ; iBGP-তে AS_PATH বদলায় না বলে iBGP-শেখা route অন্য iBGP-কে জানানো নিষেধ, তাই full mesh বা route reflector.
- LOCAL_PREF আর MED-এর পার্থক্য? — LOCAL_PREF নিজের AS-এর ভেতরে, বের হওয়ার পথ ঠিক করে, বেশি ভালো; MED প্রতিবেশীকে ঢোকার দরজার ইঙ্গিত দেয়, কম ভালো।
- RPKI ROV-এর তিন অবস্থা কী? — Valid (উৎস আর দৈর্ঘ্য মেলে), Invalid (ঢাকা ROA আছে কিন্তু মেলে না), NotFound (কোনো ROA নেই)।
৯ · AI-এর যুগে BGP
BGP-র প্রশ্নে AI দ্রুত গোছানো উত্তর দেয়, কিন্তু এখানে একটি ভুল filter পুরো ইন্টারনেটে ছড়াতে পারে। AI যে ভুলগুলো প্রায়ই করে:
| AI-এর ভুল | কেন ভুল | কীভাবে ধরবেন |
|---|---|---|
| “BGP UDP-তে চলে” বা ভুল port | BGP চলে TCP port 179-এ | RFC 4271 দেখুন; নিজের ল্যাবে ss -tn দিয়ে session দেখুন |
| “LOCAL_PREF কম হলে ভালো”, “MED বেশি হলে ভালো” | উল্টো: LOCAL_PREF বেশি, MED কম ভালো | অংশ ৬-এর simulator-এ মান বদলে মিলিয়ে দেখুন |
| Cisco-র weight-কে মান বলা, বা “MED সব route-এর মধ্যে তুলনা হয়” | Weight vendor-নির্দিষ্ট; MED ডিফল্টে শুধু একই প্রতিবেশী AS-এর মধ্যে | Vendor-এর ডকুমেন্টেশন আর RFC 4271-এর §9.1 মিলিয়ে দেখুন |
| উদাহরণে আসল প্রতিষ্ঠানের ASN আর prefix | কপি করলে অন্যের route ঘোষণা হয়ে যেতে পারে | শুধু documentation ASN (64496–64511, 65536–65551) আর prefix ব্যবহার |
| কোনো filter ছাড়া কনফিগারেশন (“সব গ্রহণ, সব ঘোষণা”) | Route leak আর hijack ছড়ানোর সরাসরি পথ | প্রতিটি প্রতিবেশীর in আর out filter আছে কি না দেখুন |
| বানানো RFC নম্বর বা ঘটনার ভুল বিবরণ | যেমন ২০২১ সালের Facebook বিভ্রাটকে “hijack” বলা | rfc-editor.org-এ নম্বর খুলুন; ঘটনার জন্য প্রতিষ্ঠানের নিজের প্রকাশিত ব্যাখ্যা পড়ুন |
AI-কে BGP-র প্রশ্ন দিলে পরিবেশ, vendor আর যাচাইয়ের শর্ত স্পষ্ট করে দিন:
AI-এর উত্তর মানার আগে — চেকলিস্ট
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১ইন্টারনেটের routing কেন “সবচেয়ে ছোট পথ” নয়, বরং টাকা আর চুক্তির নীতিতে চলে? এতে কী হারায়, কী পায়?
OSPF-এর জগতে প্রশ্নটি সরল: প্রতিটি link-এর একটি cost, আর সবচেয়ে কম মোট cost-এর পথই সেরা। এক প্রতিষ্ঠানের ভেতরে এটি চমৎকার, কারণ সব link আর metric একজনের। ইন্টারনেটে তা নয়। হাজার হাজার AS-এর প্রত্যেকে আলাদা কোম্পানি, যারা পরস্পরের প্রতিযোগী, আর প্রতিটি link-এর পেছনে একটি চুক্তি — কে কাকে কত টাকা দেবে। “বিশ্বব্যাপী সবচেয়ে ছোট পথ” হিসাবের কোনো সাধারণ metric নেই, আর থাকলেও কেউ লোকসানের পথ মানত না।
তাই BGP প্রতিটি AS-কে নিজের নীতি বেছে নেওয়ার স্বাধীনতা দেয়: LOCAL_PREF দিয়ে customer route আগে, peer পরে, provider শেষে; আর export নিয়ম দিয়ে কাকে কী জানাবে। Lixin Gao আর Jennifer Rexford ২০০০–২০০১ সালের কাজে দেখান, এই অর্থনৈতিক নীতিগুলো শুধু লাভজনক নয়, স্থিতিশীলও: সবাই এভাবে চললে BGP নিশ্চিতভাবে একটি স্থির অবস্থায় পৌঁছায়। অন্যদিকে ইচ্ছামতো নীতিতে BGP চিরকাল দোলাচলে থাকতে পারে, বা একই কনফিগারেশনে দুটি আলাদা স্থির অবস্থায় আটকে যেতে পারে (“BGP wedgie”, RFC 4264).
দাম কী? প্রথমত, পথ প্রায়ই অপ্রয়োজনীয়ভাবে লম্বা — গবেষণায় বারবার দেখা গেছে, অনেক জোড়া নেটওয়ার্কের মধ্যে BGP-র বাছাই করা পথের চেয়ে কম delay-এর পথ বিদ্যমান ছিল। দ্বিতীয়ত, convergence ধীর: একটি route হারালে router-রা একের পর এক লম্বা বিকল্প চেষ্টা করে (path exploration), কখনো কয়েক মিনিট লাগে। লাভ: প্রতিটি প্রতিষ্ঠান নিজের ব্যবসা আর নিরাপত্তার নিয়ম চালাতে পারে, কোনো কেন্দ্রীয় কর্তৃপক্ষ ছাড়াই পুরো ব্যবস্থা টিকে থাকে, আর নতুন ISP শুধু একটি provider-এর সাথে চুক্তি করেই যোগ দিতে পারে।
মূল উপলব্ধি: BGP একটি প্রকৌশলের protocol যতটা, ততটাই অর্থনীতির — এটি প্রতিযোগী প্রতিষ্ঠানগুলোর মধ্যে চুক্তিকে route-এ রূপ দেয়। “সবচেয়ে ভালো পথ” এখানে মানে “নীতি মেনে গ্রহণযোগ্য পথ”, আর সেই নীতি ঠিকঠাক মানাই ইন্টারনেটের স্থিতির ভিত্তি।
প্র ০২২০০৮-এর YouTube ঘটনা, ২০১০-এর China Telecom ঘটনা আর ২০২১-এর Facebook বিভ্রাট — তিনটিকে কেন একই ঝুড়িতে রাখা ভুল? প্রতিটি থেকে কী আলাদা শিক্ষা?
তিনটিকেই প্রায়ই “BGP-র সমস্যা” বলা হয়, কিন্তু এরা তিন আলাদা ধরনের ঘটনা।
২০০৮ সালের YouTube ঘটনা একটি আরও নির্দিষ্ট prefix-এর hijack. দেশের ভেতরে YouTube বন্ধের জন্য Pakistan Telecom একটি /24 route বানায়, যা YouTube-এর ঘোষিত বড় ব্লকের ভেতরে পড়ে। এটি দেশের ভেতরে থাকার কথা ছিল, কিন্তু upstream-এ চলে যায়, আর upstream তা যাচাই ছাড়া সারা বিশ্বে ছড়িয়ে দেয়। Longest prefix match-এ নির্দিষ্ট /24 সবখানে জেতে। শিক্ষা: provider-কে customer-এর কাছ থেকে শুধু তার অনুমোদিত prefix নিতে হবে (prefix filter), আর আজকের ভাষায় ROA থাকলে আর ROV চালু থাকলে এই /24 Invalid হিসেবে বাদ পড়ত।
২০১০ সালের China Telecom ঘটনা বড় আকারের ভুল উৎস-ঘোষণা: প্রায় ১৮ মিনিট ধরে অনেক প্রতিষ্ঠানের prefix ভুল AS থেকে ঘোষিত হয়। এখানে prefix-গুলো আরও নির্দিষ্ট ছিল না বলে শুধু যেসব নেটওয়ার্কের কাছে ভুল পথটি “ভালো” দেখিয়েছে, তারাই প্রভাবিত হয় — তাই কতটা traffic সত্যিই ঘুরে গিয়েছিল তা নিয়ে বিতর্ক আছে। শিক্ষা: বড় নেটওয়ার্কের ভুল মিনিটেই বিশ্বে ছড়ায়; এখানেও ROV উৎস যাচাই করে সাহায্য করতে পারত।
২০২১ সালের Facebook বিভ্রাট hijack বা leak নয় — এটি নিজের route নিজে প্রত্যাহারের ঘটনা। ভুল কমান্ডে backbone বিচ্ছিন্ন হলে DNS সার্ভারগুলো নিজেদের route withdraw করে, আর বিশ্ব তাদের নামই খুঁজে পায় না। প্রকৌশলীদের দূর থেকে ঢোকার পথও একই নেটওয়ার্কের ওপর নির্ভর করত বলে মেরামতে সময় লাগে। এখানে RPKI বা prefix filter কিছুই করতে পারত না। শিক্ষা: স্বয়ংক্রিয় নিরাপত্তা-ব্যবস্থার সম্মিলিত প্রভাব পরীক্ষা করা, একটি সমস্যায় সবকিছু একসাথে না পড়ে এমন নকশা, আর আলাদা out-of-band পথ রাখা।
মূল উপলব্ধি: “BGP-তে কিছু গোলমাল” বললে কিছুই বলা হয় না। প্রশ্ন করুন: উৎস ভুল (hijack), ছড়ানো ভুল (leak), নাকি route নেই (withdrawal)? প্রতিটির প্রতিকার আলাদা — ROV, valley-free filter, নাকি নকশা আর পরিচালনার শৃঙ্খলা।
প্র ০৩RPKI-র মান বহু বছর আগে তৈরি, তবু ROV-এর ব্যাপক ব্যবহার এসেছে অনেক পরে। কেন এত সময় লাগল, আর ROV চালু করলেই কি সমস্যার সমাধান?
RPKI-র মূল স্থাপত্য (RFC 6480) আর ROV-এর নিয়ম (RFC 6811) ২০১২–২০১৩ সালের মধ্যেই প্রকাশিত। কিন্তু একটি নিরাপত্তা-ব্যবস্থার মূল্য নির্ভর করে কতজন তা ব্যবহার করে তার ওপর — এখানে ছিল মুরগি আর ডিমের সমস্যা। ঠিকানার মালিকরা ROA বানাত না, কারণ কেউ ROV চালাত না; আর নেটওয়ার্করা ROV চালাত না, কারণ বেশিরভাগ prefix-এর ROA ছিল না, আর ভুল ROA-র কারণে বৈধ route বাদ পড়ার ভয় ছিল।
দশকের শেষ দিকে কয়েকটি বড় নেটওয়ার্ক প্রকাশ্যে Invalid route ফেলে দেওয়া শুরু করে, কিছু বড় কোম্পানি ROV-এর পক্ষে প্রচার চালায়, আর MANRS-এর মতো উদ্যোগ একে “ভালো আচরণের” তালিকায় রাখে। একবার যথেষ্ট বড় নেটওয়ার্ক Invalid ফেলতে শুরু করলে ঠিকানার মালিকদের জন্য সঠিক ROA রাখা জরুরি হয়ে পড়ে, কারণ ভুল ROA মানে নিজের route হারানো — চক্রটি উল্টো দিকে ঘুরতে শুরু করে। আজ বিশ্বের বড় অংশের prefix-এর ROA আছে বলে বিভিন্ন পর্যবেক্ষণে দেখা যায় (সঠিক অনুপাত RIR আর পর্যবেক্ষণ প্রকল্পের পরিসংখ্যানে দেখুন)।
কিন্তু ROV সবকিছুর সমাধান নয়। প্রথমত, এটি শুধু উৎস যাচাই করে — কেউ AS_PATH-এর শেষে আসল মালিকের ASN বসিয়ে দিলে (জাল উৎস) ROV ধরতে পারে না। দ্বিতীয়ত, route leak-এ উৎস সঠিক থাকে, তাই ROV leak ধরে না; এর জন্য ASPA-র মতো provider-সম্পর্ক যাচাইয়ের কাজ চলছে। তৃতীয়ত, অসাবধানে বড় maxLength থাকলে জাল উৎসসহ আরও নির্দিষ্ট prefix-ও Valid হয়ে যায়। BGPsec পুরো পথ যাচাই করতে পারত, কিন্তু প্রতিটি hop-এ স্বাক্ষরের ভার আর সবার অংশগ্রহণের প্রয়োজনে তা প্রায় অচল।
মূল উপলব্ধি: ইন্টারনেট-জোড়া নিরাপত্তা প্রযুক্তি মান প্রকাশের দিনে নয়, সবার একসাথে ব্যবহারের দিনে কাজ শুরু করে। ROV একটি বড় অগ্রগতি — দুর্ঘটনার বেশিরভাগ ধরে — কিন্তু এটি স্তরভিত্তিক প্রতিরক্ষার একটি স্তর মাত্র।
প্র ০৪একটি দেশের ভেতরে ভালো IXP থাকা কেন জরুরি? বাংলাদেশের মতো দেশে IXP, IIG আর content cache মিলে ব্যবহারকারীর অভিজ্ঞতা কীভাবে বদলায়?
ঢাকার দুই ISP-র গ্রাহক ভিডিও কল করছেন। দুই ISP-র মধ্যে peering না থাকলে traffic যায় transit provider হয়ে, হয়তো কোনো বিদেশি exchange ঘুরে। ফলে দুই কিলোমিটার দূরের দুজনের traffic হাজার হাজার কিলোমিটার ঘুরে আসে। অংশ ৫-এর হিসাবে, শুধু আলোর গতিতেই সিঙ্গাপুর ঘুরে আসার RTT কমপক্ষে প্রায় ৫৮ ms, আর বাস্তবে তার বেশি। সাথে খরচ: প্রতিটি বাইট আন্তর্জাতিক bandwidth দিয়ে দুবার যায়, যা দেশীয় bandwidth-এর চেয়ে সাধারণত অনেক দামি।
দেশীয় IXP এই ঘুরপথ বন্ধ করে: দেশের ISP-রা এক জায়গায় যুক্ত হয়ে নিজেদের মধ্যে সরাসরি route বিনিময় করে। BGP-র ভাষায় এটি peering — IXP-তে শেখা route সাধারণত provider route-এর চেয়ে বেশি LOCAL_PREF পায়, তাই দেশের ভেতরের গন্তব্যে traffic দেশেই থাকে। কিন্তু শুধু IXP যথেষ্ট নয়, কারণ মানুষ যা দেখে তার বেশিরভাগ — ভিডিও, সামাজিক মাধ্যম, সফটওয়্যার আপডেট — বিদেশি কোম্পানির। এখানে আসে content cache আর CDN: বড় কোম্পানিগুলো ISP-র ভেতরে বা IXP-র কাছে নিজেদের cache সার্ভার বসায়, যাতে জনপ্রিয় content একবার আন্তর্জাতিক link দিয়ে এসে বহুবার দেশে পরিবেশিত হয় (পর্ব ৩৮)।
বাংলাদেশে আন্তর্জাতিক bandwidth আসে IIG লাইসেন্সধারীদের মাধ্যমে — সমুদ্রের নিচের cable বা স্থলপথের cable দিয়ে — আর ISP-রা তাদের কাছ থেকে কেনে। দেশে BDIX-সহ exchange আছে (পর্ব ০২)। তবে কোন IXP-তে কোন নেটওয়ার্ক আছে, কোন content কোথায় cache হয়, লাইসেন্সের নিয়ম কী — এগুলো সময়ের সাথে বদলায়, তাই নির্দিষ্ট তথ্যের জন্য BTRC আর IXP-গুলোর নিজের প্রকাশিত তথ্য দেখা উচিত। আর একটি ভবনে সব থাকলে সেটি একক দুর্বল বিন্দু হতে পারে — তাই অনেক দেশ একাধিক শহরে exchange রাখে।
মূল উপলব্ধি: দেশের ইন্টারনেটের মান শুধু প্যাকেজের Mbps নয় — traffic কোথায় মিলছে আর content কত কাছে আছে, তা-ও। IXP দেশের ভেতরের traffic দেশে রাখে, cache বিদেশের content দেশে আনে, আর এই দুটি মিলে delay আর খরচ দুটোই কমায়।
প্র ০৫একই IP ঠিকানা পৃথিবীর শত শত জায়গা থেকে ঘোষণা করা (anycast) কীভাবে সম্ভব, আর DNS root server-এর জন্য এটি কেন এত গুরুত্বপূর্ণ? এর দুর্বলতা কোথায়?
BGP-র কাছে ঘোষণা মানে শুধু “এই prefix-এ এই পথে পৌঁছানো যায়”. একই prefix যদি দশটি শহর থেকে দশটি আলাদা জায়গায় ঘোষণা হয়, তবে প্রতিটি AS নিজের best-path selection অনুযায়ী একটি বাছে — সাধারণত ছোট AS_PATH বা কাছের দরজা। ফলে ঢাকার ব্যবহারকারী হয়তো সিঙ্গাপুর বা মুম্বাইয়ের instance-এ পৌঁছান, আর লন্ডনের ব্যবহারকারী লন্ডনেরটিতে, অথচ দুজনেই একই ঠিকানায় packet পাঠাচ্ছেন। একেই বলে anycast — routing নিজেই load balancer.
DNS root server-এর ক্ষেত্রে এর গুরুত্ব ঐতিহাসিক। পুরোনো DNS-এর বার্তার আকারের সীমার কারণে root server-এর নাম আর ঠিকানার তালিকা ১৩টিতে সীমিত রাখা হয়েছিল — a থেকে m. কিন্তু সারা বিশ্বের চাহিদা মেটাতে আর আক্রমণ সহ্য করতে ১৩টি যন্ত্র যথেষ্ট নয়। Anycast দিয়ে প্রতিটি নামের পেছনে অনেক জায়গায় অনেক instance রাখা যায়; আজ সব মিলিয়ে এক হাজারেরও বেশি। লাভ: কাছের instance-এ উত্তর দ্রুত, আর বড় DDoS-এর traffic অনেক জায়গায় ভাগ হয়ে যায়।
দুর্বলতাও আছে। “কাছে” মানে BGP-র চোখে কাছে — ভৌগোলিকভাবে নয়; কোনো ISP-র নীতির কারণে ঢাকার ব্যবহারকারী ইউরোপের instance-এ চলে যেতে পারেন। TCP-র মতো দীর্ঘ সংযোগের মাঝে route বদলালে packet অন্য instance-এ যায়, যে সংযোগটি চেনে না — সংযোগ ভাঙে; তাই anycast স্বল্পস্থায়ী প্রশ্ন-উত্তরে (DNS) সবচেয়ে সহজ, যদিও CDN-গুলো যত্ন নিয়ে TCP আর QUIC-ও চালায়। আর কেউ anycast prefix ভুল জায়গা থেকে ঘোষণা করলে আশপাশের ব্যবহারকারীরা ভুল “instance”-এ যান — তাই এসব prefix-এর ROA আর ROV জরুরি। Facebook-এর ২০২১ সালের ঘটনাও দেখায়, anycast route-এর স্বয়ংক্রিয় প্রত্যাহার ভুল সময়ে ঘটলে সব instance একসাথে অদৃশ্য হতে পারে।
মূল উপলব্ধি: Anycast BGP-র “একটি prefix, অনেক পথ” স্বভাবকে কাজে লাগিয়ে বিশ্বজোড়া সেবা আর DDoS-সহনশীলতা দেয় — কিন্তু তার ভালো-মন্দ দুটোই BGP-র নীতি আর নিরাপত্তার ওপর নির্ভরশীল।
অনুশীলন
খাতা-কলম নিন — AS_PATH আর attribute ধরে ধরে হিসাব করুন।
-
হাতে হিসাব (session, timer আর ASN): (ক) একটি AS-এর ভেতরে ১২টি BGP router. Full mesh iBGP-তে কয়টি session লাগবে? দুটি route reflector রাখলে (বাকি ১০টি দুজনেরই client, আর reflector দুটি পরস্পর যুক্ত) কয়টি? (খ) Hold time ৯০ সেকেন্ড ধরে KEEPALIVE কত পরপর যাবে, আর একটি নীরবে মরে যাওয়া প্রতিবেশী ধরা পড়তে সর্বোচ্চ কত সময় লাগতে পারে? (গ) ASN 65551 asdot আকারে কী, আর এটি কোন range-এর?
(ক) Full mesh: n(n − ১)/২ = ১২ × ১১ ÷ ২ = ৬৬টি. Route reflector দিয়ে: ১০টি client × ২টি reflector = ২০, আর দুই reflector-এর মধ্যে ১ = ২১টি — তিন ভাগের এক ভাগেরও কম।
(খ) সাধারণত hold time-এর তিন ভাগের এক ভাগ: ৩০ সেকেন্ড পরপর KEEPALIVE. প্রতিবেশীর শেষ বার্তার পর ৯০ সেকেন্ড কিছু না এলে session ভাঙে — তাই নীরব মৃত্যু ধরতে সর্বোচ্চ প্রায় ৯০ সেকেন্ড.
(গ) ৬৫,৫৫১ = ১ × ৬৫,৫৩৬ + ১৫, তাই asdot-এ 1.15. এটি ৩২ bit-এর documentation range (65536–65551)-এর শেষ নম্বর (RFC 5398) — উদাহরণে ব্যবহারযোগ্য, আসল নেটওয়ার্কে নয়।
-
আউটপুট অনুমান করুন: অংশ ৬-এর
best_path.js-এ শুধু route ৪-এরorigin: "INCOMPLETE"বদলেorigin: "IGP"করা হলো। সাতটি ধাপের প্রতিটিতে কে বাদ পড়বে, আর শেষে কে জিতবে? চালানোর আগে হাতে লিখুন।1 highest LOCAL_PREF drop 6 left: 1,2,3,4,5,7 2 shortest AS_PATH drop 5 left: 1,2,3,4,7 3 lowest ORIGIN no change left: 1,2,3,4,7 4 lowest MED (same nbr AS) drop 1 left: 2,3,4,7 5 eBGP over iBGP drop 2,3,7 left: 4 6 lowest IGP cost to NH no change left: 4 7 lowest router ID no change left: 4 BEST: route 4, AS_PATH 64503 64510, router ID 192.0.2.6ORIGIN-এ এখন সবাই IGP, তাই ধাপ ৩-এ কেউ বাদ পড়ে না। MED-এ আগের মতোই route ১ বাদ (route ৪ AS64503 থেকে একা, তুলনা নেই)। ধাপ ৫-এ route ৪ একমাত্র eBGP route — বাকি তিনটি iBGP বাদ, আর route ৪ জিতে যায়। পরের ধাপগুলোতে একটিই বাকি, তাই “no change”. শিক্ষা: সিদ্ধান্ত হয় প্রথম যে ধাপে পার্থক্য আছে, সেখানেই।
-
Valley-free যাচাই (হাতে trace): চারটি AS: 64496 আর 64497 পরস্পর peer; 64498 হলো 64496-এর customer; 64499 হলো 64497-এর customer; আর 64500 হলো 64498 আর 64499 দুজনেরই customer. 64498 নিজের prefix 198.51.100.0/24 ঘোষণা করে। (ক) 64499 নিয়ম মেনে কোন কোন পথে এই prefix শিখতে পারে? (খ) 64500 যদি 64498-এর কাছে শেখা route 64499-কে জানায়, 64499-এর কাছে কোন AS_PATH যাবে, এটি কেন অবৈধ, আর 64499 কোনটি বেছে নেবে (customer > peer > provider ধরে)?
(ক) দুটি বৈধ পথ: (১) 64498 → provider 64496 (ওপরে) → peer 64497 (পাশে) → customer 64499 (নিচে): 64499 পায়
64497 64496 64498, provider থেকে। (২) 64498 → customer 64500 (নিচে) → … কিন্তু 64500 provider থেকে শেখা route অন্য provider-কে জানাতে পারে না, তাই এই পথ বৈধ নয়। অর্থাৎ বৈধ পথ শুধু একটি:64497 64496 64498.(খ) Leak হলে 64499 পায়
64500 64498— উৎস থেকে নিচে (64498→64500), তারপর আবার ওপরে (64500→64499): একটি উপত্যকা, তাই অবৈধ। কিন্তু 64499-এর চোখে এটি customer route আর পথও ছোট (২ বনাম ৩ AS), তাই সে এটিই বেছে নেবে, আর customer route হিসেবে নিজের provider 64497-কেও জানাবে — অংশ ৪-এর simulator-এর ঘটনার মতোই। প্রতিকার: 64500-এর export filter (শুধু নিজের prefix), আর 64499-এর import filter (customer 64500-এর কাছ থেকে শুধু তার নিজের prefix). -
ROV হাতে আর কোডে: একটি ROA:
198.51.100.0/24, maxLength 24, AS64505. নিচের ঘোষণাগুলোর ROV অবস্থা লিখুন: (ক) 198.51.100.0/24, উৎস AS64505; (খ) 198.51.100.0/24, উৎস AS64507; (গ) 198.51.100.64/26, উৎস AS64505; (ঘ) 192.0.2.0/24, উৎস AS64505. (ঙ) মালিক যদি “ঝামেলা কমাতে” maxLength 32 করে দেন, কোন ঝুঁকি তৈরি হয়? (চ) অংশ ৮-এরrov_check.js-এ এই ROA আর ঘোষণাগুলো যোগ করার জন্য কোন দুটি লাইন বদলাবেন?(ক) Valid — উৎস মেলে, /24 ≤ ২৪। (খ) Invalid — ঢাকা ROA আছে, উৎস মেলে না (সম্ভাব্য hijack). (গ) Invalid — উৎস ঠিক, কিন্তু /26 > maxLength ২৪; মালিক সত্যিই /26 ঘোষণা করতে চাইলে আলাদা ROA লাগবে। (ঘ) NotFound — 192.0.2.0/24-কে এই ROA ঢাকে না (যদি অন্য কোনো ROA না থাকে)।
(ঙ) maxLength 32 মানে AS64505-এর নামে /24 থেকে /32 পর্যন্ত যেকোনো ভেতরের prefix Valid. আক্রমণকারী AS_PATH-এর শেষে 64505 বসিয়ে (জাল উৎস) একটি /25 ঘোষণা করলে ROV তাকে Valid বলবে, আর longest prefix match-এ সেটি আসল /24-কে হারাবে। তাই RFC 9319-এর পরামর্শ: যা আসলে ঘোষণা করেন, শুধু তার জন্যই ROA, আর maxLength = prefix-এর দৈর্ঘ্য।
(চ)
roas-এ যোগ করুন["198.51.100.0/24", 24, 64505],, আরanns-এ["198.51.100.0/24", 64505], ["198.51.100.0/24", 64507], ["198.51.100.64/26", 64505], ["192.0.2.0/24", 64505],. খেয়াল করুন: কোডের আগের ROA 192.0.2.0/24 (AS64501) থাকলে (ঘ) আর NotFound নয়, Invalid হবে — কারণ তখন একটি ঢাকা ROA আছে যার উৎস মেলে না। এটিই ROV-এর নিয়ম: “কোনো ROA মেলেনি” আর “কোনো ROA নেই” আলাদা জিনিস।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমদুটি router-এর মধ্যে একটি BGP session স্বাভাবিকভাবে দাঁড়ানোর অবস্থাগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- Idle — session শুরু করার অপেক্ষা
- Connect — প্রতিবেশীর সাথে TCP port 179-এ সংযোগের চেষ্টা
- OpenSent — TCP সংযোগ হয়েছে, নিজের OPEN পাঠানো হয়েছে
- OpenConfirm — প্রতিবেশীর OPEN পাওয়া গেছে, KEEPALIVE-এর অপেক্ষা
- Established — UPDATE বিনিময় শুরু
১৬ bit-এর private ASN-এর range কোনটি?
- 64496–64511
- 0–1023
- 64512–65534
- 65536–65551
একটি AS তার peer-এর কাছ থেকে একটি route শিখেছে। Valley-free (Gao-Rexford) export নিয়ম অনুযায়ী সে এই route কাকে জানাতে পারে?
- সব প্রতিবেশীকে — customer, peer আর provider
- শুধু নিজের customer-দের
- শুধু নিজের provider-দের
- কাউকেই না
একটি router-এর কাছে একই prefix-এর দুটি route: A — LOCAL_PREF 200, AS_PATH-এ ৫টি AS; B — LOCAL_PREF 100, AS_PATH-এ ২টি AS. বাকি সব attribute সমান। কোনটি জিতবে?
- A — বেশি LOCAL_PREF আগে দেখা হয়
- B — ছোট AS_PATH সবসময় জেতে
- দুটিতে সমান ভাগে traffic যাবে
- যার router ID কম
RPKI-তে ROA আছে: 203.0.113.0/24, maxLength 24, উৎস AS64500. একটি UPDATE এলো: 203.0.113.128/25, উৎস AS64500. Route Origin Validation-এর ফল কী?
- Valid — উৎস মিলেছে
- NotFound — /25-এর জন্য আলাদা ROA নেই
- Unknown
- Invalid — prefix maxLength-এর চেয়ে লম্বা
একটি AS-এর ভেতরে ৮টি router full mesh iBGP চালায়। মোট কয়টি iBGP session?
- ৫৬
- ২৮
- ৭
- ৮
একটি BGP router একটি UPDATE পেল, যার AS_PATH-এ তার নিজের ASN আছে। সে সাধারণত কী করে?
- Route-টি গ্রহণ করে, কারণ পথটি পরিচিত
- NOTIFICATION পাঠিয়ে session বন্ধ করে
- Route-টি বাতিল করে — এটি loop
- নিজের ASN আরেকবার যোগ করে সামনে পাঠায়
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- ইন্টারনেট = AS-দের জোট: ভেতরে IGP, মাঝে BGP. ASN ১৬ বা ৩২ bit; private 64512–65534 আর 4200000000–4294967294; উদাহরণে documentation 64496–64511 আর 65536–65551. AS তিন রকম: stub, multihomed, transit.
- BGP = path vector, TCP 179-এর ওপর: OPEN, UPDATE, NOTIFICATION, KEEPALIVE; Idle থেকে Established. AS_PATH-এ নিজের ASN থাকলে route বাতিল। iBGP-তে AS_PATH বদলায় না → full mesh n(n − ১)/২ বা route reflector.
- ব্যবসাই নীতি: customer > peer > provider; customer route সবাইকে, peer আর provider route শুধু customer-কে (valley-free). নিয়ম ভাঙা = route leak. IXP দেশের traffic দেশে রাখে — খরচ আর delay দুটোই কমে।
- Best path: বেশি LOCAL_PREF → ছোট AS_PATH → কম ORIGIN → কম MED (একই প্রতিবেশী) → eBGP → কম IGP cost (hot potato) → কম router ID. Weight-এর মতো ধাপ vendor-নির্দিষ্ট। ঢোকা traffic সাজাতে prepending, নির্দিষ্ট prefix, MED আর community; anycast-এ একই prefix অনেক জায়গা থেকে।
- নিরাপত্তা স্তরে স্তরে: prefix filter, IRR, RPKI-র ROA আর ROV (Valid, Invalid, NotFound; maxLength সংযত), BGPsec আর ASPA (পথ যাচাই), MANRS. Hijack, leak আর withdrawal আলাদা সমস্যা।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২৬ · Multicast আর QoS — একসাথে অনেককে পাঠানো আর অগ্রাধিকারপরবর্তী পর্বএকজন থেকে অনেকজনে, আর ভিড়ে অগ্রাধিকার।
- পর্ব ২২ · Routing-এর ভিত্তি — routing table, static route আর longest prefix matchএই মডিউলIGP বনাম EGP আর routing table-এর মূল কথা।
- পর্ব ২৩ · Distance vector routing — Bellman-Ford, RIP আর count-to-infinityএই মডিউলPath vector-এর পূর্বপুরুষ, আর যে সমস্যা AS_PATH সমাধান করে।
- পর্ব ২৪ · Link state routing — Dijkstra আর OSPFএই মডিউলAS-এর ভেতরের IGP, যা BGP-র NEXT_HOP পর্যন্ত পথ দেয়।
- কম্পিউটার নেটওয়ার্ক · কোর্স হোম৬২টি পর্বTCP (পর্ব ২৯), DNS (পর্ব ৩৫), CDN (পর্ব ৩৮) আর নিরাপত্তা (মডিউল ৮) পর্যন্ত পুরো রোডম্যাপ।
- DSA · Graphপাশের ট্র্যাকAS-দের জালকে graph হিসেবে দেখা — নোড, edge আর পথ।
- DBMS · Distributed databaseপাশের ট্র্যাকবহু স্বাধীন অংশের মধ্যে একমত হওয়ার সমস্যা — BGP-র convergence-এর মতোই কঠিন।