ایجاد شبکه توزیع محتوا (CDN) با Anycast بر پایه BGP

رضا جمالی ۲۹ خرداد ۱۳۹۷ ۰ دیدگاه

Anycast چیست؟

Anycast نامی است که به یک (IPV4) کروی یا (IPV6) داده می‌شود که از مسیریاب‌های متعدد درون یک (WAN) یا (AS) اعلام شده‌ است. در واقع Anycast یک پروتکل نیست بلکه یک تکنیک شبکه ای است.

Anycast چگونه کار می‌کند؟

Anycast به پروتکل‌های مسیریابی داخلی مانند OSPF، EIGRP یا iBGP اجازه می‌دهد تا این اعلامیه‌های مختلف را کنترل کرده و سریع‌ترین مسیر را از طریق الگوریتم‌های منتخب مربوطه‌ی خود انتخاب کنند. (مثل Dijkstra برای OSPF)

Anycast چه چیزی را ارائه می‌دهد؟

Anycast یک شبکه‌ی توزیع “جغرافیایی” را فراهم می‌کند که ارسال سریع محتویات را ممکن می‌سازد. همان‌طور که می‌دانیم خدمات وب، سیستم آگاه نام دامنه و البته وابسته است. وب جهانی بوده و بدون مرز است. محتویات آن باید در دسترس باشند و از هر جایی قابل‌استفاده باشند، اما فیزیک هنوز یک واقعیت در روی کره زمین است. Anycast با سیستم نام دامنه، پاسخ بسیار سریع همه کاربردها و محتوای مبتنی بر وب را فراهم می‌کند. Anycast اغلب در شبکه‌های تحویل محتوا (CDNs) مانند Cloudflare یا Akamai مورد استفاده قرار می‌گیرد.

کاربرد Anycast

ساده‌ترین و پرکاربردترین مورد استفاده در سیستم نام دامنه است. از آن‌جا که همه‌ی خدمات مبتنی بر وب، وابسته به DNS هستند، تمام مشتریان باید یک یا چند درخواست DNS را به انجام برسانند. بسیار بد، سرور DNS شما در طرف دیگر جهان است. یعنی ۵۰۰ میلی‌ثانیه برای دانلود ۴ بایت داده! برخی افراد پیش از بازگشت درخواست DNS از پنجره مرورگر، از  CTRL + F4 استفاده می‌کنند.

یک پاسخ بسیار ساده برای این مساله وجود دارد: Anycast. بیایید فرض کنیم که ما ۲ عدد روتر داریم که iBGP را با هم اجرا می‌کنند (همان‌گونه که در AS هستند). از OSPF به‌عنوان پروتکل مسیریابی داخلی استفاده می‌شود. روتر ۱ روتر لبه است  و روتر ۲ یک روتر اصلی خواهد بود که ممکن است به IXs یا یک ISP متصل شود. همچنین ما به یک سرور نیاز داریم که نقش سرور DNS متصل به روتر Edge را بازی می‌کند. یک آدرس anycast معمولاً به صورت ۳۲ در IPv4 یا ۱۲۸ در IPv6 نوشته می‌شود، چون که در یک ‌گره تحت شکل واسط Loopback وجود دارد.

توجه داشته باشید که تمام مراحل این کار بیشتر با سرورهای مشابه anycast  پیکربندی شده در سراسر جهان توزیع می‌شود. این سرورها به‌عنوان بخشی از وب سایت‌هایی مانند تصاویر، ویدئو و صفحات ثابت یا کدها خدمت‌رسانی خواهند کرد. قسمت‌های متحرک مانند DB Server و uploads و غیره توسط یک سرور متمرکز انجام خواهند شد. درخواست‌های HTTP با نشانی‌های اینترنتی DNS مانند static.mydomain.net و dynamic.mydomain.net که در متغیرهای webapp کد گذاری می‌شوند، برای کارگزار مناسب انجام خواهد شد.

تنظیمات شبکه را درنظر بگیرید:

ایجاد شبکه توزیع محتوا (CDN) با Anycast بر پایه BGP

ایجاد شبکه توزیع محتوا (CDN) با Anycast بر پایه BGP

 

