مفهوم فايروال ها براي مبتديان


 





 
فايروال ها غالباً ناديده گرفته مي شوند، اما عملاً يکي از بهترين موانع در مقابل دسترسي هاي غير مجاز به حساب مي آيند. ما در اين مقاله به شما خواهيم آموخت که چگونه يک فايروال ارزان قيمت را با 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 Mask<IP/<
براي مثال مي توان به 24/192.168.0.0 اشاره کرد.
ICMP يک پروتکل IP مهم ديگر است که براي انتقال اطلاعات کنترلي بر روي يک شبکه (نظير يوتيليتي Ping) مورد استفاده قرار مي گيرد. اين پروتکل داراي همان هدر يک بسته ي IP است که Flag پروتکل آن با ارزش 1 و فيلد نوع ICMP با ارزشي متناسب با نوع پيام تنظيم گرديده.
مقادير متداول براي نوع ICMP عبارتند از:
- 0 (Echo Reply): اين ارزش براي پاسخ به يک درخواست Ping مورد استفاده قرار مي گيرد.
- 3 (Destination Unreacable): هنگاميکه امکان تحويل يک بسته ي IP به مقصد مورد نظر وجود ندارد (براي مثال، روتر نمي تواند مسيري را براي هدايت بسته پيدا کند) از اين ارزش استفاده مي شود.
- 8 (Echo): اين ارزش براي ارسال يک درخواست Ping جهت مشخص کردن اين موضوع که آيا سيستم فعال است يا خير، مورد استفاده قرار مي گيرد.

از تئوري تا عمل
 

حالا شما دانش مقدماتي را بدست آورده ايد تا در عمل ببينيد که وقتي PC خود را به يک شبکه متصل مي کنيد، در سطح پشته TCP/IP چه اتفاقي مي افتد. تنها بعنوان يک مثال، شما در اين مرحله با چند يوتيليتي آشنا خواهيد شد. Netstat يک يوتيليتي خط فرمان براي هر دو سيستم عامل ويندوز و لينوکس است که به شما امکان مي دهد از فهرست اتصالات شبکه PC خود آگاه شويد. شايد براي شما تعجب آور باشد که ببينيد چه تعداد اتصال از قبل بر روي کامپيوترتان فعال هستند، در حاليکه صرفاً PC خود را به يک شبکه متصل کرده ايد.
براي مثال، يک پنجره ترمينال را باز کرده و فرمان زير را تايپ کنيد:

netstat-na
 

به اين ترتيب، فهرستي از تمام اتصالاتي جاري در اختيار شما قرار خواهد گرفت، در صورتيکه ظاهراً هيچ نرم افزار کاربردي بر روي PC شما در حال اجرا نمي باشد (شکل [4]).


 

گزينه -n آدرس ها و شماره ي درگاه ها را در قالب عددي نمايش مي دهد. اساساً اطلاعات ارائه شده عبارتند از:
- Protocol: به شما مي گويد که هر اتصال از پروتکل TCP استفاده مي کند يا UDP.
- Local Address: اينترفيس هاي شبکه ي PC شما از جمله ي Loopback و همچنين درگاه هاي منطقي که اتصال در آنها برقرار شده است. توجه داشته باشيد که بسياري از سرويس ها براي عملکرد صحيح به اينترفيس Loopback نياز دارند.
- External Address: آدرس خارجي که اينترفيس هاي شبکه ي شما به آنها متصل شده اند و همچنين درگاه هاي خارجي منطقي. در اين مورد باز هم اينترفيس Loopback مي تواند مورد استفاده قرار گيرد.
- Status: وضعيت اتصال را در لحظه ي اجراي netstat بيان مي کند. بنابراين شما مي توانيد اتصال هاي برقرار شده (ESTABLISHED)، هماهنگ سازي هاي SYN-SENT(TCP)، پايان يک نشست FIN-SENT(TCP)، اتصالات بسته شده ي Listening، (CLOSE-WAIT) سرور (LISTENING) و نظاير آنها را داشته باشيد.
براي مثال، اگر مي خواهيد تمام سرويس هايي که بر روي بعضي از درگاه هاي ماشين ويندوز شما در حال Listening هستند را بشناسيد، فرمان زير را وارد کنيد:
netstat-nao| find«LISTENING»
همچنين اگر مي خواهيد اطلاعات بيشتري بدست بياوريد، از فرمان زير استفاده نمائيد:

netstat-naob
 

به اين ترتيب شما اطلاعات بيشتري نظير نام برنامه هايي که از اتصالات معيني استفاده مي کنند را بدست خواهيد آورد. تمام اين اطلاعات براي تنظيم صحيح قواعد فايروال شما مفيد خواهند بود.
در لينوکس، شما مي توانيد همين اطلاعات را با استفاده از فرمان زير بدست آوريد:

$ netstat-nap
 

بعلاوه، مي توانيد از يوتيليتي lsof استفاده کنيد که به شما امکان مي دهد فهرستي از درگاه هاي فعال مورد استفاده ي پردازش ها و همچنين اطلاعات مفيد ديگري را بدست آوريد. بعنوان مثال، فرمان زير تمام درگاه هاي مورد استفاده پردازش هاي فعال را نمايش مي دهد:

$ lsof-i
 

اگر مي خواهيد اطلاعات بيشتري درباره ي اتصالات فعال بر روي PC خود بدست آوريد، مثلاً براي اينکه بر جريان داده هايي که از آن عبور مي کنند نظارت داشته باشيد، مي توانيد از يک ابزار واقعاً مفيد با نام TCPdump استفاده نمائيد که در سيستم هاي عامل لينوکس جاسازي شده است. معادل ويندوزي اين ابزار، WinDump نام دارد و شما مي توانيد آن را از http://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 <target>
 

اگر فايروال Pingها را بطور صحيح مسدود کند، Nmap به شما خواهد گفت که ميزبان مورد نظر ظاهراً خاموش است. بنابراين شما مي توانيد يک TCP SYN را به درگاهي بفرستيد که از باز بودن آن اطلاع داريد، مثلاً:

$ nmap -PS222,5901<target>
 

اگر اين فرمان يک SYN-ACK را برگرداند، Nmap فکر مي کند که ميزبان روشن است. با محدود کردن بسته هاي ورودي تنها به يک دامنه مشخص از آدرس هاي IP، شما بايد پيامي را دريافت کنيد که نشان مي دهد ميزبان ظاهراً خاموش است.
همچنين، استفاده از يک بسته ي ACK را نيز آزمايش کنيد و درگاه 80 را در نظر بگيريد که معمولاً قرار است باز باشد:

$ nmap -PA80 <target>
 

اما اگر فايروال تمام بسته هاي TCP ورودي که به يک اتصال برقرار شده ارتباط ندارند را مسدود نمايد، شما هميشه بايد يک پيام Host seems down را دريافت کنيد.
حالا يک اسکن درگاه UDP را براي درگاهي که از بسته بودن آن اطلاع داريد، انجام دهيد. براي مثال:

# nmap -sU -p12345 <target>
 

در اين مورد، اگر فايروال بسته هاي ICMP خروجي با مقصد غيرقابل دسترسي را مسدود کند، Nmap نبايد قادر به مشخص نمودن اين موضوع باشد که ماشين شما روشن است يا خاموش.
حالا شما مي توانيد Nmap را وادار نمائيد تا فرض کند که ميزبان روشن است (با استفاده از گزينه PN-). بنابراين، شما مي توانيد هر نوع اسکن درگاه را بر روي درگاه هاي باز شناخته شده انجام داده و با فيلدهاي TCP flag بازي کنيد.
به اين ترتيب، مثلاً براي برقراري يک Handshake سه مسيره از يک اتصال TCP استفاده کنيد:

$ nmap -sT -PN -p 222,5901<target>
 

اگر اين روش کار نکرد، ارسال بسته هاي نامنظم را آزمايش نمائيد. براي مثال، شما مي توانيد آزمايش خود را با يک TCP SYN انجام دهيد که يک بسته ي SYN را با انتظار يک پاسخ SYN+ACK ارسال مي کند، سپس بلافاصله يک RESET را براي بستن اتصال ارسال نمائيد:

# nmap -sS -PN -p 222,5901 <target>
 

شما همچنين مي توانيد اين موضوع را با يک TCP ACK آزمايش کنيد تا فايروال آن را پاسخي به يک SYN قبلي فرض نمايد. اگر Nmap يک reset را دريافت کند، به معناي آن است که درگاه مربوطه فيلترگذاري نشده است:

# nmap -sA -PN -p222,5901 <target>
 

شما در عين حال مي توانيد از يک اسکن نسخه استفاده نموده و تلاش کنيد هريک از درگاه هاي باز و Banner نسبي سرويس را به همراه يک اثر انگشت سيستم عامل را تشخيص دهيد تا براي شناسائي سيستم عامل نيز تلاش نمائيد:

# nmap -sV -O<target>
 

اگر کار پيکربندي فايروال خود را به خوبي انجام داده باشيد، 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 بخوبي از آن استفاده نمائيم.
شما مي توانيد بسته توزيع و مستندات راهنماي آن را از www.ipcop.org بارگذاري کنيد.
منبع:ماهنامه ي کامپيوتري بزرگراه رايانه، شماره ي 131.