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

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

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

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

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

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

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


تعریف ACL

برای تعریف یا اصلاح یک access list ipv4، دستور زیر را صادر کنید:

ip access-list ACL4

آرگومان ACL4 در این دستور نام access list که ایجاد یا اصلاح می‌شود را مشخص می‌کند.

مثال:

soodar(config)# ip access-list ACL_TEST
soodar(config-nacl)#

برای access list ipv6، دستور از نام ipv6 استفاده می‌کند:

ipv6 access-list ACL6

این دستور برای ایجاد یا اصلاح یک access list IPv6 استفاده می‌شود.

  • ACL6: نام access list را مشخص می‌کند.

مثال:

soodar(config)# ipv6 access-list ACL6_TEST
soodar(config-ipv6-acl)#

حذف ACL

از دستور no برای حذف یک IP access-list موجود استفاده کنید:

no ip access-list ACL4

این دستور برای حذف یک access list IPv4 استفاده می‌شود.

  • ACL4: نام access list که باید حذف شود را مشخص می‌کند.

no ipv6 access-list ACL6

این دستور برای حذف یک access list IPv6 استفاده می‌شود.

  • ACL6: نام access list که باید حذف شود را مشخص می‌کند.

Remark

remark LINE

این دستور در یک IP access-list برای وارد کردن یک نظر که هدف یک rule یا بخش خاص access-list را توصیف می‌کند استفاده می‌شود. اساساً این راهی برای مستندسازی access-list برای مرجع آینده است و به ویژه هنگام مدیریت access-list های پیچیده مفید است.

  • LINE: متن نظر را مشخص می‌کند.

تعریف Entry

یک access-list entry یک خط در یک access-list است که مجموعه‌ای از معیارها را برای match کردن با یک بسته ورودی یا خروجی مشخص می‌کند، و یک عمل برای انجام در صورت برقراری معیارها. معیارها می‌توانند شامل آدرس IP مبدا، آدرس IP مقصد، پروتکل، شماره پورت‌ها و سایر ویژگی‌های بسته باشند. عمل می‌تواند اجازه عبور بسته از روتر یا ممنوع کردن آن باشد. Entry های access-list به ترتیب، از بالا به پایین ارزیابی می‌شوند و اولین entry که با ویژگی‌های بسته match می‌کند عمل انجام شده را تعیین می‌کند. اگر هیچ match پیدا نشود، بسته به طور پیش‌فرض deny می‌شود.

Rule ها (یا entry ها) می‌توانند در حالت پیکربندی access-list تعریف شوند.

از آنجایی که access list ها از رویکرد first match استفاده می‌کنند، entry ها اولویت دارند. به طور پیش‌فرض sequential است (اولین entry بالاترین اولویت را دارد)، و رفتار می‌تواند با استفاده از sequence numbers تغییر کند.

ACL Entry

soodar/c/ip-access-list/ACL_TEST# (1-4294967295) <deny|permit> <any|A.B.C.D/M> <any|A.B.C.D/M> [reflect] [exact-match]

این دستور برای ایجاد یک entry access-list که مشخص می‌کند آیا ترافیک بر اساس آدرس‌های IP مبدا و مقصد اجازه داده شود یا ممنوع شود استفاده می‌شود.

  • (1-4294967295): شماره sequence entry access-list را مشخص می‌کند. می‌تواند هر مقداری بین 1 تا 4294967295 باشد.

  • <deny|permit>: مشخص می‌کند که آیا ترافیک که با entry access-list match می‌شود باید اجازه داده شود یا ممنوع شود.

  • <any|A.B.C.D/M>: آدرس IP مبدا یا شبکه ترافیک را مشخص می‌کند. any می‌تواند برای match کردن هر آدرس IP مبدا استفاده شود. به طور متناوب، A.B.C.D/M یک پیشوند شبکه خاص را نشان می‌دهد.

  • <any|A.B.C.D/M>: آدرس IP مقصد یا شبکه ترافیک را مشخص می‌کند. any می‌تواند برای match کردن هر آدرس IP مقصد استفاده شود. به طور متناوب، یک پیشوند شبکه خاص می‌تواند با استفاده از فرمت A.B.C.D/M مشخص شود.

  • reflect: گزینه reflect این entry را stateful می‌کند. هنگام استفاده از این گزینه، روتر اتصال(های) خروجی را ردیابی می‌کند و به طور خودکار entry برگشت را به access-list اضافه می‌کند.

  • exact-match: هنگامی که وارد شود، پیشوندها نیز بررسی می‌شوند و باید یکسان باشند (192.168.1.1/24 با 192.168.1.1/16 match نمی‌شود). این برای برنامه‌هایی مانند فیلتر کردن route BGP مفید است، جایی که یک match خاص به جای یک محدوده آدرس‌ها مورد نیاز است.

