Skip to content

Implementation design

M4 edited this page Apr 8, 2023 · 2 revisions

روند پروژه

ساختار کلی به شرح زیر است.

1-دریافت ورودی از کاربر
2-اجرای دستور وارد شده
3-بازگشت به مرحله اول
struct_drawio

در ادامه هر یک از مراحل بالا با جزعیات توضیح داده می‌شوند.

ساختار مورد استفاده :

جهت ذخیره توکن های هر دستوری که وارد می‌شود و همچنین دسترسی آسان به اطلاعات هر دستور از دو ساختار struct و linked list استفاده میکنیم .
سه استراکت ACL-group و ACL-rule و action که نود های لیستهایی به همین اسامی را میسازند.
اضافه کردن, تغییر و یا حذف دستورات acl روی نود های لیست اعمال می‌شود و سپس متناسب با دستور مورد نظر این لیست ها تغییر میکنند .با اعمال دستور های acl روی اینترفیس مورد نظر دستور iptables با توجه به نود های لیست ایجاد میشود.
شناسه نود های لیست اولیهaccess_list_number است و لیست های دیگر روی هر نود از این لیست ایجاد می‌شود.
استراکت action وضعیت ruleهای هر گروه را روی اینترفیس های سیستم مشخص میکند. تصویر زیر استراکت ها و لیست ها را تشریح میکند. list

1-دریافت ورودی از کاربر:

بلافاصله پس از اجرای برنامه کاربر میتواند دستورات ورودی را وارد کند. اعتبار سنجی ها در این مرحله شامل موارد زیر است:
-تنها وارد کردن یک خط دستور مجاز است .
-ورودی تنها میتواند شامل ip و حروف و علامت / باشد.

2-اجرای دستور وارد شده

این قسمت شامل چهار قسمت میشود:
2-1-توکنایز و اعتبار سنجی توکن ها
2-2-ذخیره اطاعات مورد نیاز
2-3-جنریت کردن دستور iptables
2-4-اجرای دستور ساخته شده
توضیحات هر قسمت به شرح زیر است:
2-1-دستورات وارد شده tokenize می‌شوند و با توجه به token های دریافت شده فیلد های مورد نیاز مقدار دهی میشوند.
در صورتی که فقط یک توکن exit وارد شده باشد برنامه پایان مییابد.
در صورتی که اولین توکن رشته ای غیر از show,access-list,no,ip باشد(همچنین exit) خطا است.
در صورتی که توکن اول no باشد توکن دوم فقط میتواند ip یا access-list باشد و هر چیز دیگری خطا است.
2-2-پس از رد کردن مراحل بالا توکن های مورد نیاز جهت استفاده های بعدی در فیلد های استراکت های action و acl ذخیره می‌شوند و با توجه به acl_number نود acl در جای مناسب خود در لیست قرار میگیرد.(به تصویر ۲ مراجعه شود).
tokenize_1_

2-3-در این مرحله با توجه به ورودی و توکن های دیافت شده دستور iptables ساخته می‌شود.
در صورتی که ip/mask و access_list_number (کلید های هر دستور)با هر یک از نود های لیست یکسان بود ,دستور جدید باید جایگزین دستور قبلی می‌شود(نود آپدیت میشود) در نتیجه ابتدا باید دستور قدیمی iptables با آپشن -D حذف شودو سپس دستور جدید ایجاد شود.
در زیر ارتباط توکن های دستور acl و پارامتر دستور iptables معرفی میشوند:
اگر توکن اول no داشته باشیم باید از آپشن -D در iptables استفاده شود و دستور ورودی (ادامه دستور بعد از no ) از لیست acl پاک می‌شود.
توکن مربوط به {permit|deny} مشخص میکند که از DROP یا ACCEPT در iptables استفاده شود.
توکن {host|source source-wildcard|any} بعد از آپشن -s در iptables می‌آید و در صورت معتبر نبودن ایجاد خطا میکند(IPvalidation)
در صورت وجود توکن [log] آپشن -v به دستور iptables اضافه می‌شود(نوع لاگ در دستور iptables قابل فیلتر کردن میباشد) .
توکن {in|out} مشخص میکند که از آپشن -i یا -o قبل از معرفی اینترفیس در iptables استفاده شود.
توکن interface نام اینترفیس است و بدون تغییر در iptables جایگذاری میشود همچنین قبل از جایگذاری بررسی میکنیم که اینترفیس نام برده شده معتبر باشد. این کار را میتوان به کمک ساختار Address Family و متد getifaddrs انجام داد .
محتوای توکن in/out و همچنین نام اینترفیس در فیلد های استراکت action نگهداری میشوند. //توکن number در دستور access-group همان access_list_number است.
2-4-بعد از تکمیل شدن اجزای دستور iptables آن را اجرا میکنیم.
در صورت عدم موفقیت اجرای دستور به کاربر اطلاع داده می‌شود.
در صورتی که دستور خروجی داشته باشد چاپ می‌شود در غیر این صورت برنامه در انتظار ورودی بعدی کاربرمی ماند .
generate_drawio

خروجی

خروجی های برنامه میتواند یکی از سه حالت زیر باشد:
3-1-بدون خروجی: دستور با موفقیت اجرا شده و ترمینال منتظر دریافت دستور بعدی است.
3-2-نمایش اطلاعات: دستور” show std-acl “ جهت چاپ تمام دستورات اعمال شده برای acl میباشد.به عبارت دیگر تمام نود های لیست ACL-group و نود های وابسته آن‌ها چاپ میشود.
3-3-پیغام خطا: در طی برنامه با توجه به return value یکی از پیغام خطاهای لیست زیر نمایش داده میشود:
Invalid command =دستور ورودی اشتباه بوده و یا مقادیر نامعتبر داشته است.
Invalid IP/mask=آدرس IP یا mask اشتباه است.
Faile to run command=در صورتی ناموفق بودن اجرای دستور iptables نمایش داده میشود.

3-بازگشت به مرحله اول

در صورتی که کاربر دستور مربوط به خروج از برنامه را وارد نکرده باشد تمام مراحل از مرحله شماره ۱ مجدد تکرار میشود.