ACL

آشنایی با مفهوم ACL

لیست های دسترسی مجاز (یا Access Control List) یکسری قانون بوده که با استفاده از آنها می توان پکت های تبادل شده در روتر را مورد بررسی و نظارت قرار داد. به عنوان مثال با استفاده از ACL میتوان مشخص کرد تا تنها پکت هایی به سمت شبکه وارد شوند که دارای آدرس مبدا و یا آدرس پورت خاصی باشند. ACLها بیشتر شبیه به دستورات شرطی بوده که با استفاده از آنها می توان یکسری تصمیمات خاصی را برای پکت ها اتخاذ نمود.
به عنوان مثال می توان مشخص کرد که اگر پکت هایی با آدرس مبدا 45.70.48.118 به سمت شبکه شما ارسال شد، آنها را Drop کرد و درغیر اینصورت اجازه ارسال و دریافت به پکتها داده شود.

به بیانی دیگر ACLها همانند یک صافی عمل کرده و تنها پکت هایی از این صافی ها عبور میکنند که دارای یکسری شرایط خاص باشند.

در هنگامی که پکت ها با ACLها مقایسه میشوند، سه موضوع توسط روتر بررسی می شود:

۱. پکت ها با تک تک رول ها به صورت ترتیبی مقایسه میشوند.

۲. پکت ها تا زمانی با رول ها مقایسه میشوند که با یکی از آنها مطابقت پیدا کند. توجه داشته باشید که به محض برقراری شرط، عملیات مقایسه با سایر رول ها متوقف خواهد شد.

۳. در انتهای هر ACL یک دستور Drop به صورت انتزاعی قرار دارد و باعث می شود تا اگر که هیچ یک از رول های ACL با پکت مطابقت پیدا نکند، پکت Drop شود.


پیکربندی ACL

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 در اینترفیس باید در شبکه برقرار باشد :

  1. نباید user1 به web server وصل شود .

  2. کاربر user2 باید بتواند به web server وصل شود .

  3. کاربر user1 باید بتواند web server را ping کند .


حذف ACL

حال یک acl دیگر را امتحان می‌کنیم ابتدا acl قبلی را حذف می‌کنیم :

soodar1(config)# no ip access-list test

مثال محدودیت ssh

در acl جدید ارتباط ssh به web servre را می بندیم و فقط به user2 اجازه می دهیم که بتواند ssh بزند :

Acl

توجه

فرض شده است که 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 را داشته باشد .

Acl-stf

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