Note

ورودی reflexive دینامیک به همان ACL اضافه می‌شود، بنابراین برای اینکه ACL کاملاً مفید باشد، باید در هر دو جهت روی اینترفیس اعمال شود.

Note

گزینه exact-match در route-map ها استفاده می‌شود و در فیلتر کردن بسته عادی تأثیری ندارد.

مثال:

برای ایجاد یک entry access-list که ترافیک از هر مبدا به شبکه مقصد 192.168.1.0/24 را اجازه می‌دهد، دستور به این صورت خواهد بود:

soodar(config)# ip access-list TEST_ACL1
soodar(config-nacl)# 10 permit any 192.168.1.0/24

IPv6 ACL Entry

soodar/c/ipv6-access-list/TEST_ACL1#(1-4294967295) <deny|permit> <any|X:X::X:X/M> <any|X:X::X:X/M> [reflect] [exact-match]

این دستور می‌تواند برای فیلتر کردن ترافیک IPv6 بر اساس آدرس‌های مبدا و/یا مقصد خاص استفاده شود.

  • (1-4294967295): شماره sequence entry access-list را مشخص می‌کند. می‌تواند هر مقداری بین 1 تا 4294967295 باشد.

  • <deny|permit>: مشخص می‌کند که آیا ترافیک که با entry access-list match می‌شود باید اجازه داده شود یا ممنوع شود.

  • <any|X:X::X:X/M>: مشخص می‌کند که آیا ترافیک بر اساس آدرس‌های مبدا و/یا مقصد فیلتر می‌شود.

  • reflect: گزینه reflect این entry را stateful می‌کند.

  • exact-match: برای match دقیق prefix استفاده می‌شود.

ACL Resequencing

Resequencing فرآیند تغییر شماره‌های sequence entry های access control list (ACL) است. ACL ها برای فیلتر کردن ترافیک بر اساس قوانین خاص روی دستگاه‌های شبکه اعمال می‌شوند. زمانی که نیاز به اصلاح یک ACL موجود باشد، ممکن است لازم باشد یک entry را در وسط لیست اضافه یا حذف کنید. در چنین مواردی، resequencing برای حفظ ترتیب منطقی entry های ACL و اطمینان از اینکه ترافیک به درستی پردازش می‌شود انجام می‌شود.

برای مثال، فرض کنید یک ACL ده entry دارد و نیاز به اضافه کردن یک entry جدید بین entry پنجم و ششم است. برای وارد کردن entry جدید، مدیر باید شماره‌های sequence entry های ششم تا دهم را تغییر دهد. entry جدید با شماره sequence شش اضافه می‌شود و entry های موجود به ترتیب جابجا می‌شوند. این اطمینان می‌دهد که ترافیک به ترتیب صحیح پردازش می‌شود و entry جدید قبل از entry های بعدی ارزیابی می‌شود. اما راه حل دیگر این است که همه entry ها را به گونه‌ای resequence کنید که حداقل 1 مقدار بین هر entry وجود داشته باشد (افزایش 2).

ip access-list resequence ACL4 (1-2147483647) START-SEQ-NUM (1-2147483647) INCREMENT

دستور ip access-list resequence برای resequence کردن یک access control list (ACL) موجود استفاده می‌شود. این دستور برای تغییر شماره‌های sequence entry های ACL استفاده می‌شود که به شما امکان می‌دهد rule ها را در ACL بدون نیاز به ایجاد مجدد کامل آن وارد یا حذف کنید.

  • ACL4: نام ACL که می‌خواهید resequence کنید را مشخص می‌کند.

  • START-SEQ-NUM: شماره sequence شروع برای ACL resequence شده را مشخص می‌کند.

  • INCREMENT: مقدار افزایشی که باید برای شماره‌های sequence جدید استفاده شود را مشخص می‌کند.

ipv6 access-list resequence ACL6 (1-2147483647) START-SEQ-NUM (1-2147483647) INCREMENT

این دستور برای resequence کردن یک access list IPv6 استفاده می‌شود.

  • ACL6: نام access list را مشخص می‌کند.

  • START-SEQ-NUM: شماره sequence شروع را مشخص می‌کند.

  • INCREMENT: مقدار افزایش را مشخص می‌کند.

مثال:

اگر یک ACL با نام ACL_TEST دارید و می‌خواهید شماره‌های sequence را از 1 با افزایش 2 شروع کنید، از دستور زیر استفاده می‌کنید:

soodar(config)# ip access-list resequence ACL_TEST 1 2