آن‌چه ما می خواهیم انجام دهیم این است: تبلیغ loopback در سرور DNS به دروازه‌ی ما که همان Edge Router ماست. این تبلیغات می‌توانند به‌طور مستقیم از طریق OSPF هم انجام شود، اما ما IBGP را انتخاب کردیم.

کاربرد Anycast

توجه داشته باشید که کدها و دستورها در طول زمان در حال تغییر هستند؛ همچنین، این راه‌اندازی را نمی‌توان بدون فکر کردن ایجاد کرد.

پیکربندی سیستم لینوکس:

ما حداقل به دو روتر و یک سرور Debian / Quagga که با ارسال IP فعال می‌شود نیاز داریم:

ysctl -w net.ipv4.conf.default.forwarding = 1

sysctl -w net.ipv6.conf.default.forwarding = 1

توجه داشته باشید که از کار انداختن تبلیغات و پیشنهادات روتر بهترین تمرین در محیط شبکه LAN است:

sysctl -w net.ipv6.conf.default.accept_ra = 0

sysctl -w net.ipv6.conf.default.router_solicitations = 0

 

راه‌اندازی:

پیکربندی روتر Quagga شما باید به این شکل باشد:

hostname dns-node-1
!
password zebra
enable password zebra
!
interface eth0
 description dns-node-1
 ip address 172.16.0.2/24
 ipv6 nd suppress-ra
!
interface lo
 description dns-ip-1
 ip address 10.0.0.1/32 label lo:0
!
interface lo0
 ipv6 nd suppress-ra
!
router bgp 65500
 bgp router-id 172.16.0.2
 bgp log-neighbor-changes
 network 10.0.0.1/32
 neighbor 172.16.0.1 remote-as 65500
 neighbor 172.16.0.1 update-source lo
 neighbor 172.16.0.1 next-hop-self
 neighbor 2a01:200:1:1::1 remote-as 65500
 neighbor 2001:200:1:1::1 update-source lo
 no neighbor 2001:200:1:1::1 activate
!
 address-family ipv6
 network 2001:200:1:f:10::1/128
 neighbor 2001:200:1:1::1 activate
 exit-address-family
!
ip forwarding
!
line vty
!

اکنون نگاهی به پیکربندی روتر RT1 بیندازید. توجه داشته باشید که روتر آزمایش شده یک بارکد CER بود:

!
no spanning-tree
!
vlan 1 name DEFAULT-VLAN 
!
ipv6 prefix-list anycast-ipv6 seq 5 permit 2001:200:1:f:10::1/128
!
ip prefix-list anycast-ip seq 5 permit 10.0.0.1/32 
!
ip router-id 192.168.254.1
ipv6 nd global-suppress-ra
hostname rt1
!
router ospf
 area 0 
 redistribute bgp route-map bgp-to-ospf 
!
ipv6 router ospf
 area 0
 redistribute bgp route-map bgp-to-ospf-6
!
interface loopback 1
 port-name iBGP loopback
 ip ospf area 0
 ip ospf passive
 ip address 192.168.254.1/32
 ipv6 address 2001:200::1/128
 ipv6 ospf area 0
 ipv6 ospf passive
!                                                                
interface ethernet 1/1
 enable
 ip ospf area 0
 ip address 192.168.0.1/31
 ipv6 address 2001:200:f:f::1/126
 ipv6 ospf area 0
 ipv6 nd suppress-ra
!
interface ethernet 1/2
 enable
 ip address 172.16.0.1/24
 ipv6 address 2001:200:1:1::1/64
 ipv6 nd suppress-ra
!
router bgp
 local-as 65500
 neighbor IBGP peer-group
 neighbor IBGP next-hop-self
 neighbor IBGP update-source loopback 1
 neighbor IBGP6 peer-group
 neighbor IBGP6 next-hop-self
 neighbor IBGP6 update-source loopback 1                          
 neighbor ANY peer-group
 neighbor ANY next-hop-self
 neighbor 172.16.0.2 remote-as 65500
 neighbor 172.16.0.2 peer-group ANY
 neighbor 192.168.254.2 remote-as 65500
 neighbor 192.168.254.2 peer-group IBGP
 neighbor 2001:200::2 remote-as 65500
 neighbor 2001:200::2 peer-group IBGP6
 neighbor 2001:200:1:1::2 remote-as 65500
 neighbor 2001:200:1:1::2 peer-group ANY
