در این پست می خوام درمورد این صحبت کنم که چطور میتونیم یک Dns Load Balancer رو به ساده ترین و موثر ترین روش ممکن برای استفاده در محیط خانه پیاده سازی کنیم.
کامپیوتر ها توانایی درک ادرس هایی همچون google.com یا virgool.io رو ندارند و صرفا توانایی درک یک IPبرای برقراری ارتباط دارند
اینجا هست که DNS وارد عمل میشه، شما در یک درخواست از DNS server مورد نظر خود میخواهید که مقدارIP اون دامنه رو به شما بده، و پس از اون کامپیوتر شما با کمک اون IP با سرور ارتباط برقرار میکند.
همینطور که گفتم شما هربار میخواهید با یک ادرس ارتباط بر قرار کنید ابتدا کامپیوتر شما با ارسال درخواست DNS به سرور متوجه میشه که باید با چه IP ارتباط برقرار کنه، خب شما فکر کنید که در روز هزاران بار درخواست DNS ارسال میکنید ، البته لازم به ذکر هست که کامپیوتر ها در پس زمینه نیز برای ارتباط های خود نیز از DNS استفاده میکنند.
و اینکه گاهی اوقات ممکنه سرعت ارتباط شما با DNS server بنا به دلایل زیادی کند شود یا اینکه ممکنه بخواهید جواب های DNS رو cache کنید تا اگه در شبکه یک نفر دیگه خواست بپرسه که IP اون دامنه چیه، نره از سرور بپرسه، بلکه از اون مقداری که cache کرده جواب رو بده، این کار باعث افزایش سرعت درخواست های DNS برای شما میشود
همچنین در لحظه ممکنه که یک DNS server سرعت بیشتری داشته باشه و جواب رو زودتر به شما بده
در این جا هست که شما میتوانید از DNS Load Balancer استفاده کنید
شما در ان DNS server ها مورد نظر خودتون رو تعریف میکنید ، و اون هربار که شما درخواست میزنید درخواست رو به همه انها ارسال میکند و اونی که سریع تر جواب بده ، مقدار جواب را cache میکند و درخواست شما را جواب میدهد
همچنین میتواند در یک حالت دیگر هربار درخواست را به یک سرور بفرستید تا بار بین DNS server ها تقسیم شود.
در حالت دیگر میتوانید درخواست را برای همه بفرستید و بعد از دریافت جواب، سرور بررسی میکند که جواب کدام سرور سرعت بیشتری دارد و مقدار IP ان را به شما برمیگرداند، البته که این روش یکم نسبت به باقی راه ها کند تر هست زیرا باید جواب تمام سرور هارو بگیرد و سرعت رسیدن بسته IP هارو بررسی کند و در نهایت به شما پاسخ دهد
حتی میتوانید یک blocklist از ادرس هایی که malware هستند یا برای تبلغات استفاده میشوند را بهش بدهنید که راه رسیدن شما به انها رو ببند که باعث میشود تبلیغات در شبکه شما به همراه دسترسی به سایت های malware کاهش پیدا کند.
شاید بپرسید با وجود ابزارهای متعدد و قدرتمندی مثل Blocky، dnscrypt-proxy یا حتی Bind برای مدیریت DNS، چرا سراغ AdGuard Home رفتیم؟ انتخاب این ابزار برای پیادهسازی DNS Load Balancer دلایل فنی و کاربردی متعددی دارد که آن را به گزینهای ایدهآل برای استفاده در محیط خانه یا شبکههای کوچک تبدیل میکند:
۱. همهکاره بودن (All-in-One Solution)
۲. رابط کاربری گرافیکی (Dashboard) آسان و کاربرپسند
۳. پشتیبانی داخلی از روشهای مختلف
۴. قابلیت شخصیسازی و DNSCrypt
توجه داشته باشید که AdGuard Home برای استفاده خانگی و شبکههای کوچک عالیه، اما Load Balancer واقعی به معنی Enterprise یا Health Check حرفهای نیست. برای شبکههای بزرگ بهتره از ابزارهایی مثل Unbound یا dnsdist استفاده کنید.
خب بریم برای پیاده سازی یک DNS Load Balancer ، ما از ابزار AdGaurd Home استفاده میکنیم و اون رو به صورت یک container با کمک docker پیاده سازی میکنیم
در ابتدا نیاز است تا شما docker رو بر روی سیستم عامل یا سرور خود نصب داشته باشید، اگه نصب ندارید با داکیومنت میتوانید ان را بر روی سیستم عامل خود نصب کنید
سپس یک فایل متنی با نام docker-compose.yml میسازیم و مقدار زیر را در ان قرار میدهیم.
version: '3.3'
services:
adguardhome:
container_name: adguard-home
image: adguard/adguardhome
volumes:
- work:/opt/adguardhome/work
- conf:/opt/adguardhome/conf
ports:
- 53:53
- 3002:3000
- 80:80/tcp
- 443:443/tcp
- 443:443/udp
restart: unless-stopped
volumes:
work:
conf:
سپس دستور زیر را وارد کنید تا سرویس مورد نظر اجرا شود
docker compose up -d
بعد رفتن به ادرس
http://127.0.0.1:3002
میتوانید وارد بخش تنظیمات اولیه شوید.
در صفحه اولیه تمامی مقادیر رو روی مقدار پیش فرض بزارید و در نهایت پس از تعریف کردن نام کاربری و رمز عبور میتوانید از طریق ادرس
http://127.0.0.1/
وارد پنل خود شوید.
در مرحله اخر ما نیاز داریم تا DNS server ها مورد نظر خود را به AdGuard بدیم تا بین اونها ترافیک رو پخش کنه
در این مثال من از دی ان اس شکن، بگذر و الکترو استفاده میکنم،البته شما میتوانید از هرنوع DNS از هر ارائه دهنده ای استفاده کنید.
برای تنظیم DNS ها ، پس از لاگین به پنل ادمین، از طریق نوار بالا روی گزینه Settings نگه میداریم و روی قسمت DNS Settings کیلیک میکنیم.

