Last Update: 2022-06-10 - 00:51
در این آموزش میخوایم با فایروال قدرتمند Iptables آشنا بشیم و با این فایروال بیایم قانون ها و پالیسی های مختلفی که میخوایم رو پیاده سازی کنیم.
1 - تو قسمت اول راجب خود iptables و netfilters حرف میزنیم و بعد به ساختار کلی iptables نگاه میندازیم یه سری مفاهیم پایه ای رو یاد میگیریم و میریم جلو.
2 - در قسمت دوم با پارامتر های iptables اشنا میشم، ساختار کلیشون رو برسی میکینم و... که میتونید ازشون برای نوشتن قانون ها حذف، ادیت و ... استفاده کنید.
3 - در قسمت آخر یا بهتر بگیم یکی مونده به اخر میام کامند های iptables رو نگاه و برسی میکنم و با هم میریم جلو.
4 - در قسمت اخر هم میایم یه سری مثال عملی میزنیم که بیشتر سعی میشه ترکیبی از چیز هایی باشه که یاد گرفتیم تا قابل لمس تر بشه کل ماجرا.
نکته: ممکنه در طول این چند قسمت از یه چیز هایی اسم ببریم و توضیح زیادی راجبش ندیم به 2 دلیل، اول اینکه بعضیاش رو خود من هم دانش کافی ندارم ازشون و نمیتونم توضیح کاملی ارئه بدم و دلیل دوم این هستش که خود این موارد یه مقاله جدا میخواد یعنی از موضوع این مقاله خارج میشه و بیشتر سمت شبکه هستش و میتونه خیلی عمیق تر بشه و.... برای همین اگه چیزی رو متوجه نشدید پیشنهاد میکنم گوگل کنید.
در ابتدا تو کرنل 1.1 لینوکس ابزار ipfilter وجود داشت که برای فیلتر کردن و اعمال قوانین از ابزار ipfwadm استفاده میکرد؛ تو کرنل 2.2 به بعد ابزاری به اسم IPChains معرفی شد و در کرنل 2.4 به بعد هم iptables اومد که تا الان هم استفاده میشه این فایروال توسط تیم netfilter ساخته شده. خود iptables برای ipv4 کار میکنه از ipv6 هم پشتیبانی میکنه و یه نسخه ip6tables هم داره برای ipv4 هم میشه ازش استفاده کرد.!فایروال iptables یه فایروال عالی برای سیستم های لینوکسی هستش که خیلی خوب میتونه پکت ها رو هندل کنه وقابلیت های خیلی زیادی رو به ما میده.
خود Netfilter شامل 5 تا hook هستش که برنامه میتونه با اونا کار بکنه، هر پکتی که وارد فرایند پردازش میشه با یکی از این hook ها در kernel تطبیق داده میشود و کل میشه، بسته به نوع هر پکت یه hook بهش اختصاص داده میشه:
در اصل iptables یه نرم افزار userspace هستش که با netfilter کار میکنه، خود Netfilter با کرنل در ارتباط هستش و وقتی پکتی وارد شبکه ما میشه با استفاده از hook های netfilter اون پکت با قوانینی که داخل iptables نوشته شده تطبیق داده میشه و باتوجه به قوانین با اون پکت برخود میشه ( مثلا اگه گفته باشه Drop کن دراپ میکنه یا هرچیز دیگه ای که براش ست شده باشه در ادامه بیشتر میگیم .)
همون طور که گفتیم iptables یه پکیج تو سطح کاربر هستش و راحت کاربر میتونه باهاش قانون هایی رو که میخواد بنویسه و خیلی قابل کاستومایز هستش؛ همچین دستمون باز تره، میتونیم از firewalld هم استفاده کنیم که user friendly تر هستش ولی امروز ما میخوایم با iptables کار کنیم.
در iptables یه سری Table مشخص وجود داره که هرکدوم از اون Table ها یه سری Chain داخلشون هست که تو شکل پایین میتونیم خیلی بهتر ببینیم این موضوع رو:
خب بر اساس شکل بالا ما میایم مواردی رو اینجا توضیح میدیم و مواردی رو هم در آینده...
وظیفه جدول Filter پالیسی(سیاست) گذاشتن و دادن مجوز برای ورود و خروج پکت ها به سیستم هستش(فیلترشون میکنه:))، این جدول خودش شامل سه تا چین INPUT برای ترافیک ورودی به سیستم، OUTPUT برای ترافیک خروجی سیستم و FORWARD برای ترافیک فوروارد شده از سیستم هستش که بعدا بیشتر درکش میکنیم.
از جدول Nat برای قانون گذاری و دادن مجوز برای عملایت مسیر یابی استفاده میشه و قوانین مربوط به تغییر آدرس IP و یا پورت در جدول nat قرار میگیره، این جدول شامل سه تا چین PREROUTING برای شبکه مقصد در ترافیک ورودی به سیستم، POSTROUTING برای شبکه مبدا در ترافیک خروجی از سیستم و OUTPUT هستش.
از جدول Mangle میتونیم برای عملیات بررسی بسته ها قبل از ورود به table های بالا استفاده کنیم و تغیراتی رو روی header پکت های IP اعمال کنیم، در واقع این چین های تیبل فیلتر و نت رو شامل میشه، این جدول سه هدف عمده را دنبال میکنه:
از طریق منگل میتونیم فیلد TOS ) Type of Service) هدر بسته رو تغییر بدیم، این تنظیم تو روتر ها، فایروال ها و… تاثیر زیادی نداره مگه اینکه تو پالیسی های مربوط به مسیریابی، پینگ، QOS و… استفاده بشه.
از طریق منگل میتونیم فیلد TTL ) Time To Live ) رو در هدر بسته تغیر بدیم، فیلد TTL برای این منظور هستش که اگه یه سری پکت همینجوری موندن بعد از یه تایمی به جایی نرسیدن از بین برن، اگه از TTL استفاده نمی شد یه سری while true اتفاق می افتاد که اگه بیشتر میشدن باعث downشدن شبکه ما میشد.
جدول منگل این قابلیت رو داره که از طریق اون بسته ها رو mark کنیم(نشونه گذاری کنیم)، از این مارک ها میتونیم در پینگ، مسیریابی و... استفاده کنیم.
هد از این مارک این هستش که قسمت های مختلف شبکه با این مثل یه پیام با هم دیگه تو تعامل باشن، این میتونه یه عددصحیح 32 بیتی باشه که به پکت توی شبکه وصل میشه و این علامت گذاری فقط تو جدول منگل معتبر هستش و بخش های مختلف استک شبکه میتونن این علامت(mark) رو بخونن و رفتارشون با پکت رو بر اساس مقدار mark تغییر بدن یا دوباره بنویسنش مثل tc و...
برای استفاده از این قابلیت باید از اپشن set-mark-- استفاده کنیم.
برای درک بهتر این موضوع میتونید به اینجا مراجعه کنید.
Table = Raw <--- Chains = [ PREROUTING, OUTPUT ]
از جدول RAW برای معاف کردن پکت ها از connection tracking استفاده میشه، یه بخش از استک شبکه لینوکس conntrack هستش که به طور کلی یه بخش از زیر سیستم فایروال هستش( کلیه سیستم عامل ها connection tracking رو داخل فایروال خودشون اجرا میکنن که شامل 6 ستون (protocol (TCP or UDP), source IP, source port, destination IP, destination port , connection state ) هستش و داخل لینوکس به این ساب سیستم conntrack میگیم و به صورت پیش فرض هم فعال هستش).
این جدول به نحوی عمل می کنه که قبل از ورود پکت ها به Connection Tracking و… ( طبق عکس tables ها که بالا تر مشاهد کردید) اون ها رو میتونه فیلتر کنه و این کار باعث میشه که فشار روی سیستم خیلی کمتر بشه(cpu, ram ,...).
برای استفاده ازش باید وقتی قانونی رو مینویسیم از تارگت NOTRACK استفاده کنیم.
Table = Security <--- Chains = [ OUTPUT, INPUT, FORWARD ]
این جدول برای قوانین شبکه، کنترل دسترسی اجباری(MAC) مثل مواردی که توسط تارگت های SECMARK و CONNSECMARK فعال میشن قابل استفاده هستش، MAC توسط ماژول های امنیتی لینوکس مثل SELinux اجرا میشه، خود جدول security بعد از جدول فیلتر هستش و به همین دلیل اجازه میده تا قوانین دسترسی(DAC) در جدول فیلتر قبل از قوانین MAC اعمال بشه، راجب SELinux , MAC , DAC میتونید تو گوگل سرچ کنید و...
هدف یا همون target مشخص میکنه که سرنوشت یه پکت با توجه به rule نوشته شده چی بشه( مثلا میگیم اگه یه پکت از فلان ip اومد چه بلایی سرش بیاد) پایین تر لیست بلاهایی که میتونید سر پکت بیارید رو نوشتم:
نکته : هر Chain به صورت دیفالت یک Target داره البته این دیفالت برای chain هایی هستش که به صورت دیفالت وجود دارن و اون هایی که کاربر ایجاد کرده رو شامل نمیشه . تارگت دیفالت هم accept یا drop هستش(ایجاد چین حذف اضافه و .. رو هم تو قسمت های بعدی میگیم).
در این حالت میگیم این پکت اگه این rule شده ما باهاش مطابقت داشت بیا قبولش کن این پکت اوکیه از نظر ما.
میتوینم بگیم این پکت حق خروج نداره از شبکه یا حق ورود به شبکه ما رو نداره، اگه پکتی به سمت ما بیاد و دراپ بشه؛ به فرستنده پکت هیچ ارور نمیاشی نمیده( مثلا میتونن پینگ یه ip رو DROP کنن و وقتی که پینگ بگیرید هیچی بهتون نده، ولی اگه مثلا بجای drop کردن Reject میکردن اون زمان به شما ارور میداد مثلا Port Unreachable برمیگردوند.)
نکته: این قابلیت از کرنل 3.1 به بالا پشتیبانی میشه .
به وصیله nfnetlink_queue پکت رو به فضای کاربر (userspace) منتقل میکنه، میتونه تو برنامه های فیلتر شکن و پروکسی ... استفاده بشه.
وقتی یه پکت با rules نوشته شده مطابقت داره کرنل اون پکت رو در لیست chain قرار میده و بعد یه پیام nfnetlink رو قالب دهی میکنه و اطلاعات(packet data , packet id and metadata) رو از طریق سوکت به نرم افزار متصل به queue ارسال میکنه و نرم افزار میتونه پکت رو بخونه یا تغیر بده و...
برای مثال وقتی شما یه vpn دارید رو سیستم تون و در حال اجرا هستش اگه دستور زیر رو بزنید
sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j QUEUE
میاد انتقالش میده به نرم افزار های سطح کاربر که الان فیلتر شکن شما میشه همین نرم افزار سطح کاربر و خب الان ما پکت های icmp که مربوط به پینگ هست رو داخل صف( queue) قرار دادیم الان اگه پینگ بگیرید پینگتون اوکی هست حالا بیاید یبار فیلتر شکن رو خاموش کنید و این دستور رو بزنید بعدش پینگ بگیرید ، متوجه میشید که نمیتونید پینگ بگیرید. وقتی که تو فضای کاربر نرم افزاری وجود نداشته باشه اون چیزی که براش ست کردید که اینجا icmp هستش دراپ میشه و برای همین پینگ ندارید.
اگه پکتی با این تارگت ست شده باشه وقتی بهش برسه فایروال چک کردن اون پکت رو متوقف میکنه وکلا اون چین رو متوقف میکنه، اگه این Chain که پکت الان توش هست و... ساب chain باشه، یعنی تو یه chain دیگه مثلا jump شده باشه بهش؛ الان این retrn میشه و به اون chainی که ازش جامپ کرده اینجا و از اون chain ادامه کار رو میره...ـ(اگه برنامه نویسی کرده باشید فکر کنید یه یه فانکشن داخل یه فانکشن دیگه داریم که اون داخلیه الان return میشه و ادامه کار از فانکشن اصلی پیش میره) ولی اگه ساب chain نباشه و خودش chain اصلی بوده باشه یکی از هدف های دیفالت که یا accept یا drop هست روش ست میشه براش.
فایروال پکت دریافتی را رد (reject) میکنه یعنی پیامی حاوی اطلاعات دقیق تر یا خطا رو ارسال میکنه، مثل همون مثال بالا که راجب پینگ بودش.
این Chain بسته های ورودی رو لاگ میکنه میتونید از این اپشن برای لاگینگ iptables استفاده کنید میتونید بگید بهش که در چه لولی لاگ بگیره از جمله :
میتونید اپشن log-prefix-- رو هم براش ست کنید که با توجه به یه پیشوند خاص لاگ کنه براتون برای وقتی که میخواید لاگ رو بخونید واضح تر میشه...
میتونید اپشن log-tcp-options-- رو هم ست کنید که یه سری از اپشن های هدر tcp رو تو لاگ مینویسه برای دیباگینگ میتونه مفید باشه.
یه اپشن log-ip-options-- رو هم داره که میتونید ست کنید مثل tcp بالا ولی این فقط رو هدر بسته ip کار میکنه... یه log-tcp-sequence هم داره که این چنتایی که توضیح دادم بهترن حالا این log-tcp-sequence میتونه به ضرر ادم هم باشه... همون بالایی ها رو استفاده کنید بنظرم اوکی باشه!!
فایروال iptables به صورت دیفالت لاگ خودش رو داخل syslog یا var/log/kern.log/ میریزه میتونید از اینجا برسی کنید . همچنین میتونید از syslog-ng استفاده کنید( اگه نداریدش باید نصبش کنید.) اپشن های بیشتری بهتون میده میتونید لاگ های iptables رو بفرستید تو یه فایل جدا برای این کار باید فایل زیر رو باز کنید
/etc/syslog-ng/syslog-ng.conf
بعد چند خط زیر رو بهش اضافه کنید .
destination iptables { file("/var/log/iptables.log"); }; filter f_iptables { match("IPT="); }; log { source(src); filter(f_iptables); destination(iptables); };
از این به بعد میتونید تو فایل var/log/iptables.log/ لاگ ها رو مشاهد کنید . البته باید تو قسمت log-prefix-- برای هر زمانی که میخواید لاگ کنید IPT رو قرار بدید برای اینکه لاگ بره تو این فایل.
قسمت دوم :