!
 address-family ipv4 unicast
 redistribute ospf
 no neighbor 2001:200::2 activate 
 bgp-redistribute-internal
 exit-address-family
!
 address-family ipv4 unicast
 redistribute ospf
 no neighbor 2001:200::2 activate                                 
 no neighbor 2001:200:1:1::2 activate 
 bgp-redistribute-internal
 exit-address-family
!
 address-family ipv6 unicast
 redistribute ospf
 neighbor 2001:200::2 activate 
 neighbor 2001:200:1:1::2 activate 
 bgp-redistribute-internal
 exit-address-family
! 
 address-family ipv6 multicast                                    
 exit-address-family
! 
 address-family vpnv4 unicast
 exit-address-family
!
route-map bgp-to-ospf permit 10
 match ip address prefix-list anycast-ip
!
route-map bgp-to-ospf-6 permit 10
 match ipv6 address prefix-list anycast-ipv6
!
end

درنهایت پیکربندی روتر RT2 در واقع یک روتر اصلی ساده است:

!
no spanning-tree
!
vlan 1 name DEFAULT-VLAN
!
hostname rt2
router ospf
area 0
!
interface loopback 1
ip ospf area 0
ip ospf passive
ip address 192.168.254.2/32
ipv6 address 2001:200::2/128
ipv6 ospf area 0
ipv6 ospf passive
!
interface ethernet 1/1
enable
ip ospf area 0
ip address 192.168.0.0/31
ipv6 address 2001:200:f:f::2/126
ipv6 ospf area 0
!
router bgp
local-as 65500
neighbor IBGP peer-group
neighbor IBGP remote-as 65500
neighbor IBGP next-hop-self
neighbor IBGP update-source loopback 1
neighbor IBGP6 peer-group
neighbor IBGP6 remote-as 65500
neighbor IBGP6 next-hop-self
neighbor IBGP6 update-source loopback 1
neighbor 192.168.254.1 remote-as 65500
neighbor 192.168.254.1 peer-group IBGP
neighbor 2001:200::1 remote-as 65500
neighbor 2001:200::1 peer-group IBGP6
!
address-family ipv4 unicast
no neighbor 2001:200::1 activate
exit-address-family
!
address-family ipv4 multicast
exit-address-family
!
address-family ipv6 unicast
neighbor 2001:200::1 activate
exit-address-family
!
address-family ipv6 multicast
exit-address-family
!
address-family vpnv4 unicast
exit-address-family
!
end

سرویس شناسایی اسکریپت:

برای خاموش کردن BGP در هنگامی که سرویس DNS خود را بالا می‌برد، می‌توانیم از این اسکریپت استفاده کنیم:

#!/bin/bash

DNSUP=`dig @dns-node-1 localhost. A +short`
if [ "$DNSUP" != "127.0.0.1" ];
then
echo "Stopping Anycast server because DNS service is not working..."
    /etc/init.d/quagga stop
    /etc/init.d/bind9 stop
else 
    echo "Everything's OK."
fi

فقط کافیست آن‌ را به etc/cronta اضافه کنید:

*/۲ *    * * *  root /root/.isDNSAlive.sh > /dev/null 2>&1

این کار هر ۲ دقیقه یک بار چک خواهد شد تا برنامه آن‌گونه که انتظار می‌رود کار کند.

بهینه‌سازی مسیریابی:

تایمر BGP می‌تواند موجب پیشرفت سریع‌تر مسیر شود:

timers bgp

همچنین می‌توانیم تعیین کنیم:

neighbor x.x.x.x timers connect

فناوران شبکه سینداد (آهنگ نوآوری)

سینداد یعنی هدیه‌ی سیمرغ، یا فرزند سیمرغ؛ به عبارتی یعنی خود سیمرغ، با همه ی شگفتی هایش، اما جوانتر و سرزنده تر. و این چیزی است که ما سعی می کنیم در سینداد باشیم. از سال ۱۳۸۵ دانش مان را به صورت خدماتی در حوزه ی هاستینگ، شبکه و تولید نرم افزار در اختیار مشتریان مان قرار داده ایم و به این افتخار می کنیم که تک تک آنها تا به امروز همراه ما مانده اند. باور داریم که سینداد صرفاً یک شرکت نیست، بلکه نوعی باور است به ارائه ی شگفت انگیز از هر چیز.