سپس DNS سرور های مورد نظر خود را توی لیست Upstream DNS servers قرار دهید، برای مثال:

در ادامه، در بعدی توی قسمت Upstream DNS servers ما میتوانیم به سه شکل از این سرویس استفاده کنیم که شامل:
Load-balancing
:
توی این حالت درخواست های شما هربار به صورت رندوم به یکی از DNS server ها ارسال میشود و بار بین انها تقسیم میشود.
Parallel requests:
در این حالت درخواست به تمامی سرور ها به صورت همزمان ارسال میشود و هر سروری سریع تر پاسخ بدهد، مقدار جواب ان برای شما ارسال میشود.
Fastest IP Address
در این حالت درخواست شما به تمامی سرور ها ارسال میشود و زمانی که همگی پاسخ دادند، AdGuard بررسی میکند که کدام از IP های پاسخ سریع تر هست و در نهایت جواب رو برای شما ارسال میکند.
این روش به دلیل مکانیزمی که دارد باعث میشود تا درخواست های DNS شما کند شود.
پیشنهاد من استفاده از حالت اول و دوم هست، که بنا به نیاز خود میتوانید بین این حالت ها انتخاب کنید.
توی این اموزش حالت Load-balancing را انتخاب میکنیم و در نهایت در انتهای این لیست بر روی گزینه Apply کلیک کنید تا تغییرات شما دخیره شود.
در این قسمت نحوه تست کردن DNS سروری که ساختید توضیح داده میشود و اینکه چطور میتوانید در سیستم خود از ان استفاده کنید.
این روش برای استفاده در سیستم عامل های لینوکسی هست، اگر از MacOs استفاده میکنید این دستور به صورت پیش فرض نصب هست.
برای نصب dig در سیستم عامل های debian base مثل ubuntu یا debian ، دستور زیر را اجرا کنید
sudo apt-get install dnsutils
پس از نصب با اجرا دستور زیر میتوانید dns سرور خود را تست کنید
dig google.com @127.0.0.1
در بخش اول میگیم که میخوایم IP دامنه google.com را با کمک سرور 127.0.0.1 دریافت کنید.
اگر این دستور را داخل یک سیستم دیگر اجرا میکنید باید بجای 127.0.0.1 ،IP مربوط به سیستمی که در ان سرویس خود را اجرا کرده اید وارد کنید
برای مثال اگه IP مربوط به DNS server شما برابر با 192.168.1.27 هست باید به این شکل دستور را وارد کنید:
dig google.com @192.168.1.27
برای استفاده از DNS server متوانید به صورت دستی در تمامی دستگاه هایی که دارید ، ادرس سرور خود را به عنوان DNS server وارد کنید ، یا اینکه برای تنظیم خودکار بر روی تمامی دستگاه های شبکه نیاز است تا بر روی روتر خود ادرس DNS server را برابر با IP سرور خود قرار دهید.