در این مقاله به شما خواهیم آموخت که چگونه یک فایروال ارزان قیمت را با iptables بسازید. هر وقت مردم از ما می پرسند که چگونه می توانند مطمئن باشند هیچکس نمی تواند از راه دور به PC آنها دسترسی غیر مجاز پیدا کند، اولین پاسخ ما این است که: ارتباط PC خود را با هر شبکه ای قطع کنید.
در واقع بسته های فراوانی (بطور مجاز و غیرمجاز) از هر PC متصل به شبکه عبور می کنند. در اغلب موارد، عبور این بسته ها بصورت کاملاً نامرئی انجام می شود و به همین دلیل کاربران حتی از وجود آنها مطلع نخواهند شد. سپس مردم از ما می پرسند آیا ابزارهایی وجود دارند که بطور خودکار از دسترسی های غیر مجاز جلوگیری نمایند. باز هم پاسخ ما این است که: خیر. پیش از آنکه بسته ها وارد PC ما شوند، نمی توانیم تشخیص دهیم که از نوع خوب هستند یا بد.
با اینحال ابزارهایی وجود دارند که می توانیم از آنها برای نظارت بر بسته های ورودی و خروجی استفاده کرده و سپس تصمیم بگیریم که آیا بایستی آنها را پیش از رسیدن به مقصد نهائی شان حذف نمائیم یا خیر. این همان جائی است که فایروال ها وارد میدان می شوند، اولین سیستم ضد نفوذ واقعی برای شبکه ها و PCهای ما.
خبر خوب این است که شما می توانید از یک فایروال ارزان قیمت استفاده کنید، اما خبر بد این است که هیچ فایروال Plug-and-Play در بازار وجود ندارد که بدون دخالت صحیح شما بتواند واقعاً از کامپیوترتان محافظت نماید. این بدان معنی است که شما پیش از انجام هر کاری با فایروال خود باید مبانی اداره بسته های شبکه را درک کنید.
شما در این مقاله ابتدا مطالبی را درباره ی مبانی شبکه سازی اترنت خواهید آموخت که گسترده ترین فناوری انتقال امروزی به حساب می آید. سپس، ما به شما نشان خواهیم داد که چگونه فایروال شخصی خودتان را با iptables ایجاد نمائید و نهایتاً چگونه آن را با Nmap آزمایش کنید.
پشته TCP/IP
مکانیزم منطقی که پایه های ارتباطات مابین PCهای متصل شده از طریق LANها و اینترنت را تشکیل می دهد، تحت عنوان پشته Transmission Control Protocol/Interner Protocol(TCP/IP) شناخته می شود. ما می توانیم این پشته ار بصورت 5 لایه منطقی خلاصه سازی نمائیم که در آن ترافیک خروجی از بالا به پائین حرکت می کند و ترافیک ورودی از پائین به بالا. هر لایه، مجموعه ای از ابزارهای (سخت افزاری و نرم افزاری) تخصصی در زمینه ی انجام یک وظیفه ی خاص بر روی بسته های در حال عبور است. عملکرد هریک از لایه ها بطور اخص عبارت است از:
- لایه 1: لایه ی Physical که بیت های واحد را از طریق خطوط فیزیکی (کابل ها و اینترفیس های شبکه) انتقال می دهد.
- لایه 2: لایه ی Data Link نامیده می شود و در زمینه ی انتقال بسته ها از طریق شبکه های Multi-hop (روترها) تخصص دارد.
- لایه 3: لایه ی Network است و مبتنی بر Internet Protocol(IP) می باشد. این لایه مسئولیت تحویل بسته های داده از یک کامپیوتر مبدأ به یک سیستم مقصد بر روی شبکه را بر عهده دارد.
- لایه 4: لایه ی Transport نامیده می شود و مسئولیت نگهداری یک جریان داده پیوسته مابین دو سیستم را برعهده دارد. این لایه احتمالاً سیستم هایی را برای انتقال مجدد بسته های مفقود شده و تصحیح خطا در بر می گیرد. لایه ی 4 مبتنی بر دو پروتکل است:
مفهوم فایروال ها برای مبتدیان
Transmission Control Protocol(TCP) و User Datagram Protocol(UDP).
- لایه 5: لایه ی Application نامیده می شود و حاوی برنامه هایی است که از طریق یک شبکه مبتنی بر پروتکل های TCP/IP با یکدیگر ارتباط برقرار می کنند (مرورگرهای وب، سرورها و کلاینت های FTP، eMailها و نظایر آنها).
شکل [1]، جریان داده ی منطقی مابین دو PC متصل شده از طریق یک شبکه را نشان می دهد، البته بطور ایده آل با این فرض که تنها یک جهش (hop) مابین آنها وجود دارد. در این مورد، Alice داده هایی را برای Bob ارسال می کند.
فایروال ها در لایه های Network و Transport پشته TCP/IP قرار می گیرند و با مسدود نمودن بسته های غیرمجاز سر و کار دارند. همانطور که می توانید ببینید، بسته ها قبلاً در سطح پشته وارد PC شده اند، اما هنوز به مقصد خود در لایه ی Application نرسیده اند. بنابراین، اگر بخواهید تصمیم بگیرید که کدام بسته ها می توانند (یا نمی توانند) عبور کنند، بایستی نظارت بر ترافیک را در لایه ای پائین تر از لایه ی Application انجام داده و ترافیک را همانطور که توسط فایروال دیده می شود، در نظر بگیرید.
آناتومی یک بسته ی داده
همانطور که اشاره کردیم، پشته TCP/IP مجموعه ای از پروتکل ها است که مسئولیت انتقال داده ها از طریق لایه های Network و Transport را بر عهده دارند. ما در این مقاله، 4 مورد از مهمترین پروتکل های پشته TCP/IP را پوشش خواهیم داد: TCP و UDP برای لایه ی IP و Transport و Internet Control Message Protocol(ICMP) برای لایه ی شبکه. یک نرم افزار کاربردی که نیاز دارد داده هایی را به نرم افزار کاربردی ماشین دیگری بفرستد، جریانی از بسته های داده را ایجاد نوده و آنها را به پشته TCP/IP می سپارد که در آنجا پروتکل های مورد نیاز پیش از ارسال بسته ها به لایه های پائین تر بر روی آنها اعمال شوند. ماشین هدف به محض آنکه داده ها از پشته TCP/IP عبور می کنند، پروتکل مورد استفاده را پیش از تحویل داده ها به نرم افزار کاربردی نهائی تشخیص می دهد. یک پروتکل، صرفاً مجموعه ای از قواعد است که بایستی بر روی هر دو سیستم اعمال شود تا امکان برقراری ارتباط بر روی یک شبکه فراهم گردد.
امروزه TCP پر مصرف ترین پروتکل است، علیرغم آنکه یکی از ناامن ترین پروتکل ها نیز به حساب می آید. در واقع این پروتکل فاقد ویژگی های زیر است:
- محرمانگی: یک بسته داده برای دیگران قابل مشاهده خواهد بود.
- یکپارچگی: یک بسته داده می تواند توسط دیگران دستکاری شود.
- سندیت: یک بسته داده می تواند توسط طرف های ثالث ارسال گردد، حتی اگر ظاهراً به نظر برسد که از مبدأ قابل اعتمادی ارسال شده است.
همانطور که در شکل [2] نشان داده شده است، یک نشست ارتباطی TCP می تواند با یک مکانیزم Handshake سه مسیره برقرار گردد:
مفهوم فایروال ها برای مبتدیان
- Alice یک درخواست هماهنگ سازی (synchronization) را برای Bob ارسال می کند
- Bob با یک تصدیق (acknowledgment) درخواست Alice را می پذیرد و در عین حال درخواست هماهنگ سازی خودش را ارسال می نماید.
- Alice با یک تصدیق به درخواست Bob پاسخ می دهد و نهایتاً ارتباط برقرار می شود.
مفهوم فایروال ها برای مبتدیان
بخاطر برقرار شدن یک نشست، پروتکل TCP می تواند بسته های مفقود شده را مجدداً ارسال کرده و در نتیجه ارتباط را تضمین نماید.
اطلاعات TCP در قسمت جلویی بسته های داده Alice و Bob اعمال می گردند و به همین دلیل تحت عنوان TCP Header شناخته می شوند. یک هدر می تواند بصورت یک توالی از فیلدهایی نشان داده شده که حاوی اطلاعات مختلفی هستند. بنابراین، یک بسته ی TCP همانند یک توالی از بیت های اطلاعاتی که یک توالی از بیت های داده در ادامه ی آنها قرار گرفته اند، به نظر خواهد رسید.
مهمترین بیت های اطلاعاتی که در اینجا مورد نظر ما هستند، عبارتند از:
- درگاه مبدأ TCP: یک فیلد 16 بیتی که نشان می دهد بسته ها از کدام درگاه های منطقی آمده اند (2 به توان 16 یا 65536 درگاه)
- درگاه مقصد TCP: یک فیلد 16 بیتی که نشان می دهد بسته ها به کدام درگاه های منطقی می روند (2 به توان 16 یا 65536 درگاه)
- بیت های کنترلی: یک فیلد 8 بیتی که نشان می دهد بسته TCP به کدام بخش از نشست تعلق دارد.
هر درگاه، یک کانال ارتباطی منطقی مابین دو سیستم است، بصورتی که شما می توانید چند نشست TCP موازی را مابین نرم افزارهای کاربردی متفاوت بر روی یک ماشین واحد برقرار نمائید. برای مثال، یک ماشین سرور می تواند بطور همزمان یک سرور وب را بر روی درگاه استاندارد 80 و یک سرور FTP را بر روی درگاه استاندارد 21 اجرا کند. از سوی دیگر، یک ماشین کلاینت می تواند از کلاینت ها بطور همزمان برای ارتباطات وب و FTP استفاده نماید که درگاه های مورد استفاده آنها بطور دینامیک تخصیص می یابند (بطور کلی بیش از 1023 درگاه)
بیت های کنترلی، Flagهای باینری هستند که بر حسب فعال یا غیرفعال بودن وضعیت خود می توانند 1 یا 0 باشند. این بیت ها عبارتند از:
- URG: نشان می دهد که بسته باید سریعاً تحویل داده شود
- ACK: نشان می دهد که تصدیق یک بسته ی قبلی در طول یک انتقال دریافت شده است.
-PSH: به پشته می گوید که بجای انتظار برای بسته های بیشتر، داده ها را بلافاصله انتقال دهد.
- RST: نشان می دهد که ارتباط بخاطر یک خطا یا وقفه باید ریست شود.
-SYN: یک درخواست هماهنگ سازی برای آغاز یک نشست TCP جدید را مشخص می کند.
- FIN: نشان می دهد که هیچ بسته ی دیگری برای انتقال وجود ندارد و به همین دلیل ارتباط می تواند بسته شود.
- CWR: نشان می دهد که صف بسته های خروجی بخاطر یک تراکم ترافیک، کند شده است.
- ECE: نشان می دهد که ارتباط بخاطر تراکم ترافیک دچار مشکل گردیده است.
مفهوم فایروال ها برای مبتدیان
شکل [3] یک مثال از تبادل بسته های داده در طول یک نشست Handshake سه مسیره را نشان می دهد.
UDP یکی دیگر از پروتکل های مهم دیگر لایه ی Transport به حساب می آید که برخلاف TCP«فاقد اتصال» (Connectionless) است، به این معنی که نمی تواند یک وضعیت اتصال را حفظ نماید و در نتیجه قادر به تضمین یک اتصال نمی باشد. با اینحال، این پروتکل در مقایسه با TCP بسیار سریعتر است و به همین دلیل در مواردی که عملکرد از اهمیت بالاتری نسبت به اعتمادپذیری برخوردار است، پروتکل UDP بطور گسترده ای مورد استفاده قرار می گیرد. بعنوان یک مثال از اینگونه موارد، می توان به سرورهای DNS اشاره کرد که بطور معمول یک بسته UDP بر روی درگاه 53 را بعنوان درخواستی برای جستجوی دامنه دریافت کرده و سپس با یک بسته UDP که حاوی آدرس IP نسبی می باشد به آن پاسخ می دهند.
تعداد فیلدها در یک هدر UDP کمتر از تعداد آنها در هدر TCP است و ما برای مقاصد این مقاله می توانیم تنها فیلدهای درگاه مبدأ و مقصد را در نظر بگیریم که دو فیلد 16 بیتی بوده و می توانند حداکثر تا 65536 درگاه منطقی را آدرس دهی نمایند.
بسته ی TCP یا UDP (داده ها بعلاوه اطلاعات) غالباً به لایه ی Network فرستاده می شود تا پردازش های آدرس دهی بر روی آن انجام گیرد. متداول ترین پروتکل شبکه ای که امروزه مورد استفاده قرار می گیرد، پروتکل IPv4 است که مبتنی بر آدرس دهی 32 بیتی می باشد و به بیش از 4 میلیارد آدرس امکان می دهد که بر روی یک شبکه واحد به همزیستی بپردازند. در آینده ی نزدیک، IPv4 با IPv6 جایگزین خواهد شد، یک فیلد آدرس 128 بیتی که گذشته از ویژگی های جدید خود، تعداد فوق العاده بالائی از آدرس ها را پوشش خواهد داد.
پس از دریافت بسته از لایه ی Transport، لایه ی IP به نوبه ی خود یک هدر جدید را ایجاد می نماید که به قسمت جلویی بسته ی TCP/UDP افزوده خواهد شد.
بنابراین، بسته ی IP نهائی شامل این مؤلفه ها خواهد بود: یک توالی از بیت ها برای هدر IP بعلاوه یک توالی از بیتها برای هدر TCP/IP بعلاوه یک توالی از بیت ها که حاوی داده ها هستند.
در میان فیلدهای متعدد هدر IP، موارد زیر از اهمیت خاصی برخوردارند:
- آدرس IP مبدأ که حاوی آدرس IP ماشین مبدأ می باشد.
- آدرس IP مقصد که حاوی آدرس IP ماشین هدف می باشد.
- پروتکل که پروتکل مورد استفاده ی لایه ی Transport(TCP) یا UDP را مشخص می کند.
یک آدرس IP با 4 عدد 8 بیتی بیان می گردد که با نقطه هایی از یکدیگر جدا شده اند و هریک از آنها در قالب یک عدد دسیمال نشان داده می شوند که می تواند ارزشی مابین 0 ( هر 8 بیت معادل صفر) تا 255 (هر 8 بیت معادل 1) داشته باشد. بنابراین، از نظر تئوری تمام آدرس های مابین 0.0.0.0 تا 255.255.255.255 می توانند آدرس های IP معتبر باشند، اما بعضی از کلاس ها (yz.192..168 و xyz، 176.16.yz.10) برای شبکه های خصوصی در نظر گرفته شده اند و نمی توانند به آدرس های عمومی اختصاص یابند. هر آدرس IP حاوی یک بخش نشان دهنده آدرس شبکه و یک بخش نشان دهنده ی آدرس میزبان می باشد. Subnet Mask یک عدد باینری (و همچنین 32 بیتی) است که به ما امکان می دهد بدانیم کدام بخش از یک آدرس IP به یک آدرس شبکه (با تعیین تمام بیت ها بصورت 1) و کدام بخش به یک آدرس میزبان (با تعیین تمام بیت ها بصورت 0) اشاره دارند. بنابراین، یک آدرس IP نظیر 192.168.0.105 با یک Subnet Mask بصورت 255.255.255.0 به آدرس شبکه ی 192.168.0 و آدرس میزبان 105 (یک PC منفرد) اشاره می کند. غالباً برای هدفگیری یک شبکه ی کامل، از نشانه گذاری Classless Inter-Domain Routing(CIDR) در قالب زیر استفاده می شود:
>تعداد بیت های مساوی 1 در Subnet Maskhttp://www.winpcap.org بارگذاری کنید.
TCPdump به شما امکان می دهد تا کل جریان بسته های داده ای که از/به کامپیوترتان منتقل می شوند را با سطح بالایی از جزئیات (هدرها و داده های متن آشکار) تجزیه و تحلیل کنید. این یک ابزار فوق العاده برای تنظیم دقیق قواعد فایروال به حساب می آید. به این ترتیب، مثلاً اگر بخواهید تمام بسته های TCP ضبط شده توسط اینترفیس شبکه ی خود eth0 را مشاهده کنید، کافی است فرمان زیر را در یک پوسته ی لینوکس (بعنوان root) تایپ نمائید:
tcpdump -n-i eth0#
گزینه -n آدرس ها و شماره درگاه ها را در یک قالب عددی نمایش می دهد، در حالیکه گزینه i- به شما امکان می دهد تا اینترفیس شبکه ای که مایل به نظارت بر آن هستید را مشخص کنید.
نتیجه می تواند واقعاً غافلگیر کننده باشد. شما متوجه خواهید شد که یک جریان کم و بیش پیوسته از بسته ها در حال عبور از کامپیوترتان هستند، حتی اگر تنها چند برنامه در حال اجرا بر روی آن باشند.
مفهوم فایروال ها برای مبتدیان
در شکل [5]، یک اتصال Handshake سه مسیره آنالیز شده مابین ماشین محلی ما و سرور Google را نشان می دهد.
در نظر داشته باشید که هر چیزی از اینترفیس های شما عبور می کند، قابل استراق سمع است و برای نمایش فقدان مطلق محرمانگی در یک بسته ی TCP، تلاش کنید یک نشست MSN را باز کرده و سپس تمام بسته های خود را با فرمان زیر استراق سمع نمائید:
tcpdump-Xx-s 500 -n-i eth0 #
این فرمان به شما اجازه می دهد اولین 500 کاراکتر یک بسته ی TCP حاوی متن آشکار را مشاهده کنید. هر فردی بر روی شبکه شما احتمالاً می تواند پیام های محرمانه تان را تنها با استفاده از اینترفیس های شبکه خود در حالت نظارت، مشاهده نماید.
دست بکار شوید
حالا که می دانید چگونه بر ترافیک داده عبور کننده از اینترفیس های شبکه ی خود نظارت داشته باشید، زمان آن رسیده است که کمی با پیکربندی فایروال خود درگیر شوید.
یک فایروال اساساً به دلایل زیر برای مسدود نمودن بسته های ناخواسته مورد استفاده قرار می گیرد:
- مخفی کردن یک PC یا یک شبکه در برابر اسکن درگاه و نگاشت شبکه
- مسدود کردن تلاش های غیر مجاز برای دسترسی
- مسدود کردن وضعیت نامطلوب ترافیک که می تواند باعث ناپایداری گردد برای این آزمایش، شما باید یک آزمایشگاه کوچک را با تنها دو PC که با استفاده از یک LAN به هم متصل شده اند، راه اندازی کنید. در صورتی که ترجیح می دهید، همچنین می توانید از یک ماشین مجازی برای این منظور استفاده نمائید. یکی از ماشین ها باید یک PC لینوکس باشد که با یک فایروال Open Source عالی توکار همراه است: iptables. این یک فایروال Plug- and- Play (نظیر بسیاری از روترهای ISP) نیست و به شما امکان می دهد تا کنترل کاملی بر تمام ترافیکی که به کامپیوتر شما وارد و یا از آن خارج می شود، داشته باشید. ماشین دیگر تنها برای ارسال بسته ها به فایروال مورد استفاده قرار خواهد گرفت.
یک پنجره ی ترمینال را بر روی ماشین لینوکس باز کرده و سپس فرمان زیر را برای بررسی خط مشی های پیش فرض فایروال اجرا نمائید:
# iptables - list
شما باید پاسخ هایی شبیه به موارد زیر را دریافت کنید:
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT(policy ACCEPT)
این بدان معنی است که فایروال شما بطور پیش فرض تمام بسته ها را می پذیرد. فعلاً فقط به یاد داشته باشید که این سه زنجیره چه هستند:
- INPUT: تمام بسته های ورودی به PC شما.
- FORWARD: تمام بسته هایی که از PC شما عبور می کنند، اما برای میزبان دیگری بر روی شبکه ارسال شده اند.
- OUTPUT: تمام بسته هایی که از PC شما خارج می شوند.
ما در این مقاله نمی توانیم بررسی عمیقی از iptables را ارائه کنیم، ولی تلاش خواهیم نمود تا توضیح دهیم که چگونه می توانید قواعدی با کاربردهای موردی را برای نیازهای فایروالی خودتان ایجاد کنید. اولین کاری که باید انجام دهید، مسدود نمودن تمام بسته های ورودی است. شما می توانید این کار را تنها با تغییر خط مشی پیش فرض برای زنجیره ی INPUT به DROP با استفاده از گزینه -p در فرمان زیر انجام دهید:
# iptables -P INPUT DROP
در واقع اگر شما یک فهرست جدید را در iptables ایجاد کنید، خواهید دید که خط مشی پیش فرض در زنجیره ی INPUT از ACCEPT به DROP تغییر نموده است. بنابراین اگر تلاش کنید که ماشین لینوکس خود را از ماشین دیگر Ping نمائید، به نظر می رسد که این سیستم خاموش است. اما در اینجا یک مشکل وجود دارد. اگر تلاش کنید که ماشین دوم را از ماشین لینوکس ping نمائید، باز هم با همین نتیجه مواجه خواهید شد. این وضعیت تا حدودی عجیب به نظر می رسد زیرا شما خط مشی پیش فرض زنجیره ی OUTPUT (که هنوز ACCEPT است) را تغییر نداده اید. پس چه مشکلی وجود دارد؟ خوب، هنگامیکه شما یک Ping را ارسال می کنید عملاً در حال ارسال یک بسته ی ICMP echo-Request به ماشین هدف هستید و انتظار دارید که یک بسته ی ICMP echo-reply را از آن دریافت نمائید. بنابراین اگر تمام درگاه های ورودی را بسته باشید نمی توانید پاسخ ها را دریافت کنید و به همین دلیل است که به نظر می رسد PC شما خاموش می باشد.
درنتیجه، اگر بخواهید Pingهای ورودی را مسدود نموده اما Pingهای خروجی را آزاد بگذارید، باید یک قاعده ی فایروال را بنویسید که تمام بسته های ICMP ورودی از نوع echo- request را مسدود کند اما تمام بسته های ICMP ورودی از نوع echo-reply را بپذیرد. شما می توانید این کار را تنها با فرمان زیر انجام دهید:
# iptables -A INPUT -p icmp --icmptype echo-reply -j ACCEPT
A INPUT- یک قاعده ی اضافی جدید را برای زنجیره ی INPUT مشخص می کند. گزینه p icmp- نشان می دهد که این قاعده به یک بسته ی ICMP اشاره دارد. گزینه icmp type- نشان می دهد که این قاعده تنها بر روی بسته هایی که ICMP_TYPE در آنها بصورت ICMP echo-reply (یا 0) تنظیم شده است، اعمال می گردد. در نهایت، گزینه ی j ACCEPT- مشخص می کند که هدف این قاعده، پذیرش این نوع بسته ها است.
خوب، ماشین لینوکس شما اکنون بخوبی PC دیگر را در شبکه تان Ping می کند، اما تلاش شما برای Ping نمودن Google با شکست مواجه خواهد شد، چرا؟ با مسدود کردن تمام بسته های ورودی به استثناء echo-reply، شما قادر به دریافت پاسخ از سرور DNS نخواهید بود. هنگامیکه شما Google را Ping می کنید، ابتدا ماشین شما از سرور DNS می خواهد تا دامنه Google را بصورت یک آدرس IP ترجمه نماید. بعبارت دیگر، PC شما یک بسته ی UDP را به سرور DNS فرستاده و از آن می پرسد که: آدرس IP متناظر با www.google.com چیست؟ سرور DNS نیز با بسته دیگری پاسخ داده و می گوید: www.google.com دارای آدرس IP معادل 74.125.43.147 است. اگر با دریافت بسته های UDP از یک سرور DNS موافقت نکرده باشید، هرگز نخواهید توانست Google را Ping نمائید. برای اینکار باید قاعده جدید زیر را اضافه کنید:
# iptables -A INPUT -p udp --sport domain -j ACCEPT
اساساً شما با این فرمان به فایروال می گوئید تمام بسته های UDP که از دامنه درگاه مرجع (یا 53) می آیند بایستی پذیرفته شوند. تنظیم مذکور به این دلیل است که سرورهای DNS معمولاً درخواست ها را از درگاه UDP استاندارد 53 ارسال و دریافت می کنند. از سوی دیگر، شما در این PC خود را در معرض اولین رخنه ی امنیتی قرار می دهید، زیرا تمام بسته های UDP ورودی به درگاه 53 از یک سرور DNS ارسال نشده اند. ممکن است شخصی از درگاه 53 برای ارسال بسته های بد به سیستم شما استفاده کند، بنابراین اگر می خواهید قاعده امن تری بنویسید، می توانید تنها بسته هایی را بپذیرید که از آدرس IP سرور DNS خودتان می آیند. برای مثال، با این فرض که آدرس IP سرور DNS شما 194.20.8.1 است، از فرمان زیر استفاده کنید:
# iptables -A INPUT -p udp -s 194.20.8.1 -- sport domain -j ACCEPT
بنابراین باید قاعده ی اول را حذف کرده و آن را با قاعده ی جدید تعویض نمائید. شما می توانید قواعد را با استفاده از شماره آنها حذف کنید.برای فهرست نمودن شماره های قواعد، از فرمان زیر استفاده کنید:
# iptables -- list - line- numbers
حالا قاعده ای که می خواهید حذف شود را با استفاده از ترکیب فرمان زیر حذف نمائید:
# iptables -D INPUT 2
خوب، حالا شما مشکل Ping را برطرف کرده اید، اما اگر تلاش کنید یک مرورگر وب را باز نموده و به www.google.com بروید، خواهید دید که ترجمه ی دامنه کار می کند، اما صفحه ی نمایش داده نمی شود. در اینجا چه مشکلی وجود دارد؟ موضوع این است که برای نمایش یک صفحه ی وب، شما باید یک اتصال TCP را با یک درگاه سرور وب (معمولاً درگاه 80) برقرار نمائید و تا وقتی که بسته های TCP ورودی را مجاز نشناخته اید، این کار امکانپذیر نخواهد بود. در واقع اگر شما اتصال وب خود را با استفاده از TCPdump آنالیز کنید، خواهید دید که ابتدا ماشین شما از سرور DNS می خواهد www.google.com را بر روی درگاه 53 به یک آدرس IP ترجمه نماید و این مرحله به لطف قاعده ی جدید که برای فایروال خود نوشته اید عملی خواهد بود، اما سپس ماشین شما تلاش می کند تا یک Handshake سه مسیره را با سرورهای Google بر روی درگاه 80 آغاز نماید که امکانپذیر نخواهد بود زیرا بسته ی Google ACK توسط iptables مسدود خواهد شد. بنابراین ماشین شما تلاش می کند تا یک درخواست مداوم را تا زمان دریافت یک پاسخ ارسال نمائید که البته همچنان بدون پاسخ خواهد ماند تا زمانیکه فرصت اتصال به پایان برسد.
بنابراین، فایروال شما به یک قاعده ی جدید نیاز دارد که به شما اجازه گردش بر روی وب را بدهد. با این فرض که شما نیاز دارید تنها بر روی درگاه 80 به سرور متصل شوید (در یک سناریوی واقعی، شما باید درگاه های دیگری را نیز باز کنید)، قاعده ی جدید می تواند بصورت زیر باشد:
# iptables -A INPUT -p tcp --sport 80 -j ACCEPT
بله، کار می کند. در واقع شما اکنون می توانید به Google متصل شوید. اما همانطور که احتمالاً حدس زده اید، حالا PC خود را در معرض یک رخنه ی امنیتی جدید قرار داده اید زیرا فایروال هر بسته ای که از درگاه 80 وارد می شود را می پذیرد و شما نمی توانید این قاعده را (به همان صورتی که برای سرور DNS انجام دادید) صرفاً به آدرس های IP قابل اعتماد محدود نمائید، پس چه راه حلی وجود دارد؟ همانطور که می دانید، تمام اتصالات TCP همیشه با یک درخواست SYN از ماشین شما شروع می شوند، بنابراین می توانید به فایروال خود فرمان دهید که صرفاً بسته های مرتبط با یک اتصال TCP از قبل برقرار شده را بپذیرد. انجام اینکار با iptables امکانپذیر است زیرا یک فایروال Stateful به حساب می آید که برخلاف بسیاری از روترهای Stateless می تواند وضعیت اتصال TCP را به یاد بسپارد.
بنابراین، قاعده ی فوق الذکر را با این قاعده ی جدید جایگزین نمائید:
# iptables -A INPUT -p tcp --sport 80 -m state --state RELATED, ESTABLISHED -j ACCEPT
گزینه -m state - state RELATED, ESTABLISHED -j ACCEPT به فایروال می گوید تنها بسته هایی که به یک نشست TCP از قبل برقرار شده تعلق دارند را بپذیرد و این همان چیزی است که شما نیاز دارید.
این یک قاعده ی واقعاً مهم است زیرا به شما امکان می دهد تا بسیاری از تکنیک های اسکن درگاه را مسدود کنید که تلاش می کنند با ارسال بسته های ACK بدون انجام یک اتصال Handshake سه مسیره، یک فایروال را دور بزنند.
شما با این قواعد می توانید Pingهای منظم و گردش در وب را با سطح امنیتی خوبی انجام دهید. از اینجا به بعد شما باید قواعد جدید را براساس نیازهای خودتان اضافه کنید. شما می توانید بسته های خروجی را با هدف مسدود نمودن هرگونه فعالیت بدی که از داخل آغاز شده است، محدود کنید. برای مثال اگر بخواهید تمام بسته های خروجی اتصالات Telnet (یک پروتکل واقعاً ناامن) را مسدود کنید، می توانید قاعده ای مثل این را بنویسید:
مفهوم فایروال ها برای مبتدیان
مفهوم فایروال ها برای مبتدیان
# iptables -A OUTPUT -p tcp --dport telnet -j DROP
همچنین ممکن است نیاز داشته باشید به ترافیک یک شبکه ی محلی (eht0) اجازه دهید که به شبکه دیگری (eth1) برود، بنابراین می توانید قاعده زیر را اضافه کنید:
# iptables -A FORWARD -s 192.168.0.0/24 -d 192.168.1.0/24 -i eth0 -o eth1 -j ACCEPT
شما می توانید قواعد ACCEPT بیشتری را برای بسته های ورودی مرتبط با سرویس هایی که فکر می کنید ممکن است از آنها استفاده نمائید (نظیر سرویس های e-Mail و FTP) اضافه کنید. برای اضافه نمودن قاعده ثبت وقایع (Logging) بر روی زنجیره ی INPUT، فرمان زیر را وارد کنید:
# iptables -A INPUT -j LOG -logprefix-»myLogInput»
به این ترتیب، ما به iptables می گوئیم هر بسته ای که با هریک از قواعد قبلی مطابقت ندارد باید پیش از حذف شدن در syslog(var/log/syslog) گزارش شود. عملکرد مذکور با توجه به این واقعیت امکانپذیر است که قواعد iptables از بالا (#1) به پائین اعمال می شوند. هنگامیکه یک قاعده اعمال می شود، اجرا متوقف می شود مگر برای یک قاعده ی گزارش. بنابراین شما همیشه می توانید یک قاعده ی ثبت وقایع را بعنوان آخرین قاعده پیش از حذف تمام بسته های باقیمانده بعنوان یک اقدام پیش فرض برای هر زنجیره درج نمائید.
هنگامیکه ثبت وقایع، یک پیشوند را نیز اضافه کنید تا به آسانی بتوانید پیام های log را در جداول syslog فیلترگذاری کنید. برای مثال اگر می خواهید تمام بسته های مسدود شده از زنجیره ی INPUT را نمایش دهید، فرمان زیر را تایپ کنید:
# cat /var/log/syslog | grep:«myLogInput»
در نهایت شما می توانید پیکربندی فایروال را با فرمان زیر ذخیره سازی کنید:
# iptables-save > /etc/sysconfig/iptables
سپس می توانید پیکربندی فایروال خود را با فرمان زیر قابل بوت نمائید:
# chkonfig iptables on
ساختن یک فایروال SOHO بعنوان یک تمرین
بعنوان یک تمرین، شما می توانید یک فایروال لینوکس را برای یک دفتر کوچک طراحی کنید که زیر ساختار عملی آن در شکل [6] نمایش داده شده است.
همانطور که مشاهده می کنید، دو PC دریک LAN از طریق یک روتر- سوئیچ تأمین شده توسط یک ISP به اینترنت متصل شده اند. بر روی PC1 یک سرور SSH و یک سرور VNC نصب شده است تا امکان دسترسی از راه دور به PC را در اختیار کاربر بگذارد. روتر به یک فایروال توکار Stateless مجهز است و به همین دلیل شبکه داخلی بیش از حد در معرض تلاش های خارجی برای دسترسی غیرمجاز قرار می گیرد.
وظیفه ی شما این است که یک فایروال لینوکس را با iptables پیکربندی نمائید تا از LAN داخلی در برابر دسترسی های خارجی محافظت کنید، البته تنها به استثناء PC مجاز راه دور (همانطور که در شکل [7] نشان داده شده است).
مفهوم فایروال ها برای مبتدیان
فایروال باید بین روتر و یک سوئیچ در داخل LAN متصل شده باشد.این فایروال دارای دو اینترفیس است: eth0 که به روتر متصل شده و eth1 که به سوئیچ متصل گردیده است. تمام ترافیک VNC از PC راه دور باید از طریق یک تونل ایجاد شده توسط سرور SSH نصب گردیده بر روی فایروال به PC1 فرستاده شود. برای ساده کردن کار، فرض کنید که تمام ترافیک خروجی باید مجاز شناخته شود.
فرض کنید که درگاه ها و آدرس های IP مورد استفاده ما عبارتند از:
- آدرس IP روتر: 192.168.1.1
- آدرس IP اینترفیس eth0:192.168.1.2
- آدرس IP اینترفیس eht1:192.168.0.100
- آدرس PC1:192.168.0.1 IP
- آدرس PC2:192.168.0.2 IP
- درگاه سرور SSH فایروال: 222
- درگاه سرور VNC بر روی PC1:5901
تلاش کنید نحوه پیکربندی فایروال را خودتان مشخص نمائید، اما اگر به کمک نیاز دارید، لیست [1] تذکراتی را برای اسکریپت پیکربندی شما ارائه می کند:
فهرست [1]: اسکریپت iptables برای یک فایروال SOHO ابتدایی.
مفهوم فایروال ها برای مبتدیان
آزمایش نهائی
حالا زمان آن رسیده است که چند آزمایش نفوذ را برای ارزیابی قواعد فایروال خود انجام دهید. با این فرض که شبکه ی داخلی شما به اندازه ی کافی امن است، تلاش کنید تا فایروال را از خارج دور بزنید. این کار را با یک PC راه دور انجام دهید که تلاش های مورد نظر را با استفاده از یک اسکنر درگاه برای نگاشت شبکه انجام می دهد. nMAP یکی از بهترین ابزارها برای نگاشت شبکه به شمار می آید. شما می توانید ابزار مذکور را از www.nmap.org بارگذاری نمائید.
دور زدن فایروال الزاماً به معنای امکان ورود و دسترسی به شبکه نیست. تنها سرقت اطلاعات سیستم نیز برای مثبت بودن آزمایش کافی خواهد بود و این بدان معنی است که فایروال شما به آسانی دور زده می شود.
اگر اسکن درگاه تشخیص دهد که سیستم شما روشن است و یک یا چند درگاه باز بر روی آن وجود دارند، به معنای آن خواهد بود که شما باید بعضی از قواعد فایروال خود را برای پنهان سازی بهتر این اطلاعات اصلاح کنید.
برای کشف این که آیا ماشین روشن است یا خیر، می توانید یکی از سه تکنیک زیر را بکار بگیرید:
1- Ping کردن (اما ممکن است فایروال هنوز بسته های ICMP را فیلتر گذاری نماید، بنابراین پاسخی دریافت نخواهید کرد)
2- ارسال یک بسته ی TCP به درگاهی که قرار است باز باشد. اگر این کار یک SYN-ACK را برگرداند، مشخص می شود که ماشین روشن است.
3- ارسال یک بسته ی UDP به درگاهی که قرار است بسته باشد. اگر این کار یک ICMP Port Unreachable را برگرداند، مشخص می شود ماشین روشن است.
اجازه بدهید ببینیم که Nmap چگونه می تواند با تکنیک های بالا به ما کمک کند. برای ارسال یک Ping می توانید از فرمان زیر استفاده نمائید:
;$ nmap -sP
اگر فایروال Pingها را بطور صحیح مسدود کند، Nmap به شما خواهد گفت که میزبان مورد نظر ظاهراً خاموش است. بنابراین شما می توانید یک TCP SYN را به درگاهی بفرستید که از باز بودن آن اطلاع دارید، مثلاً:
$ nmap -PS222,5901
اگر این فرمان یک SYN-ACK را برگرداند، Nmap فکر می کند که میزبان روشن است. با محدود کردن بسته های ورودی تنها به یک دامنه مشخص از آدرس های IP، شما باید پیامی را دریافت کنید که نشان می دهد میزبان ظاهراً خاموش است.
همچنین، استفاده از یک بسته ی ACK را نیز آزمایش کنید و درگاه 80 را در نظر بگیرید که معمولاً قرار است باز باشد:
$ nmap -PA80
اما اگر فایروال تمام بسته های TCP ورودی که به یک اتصال برقرار شده ارتباط ندارند را مسدود نماید، شما همیشه باید یک پیام Host seems down را دریافت کنید.
حالا یک اسکن درگاه UDP را برای درگاهی که از بسته بودن آن اطلاع دارید، انجام دهید. برای مثال:
# nmap -sU -p12345
در این مورد، اگر فایروال بسته های ICMP خروجی با مقصد غیرقابل دسترسی را مسدود کند، Nmap نباید قادر به مشخص نمودن این موضوع باشد که ماشین شما روشن است یا خاموش.
حالا شما می توانید Nmap را وادار نمائید تا فرض کند که میزبان روشن است (با استفاده از گزینه PN-). بنابراین، شما می توانید هر نوع اسکن درگاه را بر روی درگاه های باز شناخته شده انجام داده و با فیلدهای TCP flag بازی کنید.
به این ترتیب، مثلاً برای برقراری یک Handshake سه مسیره از یک اتصال TCP استفاده کنید:
$ nmap -sT -PN -p 222,5901
اگر این روش کار نکرد، ارسال بسته های نامنظم را آزمایش نمائید. برای مثال، شما می توانید آزمایش خود را با یک TCP SYN انجام دهید که یک بسته ی SYN را با انتظار یک پاسخ SYN+ACK ارسال می کند، سپس بلافاصله یک RESET را برای بستن اتصال ارسال نمائید:
# nmap -sS -PN -p 222,5901
شما همچنین می توانید این موضوع را با یک TCP ACK آزمایش کنید تا فایروال آن را پاسخی به یک SYN قبلی فرض نماید. اگر Nmap یک reset را دریافت کند، به معنای آن است که درگاه مربوطه فیلترگذاری نشده است:
# nmap -sA -PN -p222,5901
شما در عین حال می توانید از یک اسکن نسخه استفاده نموده و تلاش کنید هریک از درگاه های باز و Banner نسبی سرویس را به همراه یک اثر انگشت سیستم عامل را تشخیص دهید تا برای شناسائی سیستم عامل نیز تلاش نمائید:
# nmap -sV -O
اگر کار پیکربندی فایروال خود را به خوبی انجام داده باشید، Nmap به شما خواهد گفت که تمام درگاه ها فیلترگذاری شده اند و شما نمی توانید سیستم عامل را شناسایی کنید.
Nmap دارای ویژگی های فراوان دیگری است که شما می توانید از طریق مستندات آنلاین با نحوه استفاده از آنها آشنا شوید. توصیه می کنیم وقت بیشتری را صرف بهره گیری از این ابزار نمائید.
IPCop: روش آسان
اگر نمی خواهید با اسکریپت نویسی خط فرمان سر و کار داشته باشید، می توانید یک فایروال IPCop را تنها در مدت چند دقیقه راه اندازی کنید. این یک توزیع لینوکس به حساب می آید که در زمینه ی فایروال (مبتنی بر iptables) تخصص دارد و با یک اینترفیس وب واقعاً کاربرپسند ارائه می شود که به آسان نمودن استفاده از آن کمک می کند. در عین حال، IPCop با یک سرور SSH همراه است که به شما امکان می دهد آن را با یک روش امن از راه دور کنترل نموده و یا از آن برای تونل سازی SSH به سایر PCها بر روی LAN تحت محافظتش استفاده کنید.
سایر سرویس های مفیدی که می توانید پس از نصب IPCop فعال نمائید، عبارتند از:
- DHCP Client/Server
-Dynamic DNS
- HTTP/FTP Proxy (squid)
- IDS (snort)
- Log local or remote
- NTP Server/Client
-IPsec
شما می توانید تا 4 اینترفیس را فعال کنید: شبکه داخلی، شبکه خارجی، DMZ و شبکه داخلی برای WiFi. به نظر می رسد که این ابزار بخوبی برروی سخت افزارهای قدیمی کار می کند، حتی اگر نتوانید از تمام سرویس های آن بر روی ماشین هایی با RAM پائین استفاده نمائید. ما آن را بر روی یک PC قدیمی با 64 مگابایت حافظه RAM نصب کردیم و توانستیم تنها با فعال کردن فایروال و SSH بخوبی از آن استفاده نمائیم.