این دستور شماره‌های sequence entry های ACL را به گونه‌ای تغییر می‌دهد که از 1 شروع شوند و برای هر rule بعدی 2 افزایش یابد.

پیکربندی 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

اعمال یک Access Control List (ACL) روی یک اینترفیس روی یک دستگاه شبکه به مدیر شبکه اجازه می‌دهد ترافیکی که از آن اینترفیس عبور می‌کند را کنترل کند. ACL برای اجازه دادن یا ممنوع کردن ترافیک بر اساس معیارهایی مانند آدرس IP مبدا/مقصد، پروتکل و شماره پورت استفاده می‌شود. ACL ایجاد می‌شود و سپس روی جهت inbound یا outbound اینترفیس اعمال می‌شود. rule های ACL سپس به ترتیب از بالا به پایین پردازش می‌شوند تا یک match پیدا شود و عمل متناظر (permit یا deny) انجام شود. این می‌تواند با جلوگیری از ورود یا خروج ترافیک ناخواسته از یک اینترفیس خاص به امنیت شبکه کمک کند.

ip access-group ACL4 in

این دستور برای اعمال یک access control list (ACL) IPv4 روی یک اینترفیس inbound استفاده می‌شود. این دستور مشخص می‌کند که بسته‌هایی که وارد اینترفیس می‌شوند باید با ACL بررسی شوند. اگر یک بسته با یک دستور permit در ACL match کند، forward می‌شود. اگر با یک دستور deny match کند، drop می‌شود. این دستور معمولاً برای فیلتر کردن ترافیک ورودی از شبکه‌های غیرقابل اعتماد و محدود کردن دسترسی به منابع در یک شبکه استفاده می‌شود.

  • ACL4: نام ACL که می‌خواهید اعمال کنید را مشخص می‌کند.

  • in: نشان می‌دهد که ACL روی ترافیک ورودی اعمال می‌شود.

ipv6 traffic-group ACL6 in

این دستور برای اعمال یک Access Control List (ACL) IPv6 روی یک اینترفیس ingress یک دستگاه استفاده می‌شود. این دستگاه را هدایت می‌کند تا بسته‌های IPv6 ورودی را قبل از forward کردن آن‌ها به مقصدشان با ACL مشخص شده ارزیابی کند.

وقتی دستگاه یک بسته را روی اینترفیس ingress دریافت می‌کند، بسته را با rule های ACL مشخص شده در ACL6 بررسی می‌کند. اگر بسته با یک rule permit در ACL match کند، دستگاه بسته را به next hop forward می‌کند. اگر بسته با یک rule deny در ACL match کند، دستگاه بسته را drop می‌کند.

  • ACL6: به نام ACL IPv6 که روی دستگاه پیکربندی شده است اشاره می‌کند.

  • in: مشخص می‌کند که ACL روی ترافیک ingress اینترفیس اعمال می‌شود.

فرم منفی، ACL را از input اینترفیس جدا می‌کند.

مثال:

دستور زیر ACL IPv4 با نام “IN_ACL” و ACL IPv6 با نام “IN_ACL6” را روی ترافیک inbound اینترفیس ge3 اعمال می‌کند:

soodar(config)# interface ge3
soodar(config-if)# ip access-group IN_ACL in
soodar(config-if)# ipv6 traffic-group IN_ACL6 in
ip access-group ACL4 out

این دستور برای اعمال یک access control list (ACL) IPv4 روی یک اینترفیس برای ترافیکی که اینترفیس را ترک می‌کند استفاده می‌شود.

  • ACL4: نام ACL که می‌خواهید اعمال کنید را مشخص می‌کند.

  • out: نشان می‌دهد که ACL روی ترافیک خروجی اعمال می‌شود.

ipv6 traffic-group ACL6 out

هنگامی که این دستور روی یک اینترفیس پیکربندی می‌شود، باعث می‌شود access list IPv6 مشخص شده روی تمام ترافیکی که اینترفیس را ترک می‌کند اعمال شود.

  • ACL6: به نام ACL IPv6 که روی دستگاه پیکربندی شده است اشاره می‌کند.

  • out: جهت جریان ترافیک که access list باید روی آن اعمال شود را مشخص می‌کند.

فرم منفی، ACL را از output اینترفیس جدا می‌کند.

ip access-group ACL4 in out

این دستور برای اعمال ACL روی هر دو جهت ترافیک استفاده می‌شود.

ipv6 traffic-group ACL6 in out

این دستور ACL را روی هر دو جهت ترافیک اعمال می‌کند. فرم منفی، ACL را از اینترفیس جدا می‌کند.

مثال:

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