آبجی
4th October 2009, 01:27 PM
یکی از مشکلاتی که معمولا بر روی شبکههای داخلی وجود دارد، مصرف پهنای باند توسط کاربرانی خاص و عدم پخش مناسب آن بر روی کل شبکه است. به طوری که یک کاربر میتواند کل پهنای باند شبکه را مصرف کرده و سایر کاربران را دچار مشکل کند. راههای متعددی برای کنترل مصرف پهنای باند مانند ابزارهای Traffic Shaper و... شبکه وجود دارد که از حوصله این مقاله خارج است. ما در این مقاله کوچک سعی داریم تا نحوه کنترل مصرف پهنای باند را توسط سرویس دهنده squid آموزش دهیم.
قدم اول
فرض میکنیم که یک اتصال مودم یا DSL به شبکه اینترنت داریم که رابط آن ppp0 بوده، رابط شبکه محلی نیز eth0 و آدرس شبکه داخلی 192.168.0.0/24 میباشد. مواردی که برای پیاده سازی کنترل مصرف پهنای باند شبکه نیاز داریم عبارتند از یک سرویسدهنده squid و سیستم iptables که بر روی هر ماشین گنو/لینوکس وجود دارد. مراحل نصب، پیکربندی و تنظیم بسیار ساده است.
Squid چگونه کار میکند؟
سرویسدهنده Squid پیشرفتهترین سرویسدهنده پراکسی موجود برای سیستمعامل گنو/لینوکس میباشد. این سرویسدهنده به دو روش میتواند در پهنای باند صرفه جویی نماید:
۱) نخست از طریق حفظ صفحات، تصاویر و سایر اقلام دریافت شده بر روی حافظه یا فضای دیسک. بنابراین در صورتی که کاربران تقاضای دریافت مجدد یک صفحه تکراری را نمایند، این صفحه از روی اینترنت دریافت نخواهد شد.
۲) در کنار سیستم Caching معمولی، Squid دارای قابلیتی به نام delay pools است که از طریق آن میتوانید ترافیک اینترنت را بطور معقولانهای کنترل نمایید. این کار از طریق تعریف کلمات کلیدی موجود در آدرسهای URL انجام میگیرد. برای مثال میتوانید کلماتی مانند mp3، mpg، exe و... را بعنوان کلمات کلیدی تعریف نمایید. با استفاده از این کلمات کلیدی، میتوانیم به Squid بگوییم تا آنها را حداکثر با سرعت خاصی دریافت نماید. میتوان پهنای باند باقیمانده را برای سرویسهای دیگر مانند مرور وب، پست الکترونیکی و... باقی گذاشت و یا حتی آنرا نیز محدود کرد.
نصب و پیکربندی ابزارهای لازم
در این بخش به بررسی چگونگی نصب و پیکربندی ابزارهای لازم میپردازیم. مهمترین نکته در این بخش، فعال بودن ویژگی Delay Pools در Squid میباشد. در صورتی که Squid را از طریق کامپایل نصب کردهاید، حتما بررسی کنید که به همراه گزینه enable-delay-pools-- کامپایل شده باشد، در غیر اینصورت باید آنرا مجددا کامپایل کنید. معمولا بستههایی که به همراه توزیعها ارائه میشود، دارای چنین ویژگیی به صورت پیشگزیده میباشد. با فرض اینکه از توزیع دبیان استفاده میکنید، Squid را نصب میکنیم:
# apt-get install squid
سرویسدهنده Squid از روی مخازن مربوطه دریافت و نصب خواهد شد. در قدم دوم، باید این سرویسدهنده را برای مقاصد خودمان تنظیم کنیم. به همراه تنظیم Delay Pools، سرویسدهنده برای ارائه سرویس Transparent Proxy نیز تنظیم خواهد شد. فایل پیکربندی مورد استفاده در Squid به شکل زیر خواهد بود:
#SQUID PORT
http_port 8080
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 16 MB
maximum_object_size 4096 KB
maximum_object_size_in_memory 10 KB
#CACHE DIR CONFIG
cache_dir ufs /var/spool/squid 512 16 512
#LOGS
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
hosts_file /etc/hosts
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
# OUR LOCAL LAN
acl local src 192.168.0.0/255.255.255.0
acl SSL_ports port 443 563
acl SSL_ports port 873
acl Safe_ports port 80 21 443 563 70 210 631 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost local
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_reply_access allow all
#HOSTNAME
visible_hostname power
#TRANSPARENT PROXY
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
store_avg_object_size 50 KB
coredump_dir /var/spool/squid
#DELAY POOLS
acl magic_words1 url_regex -i 192.168
acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .rpm .zip .tar.gz .gz .rar .avi .mpeg .mpe .mpg .qt .ram .rm .iso .raw .wav .mov .swf
acl day time 08:00-23:59
delay_pools 2
delay_class 1 2
delay_parameters 1 4500/40000 4500/40000
delay_access 1 allow magic_words1
delay_class 2 2
delay_parameters 2 4500/40000 4500/40000
delay_access 2 allow day
delay_access 2 deny !day
delay_access 2 allow magic_words2
این فایل پیکربندی در آدرس etc/squid/squid.conf/ قرار میگیرد. مهمترین بخش این فایل برای کنترل ترافیک، بخش مشخص شده با DELAY POOLS است.
در خط نخست این بخش یک acl برای شبکه داخلی تعریف شده و در خط دوم انواع فایلهایی که مایل به محدود کردن دریافت آنها هستیم، مشخص شده است.
در خط سوم، ساعات کاری که محدودیتها در آن اعمال میشوند مشخص شده و در خط بعدی، دو Delay Pool مختلف تعریف شده است.
خط delay_class مشخص کننده نوع کلاس pool بکار رفته میباشد. سه نوع کلاس delay pool وجود دارد که برای اطلاع دقیق از انها میتوانید به مستندات سرویسدهنده Squid مراجعه نمایید.
خط delay_parameters 1 مشخص کننده محدودیتهای اعمالی برای شبکه داخلی است. در این خط مشخص شده که در صورتی که کل شبکه یا یک آدرس IP خاص مقدار حجم دریافتی معادل ۴۰ مگابایت داشت، از آن پس، سرعت دریافت آن به ۴/۵ کیلوبایت در ثانیه کاهش یابد. درصورتی که مایلید تا محدودیت برای مرور صفحات وجود نداشته باشد و در هنگام مرور صفحات، همیشه حداکثر سرعت در اختیار باشد، این خط را به صورت زیر تغییر دهید:
delay_parameters 1 -1/-1 -1/-1
عدد منفی یک مشخص کننده عدم وجود محدودیت است. همانطور که در مثال بالا میبینید، محدودیت ساعت در خطوط تنظیم کننده مربوط به delay_parameters 2 اعمال شده است. توجه داشته باشید که اعدادی فایل پیکربندی فوق تماما مثال بوده و آنها را باید بنا به شرایط شبکه خودتان تنظیم کنید.
پس از اعمال تنظیمات فوق، سرویسدهنده Squid را راهاندازی میکنیم:
# squid -z
# /etc/init.d/squid start
در مرحله بعدی تنظیم و پیکربندی، باید اشتراک اینترنت و تنظیمات iptables را برای transparent proxy انجام دهیم. برای این کار میتوان از یک اسکریپت ساده مانند زیر استفاده کرد:
#!/bin/sh
IPTABLES=/sbin/iptables
$IPTABLES -F
$IPTABLES -t nat -A PREROUTING -i lan1 -p tcp --dport 80 -j REDIRECT --to-port 8080
$IPTABLES -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
echo Starting Internet Connection Sharing...
کافی است این اسکریپت را در شاخه etc/init.d/ با نامی مانند ics ذخیره کرده و آنرا با chmod +x اجرایی کنید. سپس برای اینکه در هنگام بوت اجرا شود، از دستور زیر استفاده نمایید:
# ln -s /etc/init.d/ics /etc/rc2.d/S99ics
از این پس هنگام بوت سیستم (سطح اجرایی ۲ در دبیان) اسکریپت ics اجرا خواهد شد و میتوانید ببینید که تنظیمات کنترلی به خوبی کار میکنند.{happy}
قدم اول
فرض میکنیم که یک اتصال مودم یا DSL به شبکه اینترنت داریم که رابط آن ppp0 بوده، رابط شبکه محلی نیز eth0 و آدرس شبکه داخلی 192.168.0.0/24 میباشد. مواردی که برای پیاده سازی کنترل مصرف پهنای باند شبکه نیاز داریم عبارتند از یک سرویسدهنده squid و سیستم iptables که بر روی هر ماشین گنو/لینوکس وجود دارد. مراحل نصب، پیکربندی و تنظیم بسیار ساده است.
Squid چگونه کار میکند؟
سرویسدهنده Squid پیشرفتهترین سرویسدهنده پراکسی موجود برای سیستمعامل گنو/لینوکس میباشد. این سرویسدهنده به دو روش میتواند در پهنای باند صرفه جویی نماید:
۱) نخست از طریق حفظ صفحات، تصاویر و سایر اقلام دریافت شده بر روی حافظه یا فضای دیسک. بنابراین در صورتی که کاربران تقاضای دریافت مجدد یک صفحه تکراری را نمایند، این صفحه از روی اینترنت دریافت نخواهد شد.
۲) در کنار سیستم Caching معمولی، Squid دارای قابلیتی به نام delay pools است که از طریق آن میتوانید ترافیک اینترنت را بطور معقولانهای کنترل نمایید. این کار از طریق تعریف کلمات کلیدی موجود در آدرسهای URL انجام میگیرد. برای مثال میتوانید کلماتی مانند mp3، mpg، exe و... را بعنوان کلمات کلیدی تعریف نمایید. با استفاده از این کلمات کلیدی، میتوانیم به Squid بگوییم تا آنها را حداکثر با سرعت خاصی دریافت نماید. میتوان پهنای باند باقیمانده را برای سرویسهای دیگر مانند مرور وب، پست الکترونیکی و... باقی گذاشت و یا حتی آنرا نیز محدود کرد.
نصب و پیکربندی ابزارهای لازم
در این بخش به بررسی چگونگی نصب و پیکربندی ابزارهای لازم میپردازیم. مهمترین نکته در این بخش، فعال بودن ویژگی Delay Pools در Squid میباشد. در صورتی که Squid را از طریق کامپایل نصب کردهاید، حتما بررسی کنید که به همراه گزینه enable-delay-pools-- کامپایل شده باشد، در غیر اینصورت باید آنرا مجددا کامپایل کنید. معمولا بستههایی که به همراه توزیعها ارائه میشود، دارای چنین ویژگیی به صورت پیشگزیده میباشد. با فرض اینکه از توزیع دبیان استفاده میکنید، Squid را نصب میکنیم:
# apt-get install squid
سرویسدهنده Squid از روی مخازن مربوطه دریافت و نصب خواهد شد. در قدم دوم، باید این سرویسدهنده را برای مقاصد خودمان تنظیم کنیم. به همراه تنظیم Delay Pools، سرویسدهنده برای ارائه سرویس Transparent Proxy نیز تنظیم خواهد شد. فایل پیکربندی مورد استفاده در Squid به شکل زیر خواهد بود:
#SQUID PORT
http_port 8080
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 16 MB
maximum_object_size 4096 KB
maximum_object_size_in_memory 10 KB
#CACHE DIR CONFIG
cache_dir ufs /var/spool/squid 512 16 512
#LOGS
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
hosts_file /etc/hosts
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
# OUR LOCAL LAN
acl local src 192.168.0.0/255.255.255.0
acl SSL_ports port 443 563
acl SSL_ports port 873
acl Safe_ports port 80 21 443 563 70 210 631 901 1025-65535
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost local
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_reply_access allow all
#HOSTNAME
visible_hostname power
#TRANSPARENT PROXY
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
store_avg_object_size 50 KB
coredump_dir /var/spool/squid
#DELAY POOLS
acl magic_words1 url_regex -i 192.168
acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .rpm .zip .tar.gz .gz .rar .avi .mpeg .mpe .mpg .qt .ram .rm .iso .raw .wav .mov .swf
acl day time 08:00-23:59
delay_pools 2
delay_class 1 2
delay_parameters 1 4500/40000 4500/40000
delay_access 1 allow magic_words1
delay_class 2 2
delay_parameters 2 4500/40000 4500/40000
delay_access 2 allow day
delay_access 2 deny !day
delay_access 2 allow magic_words2
این فایل پیکربندی در آدرس etc/squid/squid.conf/ قرار میگیرد. مهمترین بخش این فایل برای کنترل ترافیک، بخش مشخص شده با DELAY POOLS است.
در خط نخست این بخش یک acl برای شبکه داخلی تعریف شده و در خط دوم انواع فایلهایی که مایل به محدود کردن دریافت آنها هستیم، مشخص شده است.
در خط سوم، ساعات کاری که محدودیتها در آن اعمال میشوند مشخص شده و در خط بعدی، دو Delay Pool مختلف تعریف شده است.
خط delay_class مشخص کننده نوع کلاس pool بکار رفته میباشد. سه نوع کلاس delay pool وجود دارد که برای اطلاع دقیق از انها میتوانید به مستندات سرویسدهنده Squid مراجعه نمایید.
خط delay_parameters 1 مشخص کننده محدودیتهای اعمالی برای شبکه داخلی است. در این خط مشخص شده که در صورتی که کل شبکه یا یک آدرس IP خاص مقدار حجم دریافتی معادل ۴۰ مگابایت داشت، از آن پس، سرعت دریافت آن به ۴/۵ کیلوبایت در ثانیه کاهش یابد. درصورتی که مایلید تا محدودیت برای مرور صفحات وجود نداشته باشد و در هنگام مرور صفحات، همیشه حداکثر سرعت در اختیار باشد، این خط را به صورت زیر تغییر دهید:
delay_parameters 1 -1/-1 -1/-1
عدد منفی یک مشخص کننده عدم وجود محدودیت است. همانطور که در مثال بالا میبینید، محدودیت ساعت در خطوط تنظیم کننده مربوط به delay_parameters 2 اعمال شده است. توجه داشته باشید که اعدادی فایل پیکربندی فوق تماما مثال بوده و آنها را باید بنا به شرایط شبکه خودتان تنظیم کنید.
پس از اعمال تنظیمات فوق، سرویسدهنده Squid را راهاندازی میکنیم:
# squid -z
# /etc/init.d/squid start
در مرحله بعدی تنظیم و پیکربندی، باید اشتراک اینترنت و تنظیمات iptables را برای transparent proxy انجام دهیم. برای این کار میتوان از یک اسکریپت ساده مانند زیر استفاده کرد:
#!/bin/sh
IPTABLES=/sbin/iptables
$IPTABLES -F
$IPTABLES -t nat -A PREROUTING -i lan1 -p tcp --dport 80 -j REDIRECT --to-port 8080
$IPTABLES -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
echo Starting Internet Connection Sharing...
کافی است این اسکریپت را در شاخه etc/init.d/ با نامی مانند ics ذخیره کرده و آنرا با chmod +x اجرایی کنید. سپس برای اینکه در هنگام بوت اجرا شود، از دستور زیر استفاده نمایید:
# ln -s /etc/init.d/ics /etc/rc2.d/S99ics
از این پس هنگام بوت سیستم (سطح اجرایی ۲ در دبیان) اسکریپت ics اجرا خواهد شد و میتوانید ببینید که تنظیمات کنترلی به خوبی کار میکنند.{happy}