ACL
آشنایی با مفهوم ACL
لیست های دسترسی مجاز (یا Access Control List) یکسری قانون بوده که با استفاده از آنها می توان پکت های تبادل شده در روتر را مورد بررسی و نظارت قرار داد. به عنوان مثال با استفاده از ACL میتوان مشخص کرد تا تنها پکت هایی به سمت شبکه وارد شوند که دارای آدرس مبدا و یا آدرس پورت خاصی باشند. ACLها بیشتر شبیه به دستورات شرطی بوده که با استفاده از آنها می توان یکسری تصمیمات خاصی را برای پکت ها اتخاذ نمود.
به عنوان مثال می توان مشخص کرد که اگر پکت هایی با آدرس مبدا 45.70.48.118 به سمت شبکه شما ارسال شد، آنها را Drop کرد و درغیر اینصورت اجازه ارسال و دریافت به پکتها داده شود.
به بیانی دیگر ACLها همانند یک صافی عمل کرده و تنها پکت هایی از این صافی ها عبور میکنند که دارای یکسری شرایط خاص باشند.
در هنگامی که پکت ها با ACLها مقایسه میشوند، سه موضوع توسط روتر بررسی می شود:
۱. پکت ها با تک تک رول ها به صورت ترتیبی مقایسه میشوند.
۲. پکت ها تا زمانی با رول ها مقایسه میشوند که با یکی از آنها مطابقت پیدا کند. توجه داشته باشید که به محض برقراری شرط، عملیات مقایسه با سایر رول ها متوقف خواهد شد.
۳. در انتهای هر ACL یک دستور Drop به صورت انتزاعی قرار دارد و باعث می شود تا اگر که هیچ یک از رول های ACL با پکت مطابقت پیدا نکند، پکت Drop شود.
پیکربندی ACL
فرض کنید قصد داریم دسترسی به web را برای user1 مسدود کنیم : به ترتیب زیر ترافیک tcp مربوط به پورت 80 را از مبدا 1.1.1.10 به مقصد web server مسدود می کنیم :
soodar1(config)# ip access-list test
soodar1(config-nacl)# deny tcp 1.1.1.10/32 2.1.1.10/24 eq 80
soodar1(config-nacl)# permit any any
اعمال ACL در اینترفیس
هنگامی که یک ACL در روتر تعریف شد، هیچ فیلتری برروی پکتها اعمال نمی شود تا زمانی که ACLها برروی پورت های روتر اعمال شود و اینکه مشخص گردد که ACLها برروی ترافیک های خروجی و یا ورودی اعمال گردند. پس با توجه به این موضوع مسیر جریان های هر اینترفیس، به دو دسته تقسیم می شود که شامل:
ترافیک های لبه ورودی (یا Inbound): در این حالت روتر قبل از اینکه اقدام به مسیریابی پکت ها کند، شرط های ACL را مورد بررسی قرار می دهد و در صورتی که شرایط مشخص شده در ACL برقرار گردید، عملیات مسیریابی پکت ها صورت میپذیرد.
ترافیک های لبه خروجی (یا Outbound): در این حالت روتر بعد از اینکه عملیات مربوط به مسیریابی پکت را انجام داد، قبل از اینکه پکت به سمت خارج هدایت شود، شرط های ACL را مورد بررسی قرار میدهد و در صورتی که شرایط مشخص شده در ACL برقرار گردید، عملیات مسیریابی پکت ها صورت میپذیرد.
حال با اعمال ACl در اینترفیس در جهت inbound محدودیت مورد نظر برای user1 اعمال می شود و کلیه بسته های tcp با پورت 80 را به مقصد server حذف می کند .
soodar1(config)# int ge2
soodar1(config-if)# ip access-group test in
مشاهده ACL
1. مشاهده یک ACL خاص
با دستور زیر می توان رول های اضافه شده در هر acl را مشاهده کرد :
soodar1(config)# show ip access-list test
soodar1# show ip access-list test
IP access list test
10 deny icmp 1.1.1.10/32 le 65535 2.1.1.0/24 le 65535
20 permit any any
2. مشاهده تمامی ACL ها
اگر نام ACL را مشخص نکنید تمام ACL های موجود (IPv6 یا IPv4) در روتر را می توانید مشاهده کنید که البته ما در اینجا فقط یک ACL داریم و خروجی هر دو حالت نمایش تفاوتی ندارد:
soodar1# show ip access-list
IP access list test
10 deny icmp 1.1.1.10/32 le 65535 2.1.1.0/24 le 65535
20 permit any any
بررسی عملکرد ACL
شرایط زیر پس از اعمال ACL در اینترفیس باید در شبکه برقرار باشد :
نباید user1 به web server وصل شود .
کاربر user2 باید بتواند به web server وصل شود .
کاربر user1 باید بتواند web server را ping کند .
حذف ACL
حال یک acl دیگر را امتحان میکنیم ابتدا acl قبلی را حذف میکنیم :
soodar1(config)# no ip access-list test
مثال محدودیت ssh
در acl جدید ارتباط ssh به web servre را می بندیم و فقط به user2 اجازه می دهیم که بتواند ssh بزند :
توجه
فرض شده است که ssh روی پورت پیش فرض 22 فعال است
soodar1(config)# ip access-list SSH-FILTER
soodar1(config-nacl)# 1 permit tcp 1.1.1.20/32 2.1.1.10/32 eq 22
soodar1(config-nacl)# 2 deny tcp 1.1.1.10/32 2.1.1.10/32 eq 22
soodar1(config-nacl)# permit any any
soodar1(config-nacl)# do sh ip access-list SSH-FILTER
IP access list SSH-FILTER
seq 1 permit tcp 1.1.1.20/32 2.1.1.10/32 eq 22
seq 2 deny tcp 1.1.1.10/32 2.1.1.10/32 eq 22
seq 7 permit any any
soodar1(config)# int ge2
soodar1(config-if)# ip access-group SSH-FILTER
IPv6 ACl
مانند دیگر ویژگی های روتر سودار IPv6 نیز در ACL پشتیبانی می شود و شما می توانید ترافیک شبکه IPv6 خود را نیز با استفاده از ACL ها مدیریت کنید . در مثال زیر نمونه ای از تنظیم یک ACL در IPv6 را مشاهده می کنید :
soodar1(config)# ipv6 access-list testipv6
soodar1(config-ipv6-acl)# 1 deny tcp any 2001:1:2::2/64 eq 80
soodar1(config-ipv6-acl)# permit any any
soodar1(config-ipv6-acl)# do sh ipv6 access-list
IPv6 access list testipv6
seq 1 deny tcp any 2001:1:2::/64 eq 80
seq 6 permit any any
ACL با نام سرویس
در روتر سودار برای راحتی کار ادمین برخی از سرویس های پرکاربرد و به عبارت دیگر پروتکل های پرکاربرد را می توان به راحتی و تنها با استفاده از نام پروتکل در ACL استفاده کرد و ترافیک ها مربوط به آن پروتکل را برای کاربر و یا شبکه خاصی محدود کرد .
برای مثال اگر بخواهیم همان محدودیتی که برای ترافیک tcp با پورت 80 برای user1 در نمونه های قبلی اعمال کردیم را با استفاده از نام سرویس محدود کنیم کافی است پروتکل http را برای user1 ببندیم :
soodar1(config)# ip access-list denyhttp
soodar1(config-ipv6-acl)# 10 deny http 1.1.1.10/32 2.1.1.10/24
soodar1(config-ipv6-acl)# permit any any
soodar1(config-nacl)# do sh ip access-list
IP access list denyhttp
seq 10 deny tcp 1.1.1.10/32 2.1.1.0/24 eq 80
seq 15 permit any any
توجه
توجه شود در زمان استفاده از نام پروتکل در ACL باید index بعدی رولی که اضافه می کنیم خالی باشد و هیچ رول دیگری وجود نداشته باشد . به طور نمونه در این مثال ما از index شماره 10 استفاده کرده ایم و باید در index شماره 11 هیچ رولی نداشته باشیم . بدین علت این شرایط باید رعایت شود که یک رول برای مسیر کلاینت به سرور و یک رول برای مسیر سرور به کلاینت در ACL اضافه می شود .
همان طور که در sh ip access-list می بینید 2 رول برای http اضافه شده است .
توجه
ACLها را به نحوی تعریف کنید که فیلترهای کلی در ابتدای لیست قرار داشته باشند و فیلترهای جزئی در انتهای لیست.
در صورتی که در اتنهای ACL از دستور permit any استفاده نشود و پکت ها با شرط های مشخص شده مطابقت نداشته باشد، پکت دور ریخته (Drop) خواهد شد.
ACLها تنها به ترافیک هایی اعمال خواهد شد که از روتر عبور میکنند، پس درنتیجه ترافیک هایی که از روتر تولید و ارسال می شوند با ACLها محدود نخواهند شد.
ACl Stateful
در acl stateless روتر نشست ها را بررسی نمی کند و شما لازم است برای مسیرهای برگشت خودتان رول های مد نظر را اضافه کنید اما وقتی یک acl در حالت stateful اضافه می شود نشست ها تشخیص داده شده و به محض match شدن یک بسته ، رول برعکس (مسیر برگشت همان بسته) به صورت خودکار اضافه می شود . برای مثال در شکل زیر قصد داریم که user1,user2 به web server دسترسی داشته باشند و user1 امکان ssh به web server را داشته باشد .
n2(config-nacl)# permit tcp 1.1.1.10/32 2.1.1.10/32 eq 443 reflect
n2(config-nacl)# permit tcp 1.2.1.10/32 2.1.1.10/32 eq 443 reflect
n2(config-nacl)# permit tcp 1.1.1.10/32 2.1.1.10/32 eq 22 reflect
توجه
دقت کنید وقتی در acl از رول های reflect استفاده کرده اید یا به عبارت دیگر acl شما stateful است باید acl را در اینترفیس در هر دو جهت in و out اعمال کنید
با توجه به رول هایی در acl اضافه کرده ایم این acl باید در اینترفیس ge0 اعمال شود حال acl را در اینترفیس ge0 اعمال می کنیم :
n2(config)# int ge0
n2(config-if)# ip access-group ACL-web-server in out
n2(config-if)# do sh ip access-list interfaces
Interface ge0
Egress ACL: ACL-web-server
Ingress ACL: ACL-web-server
Interface ge1
Egress ACL:
Ingress ACL:
n2(config-if)#
با این تنظیمات اگر بسته tcp با مبدا 1.1.1.10
(user1) و مقصد 2.1.1.10
(web server) با پروتکل tcp
و destination port برابر با 22
به اینترفیس ge0
در روتر n2 وارد شود ، روتر n2 اجازه خروج بسته پاسخ
(بسته با مبدا 2.1.1.10 و مقصد 1.1.1.10 و پروتکل tcp و source port برابر 22) را از اینترفیس ge0 می دهد . به همین شکل برای بسته های https
برای user1 و user2 عمل خواهد کرد .
فعال کردن log های ACL
با دستور زیر می توانید Log های مربوط به acl را فعال کنید:
soodar1# debug acl event
resequence کردن
اگر بخواهید شماره تمامی رول های تنظیم شده در یک acl را مجددا تنظیم کنید باید از resequence استفاده کنید :
ip access-list resequence ACL4 (1-2147483647) (1-32765)
که در آن ACL4 نام acl ، شماره اول شماره شروع و شماره دوم گام های افزایش است .
مثال :
soodar1(config-nacl)# do sh ip access-list
IP access list TEST
10 permit 1.1.1.10/32 2.1.1.10/32
13 deny 1.1.1.10/32 2.1.1.20/32
19 deny 1.2.1.10/32 any
22 deny 1.2.1.2/32 any
soodar1(config-nacl)# q
soodar1(config)# ip access-list resequence TEST 1000 10
soodar1(config)# do sh ip access-list TEST
IP access list TEST
1000 permit 1.1.1.10/32 2.1.1.10/32
1010 deny 1.1.1.10/32 2.1.1.20/32
1020 deny 1.2.1.10/32 any
1030 deny 1.2.1.2/32 any