آشنایی با IPTABLES قسمت اول(2298 مجموع کلمات موجود در متن) (10291 بار مطالعه شده است) آشنایی
با IPTABLES
قسمت
اول
مقدمه همانطور
که میدانید، شبکههای کامپیوتری مبتنی
بر گنو/لینوکس
به طور فزایندهای رو به گسترش هستند.
در
این بین یکی از عمده مشکلات، مشکلات مربوط
به امنیت شبکه میباشد.
Iptables یکی
از کاراترین و انعطاف پذیرترین نرمافزارهای
تولید شده در این زمینه است.
با
استفاده از این نرم افزار شما می توانید
ترافیک ورودی و خروجی سیستم و شبکه را تحت
کنترل خود درآورید.
در
این مقاله سعی شده تا حد زیادی مفاهیم و
امکانات مربوط به این نرم افزار را در
اختیار شما قرار دهیم.
اصطلاحات این
مقاله شامل تعدادی اصطلاحات خاص است که
باید کمی بیشتر در مورد آنها توضیح دهم.
در
این قسمت آن دسته از اصطلاحاتی که بیشتر
مورد استفاده است را برایتان تشریح می
کنم:
DNAT
یاDestination
Network Address Translation DNAT تکنیکی
برای ترجمه یا تفییر آدرس IP
مقصد
است.
DNAT به
همراه SNAT
برای
تسهیم یک آدرس IP
معتبر
(آدرس
IP که
در اینترنت قابلیت مسیریابی داشته باشد)
به
کار میرود.
این
کار به وسیله واگذار کردن (assigning)
درگاههای
مختلف در جهت یک آدرس IP
اینترنتی
معتبر و در نهایت مطلع کردن مسیریاب لینوکس
از اینکه ترافیک را به کجا بفرستد، انجام
میشود.
Stream این
اصطلاح مربوط به اتصالی است که بستههایی
را که به طریقی به یکدیگر مرتبط هستند،
ارسال و دریافت میکند.
به
طور پایه در این مقاله از این اصطلاح برای
اتصالاتی که دو یا چند بسته را به طور
همزمان ارسال می کنند، استفاده میشود.
در
بحث TCP
به
اتصالی گفته می شود که یک SYN
میفرستد
و سپس با یک SYN/ACK
پاسخ
میدهد، اما اتصالی که با ارسال یک SYN
یک
ICMP
Host unreaschable دریافت
میکند نیز ممکن است.
به
زبان دیگر این اصطلاح در بعضی موارد به
طور بی ربطی استفاده شده است.
SNAT
یاSource
Network Address Translation این
اصطلاح به تکنیکی در مورد تغییر آدرس مقصد
یک بسته اشاره میکند.
State این
اصطلاح وضعیت فعلی یک بسته را مشخص میکند.
این
وضعیت هم می تواند مطابق RFC
793 - Transmission Control Protocol باشد
و هم مطابق با حالت های تعریف شده توسط
کاربر در جدولNetfilter/iptable
. دقت
کنید که حالتهایی که به صورت داخلی یا
خارجی استفاده میشوند، به طور کامل از
RFC 793
تبعیت
نمی کند.
دلیل
اصلی این است که Netfilter
مجبور
است تا مفروضیات زیادی در مورد اتصالات
و بسته ها بسازد.
۱)
طریقه
ی حرکت جداول و زنجیره ها یاchains در
این بخش به شما میگویم که بستهها چگونه
و به چه صورت از میان زنجیرههای مختلف
عبور میکنند و اینکه هر کدام از سفارشها
در کدام جدول میچرخد.
این
مطالب به شما کمک می کند تا قواعدهای
(rule)
مخصوص
خودتان را بنویسید. وقتی
که یک بسته وارد firewall
میشود،
ابتدا به سخت افزار بر میخورد و سپس به
درایور مربوطه فرستاده میشود.
سپس،
قبل از اینکه به نرم افزار مربوطه فرستاده
شود، یا اینکه به میزبان دیگری فرستاده
شود، از یک سری مراحل در داخل هسته عبور
می کند. ابتدا
اجازه دهید که به بستهای که مقصدش بر
روی میزبان محلی است نگاهی بیندازیم.
قبل
از اینکه واقعا به برنامه کاربردی مربوطه
تحویل داده شود، این بسته از مراحل زیر
عبور میکند:
مرحله
|
جدول
|
زنجیره
|
توضیحات
|
1
|
|
|
بر
روی خطوط(مثل
اینرنت)
|
2
|
|
|
وارد
رابط شده است(مانند
eth0)
|
3
|
mangle
|
PREROUTING
|
این
زنجیره به طور معمول جهت دستکاری بستهها
مانند TOSآنها،
استفاده می شود.
|
4
|
nat
|
PREROUTING
|
این
زنجیره به طور اصلی جهت DNAT
استفاده
میشود.
تا
قبل از رسیدن بسته به محل مقرر از
فیلترینگ آن خودداری کنید.
|
5
|
|
|
تصمیمات
مسیریابی، مانند اینکه آیا این بسته
مربو ط به میزبان محلی است یا باید به
جای دیگری ارسال شود و به کجا.
|
6
|
mangle
|
INPUT
|
در
این نقطه، به زنجیره INPUT
از
جدول mangle
برخورد
میکنیم.
از
این زنجیره جهت دستکاری بسته ها بعد از
اینکه مسیریابی شدند و قبل از اینکه به
پردازش مربوطه بر روی ماشین ارسال شوند،
استفاده میشود.
|
7
|
filter
|
INPUT
|
اینجا
محلی است که ما عمل فیلترینگ را بر روی
تمام ترافیک رسیده به میزبان محلی،
انجام میدهیم.
دقت
داشته باشید که تمام بسته هایی که
مقصدشان میزبان محلی باشد، در اینجا
میتوانند فیلتر شوند و اینکه از طریق
کدام رابط وارد شدهاند، اهمیتی ندارد.
|
8
|
|
|
پردازش
یا application
محلی(مانند
برنامه های server/client)
|
دقت
داشته باشید که این بستهها از زنجیره ی
INPUT رد
میشوند نه زنجیرهی FORWARD.
شاید
در این لحظه کمی گیج شده باشید، اما با
کمی تفکر و دقت می توانید دریابید که در
حقیقت چه اتفاقی رخ داده است.
اکنون
به بسته ای که از ماشین خودمان خارج می
شود، نگاهی می اندازیم:
مرحله
|
جدول
|
زنجیره
|
توضیحات
|
1
|
|
|
پردازش
یا برنامه local
(مانند
برنامه server/client)
|
2
|
|
|
تصمیمات
مسیریابی.
چه
آدرس مبدایی استفاده شده است، چه رابطی
برای خروج استفاده میشود و دیگر
اطلاعات ضروری که نیاز است جمع آوری
شود.
|
3
|
mangle
|
OUTPUT
|
این
نقطه مکانی است که ما بستهها را دستکاری
میکنیم و پیشنهاد می شود که فیلترینگ
را در این زنجیره انجام ندهید.
|
4
|
nat
|
OUTPUT
|
این
زنجیره می تواند برای بسته های خروجی
NAT
از
firewall
استفاده
شود.
|
5
|
filter
|
OUTPUT
|
این
نقطه محلی است که ما بستههای خروجی
از ماشین محلی را فیلتر می کنیم.
|
6
|
mangle
|
POSTROUTING
|
زنجیره
POSTROUTING
در
جدول mangle
اساسا
زمانی استفاده میشود که ما میخواهیم
بستهها را بعد از مسیریابی و قبل از
خروجشان از ماشین محلی دستکاری کنیم.
این
زنجیره هم با بستههایی که از firewall
میگذرند
و هم آنهایی که توسط خود firewall
ساخته
شدهاند، برخورد دارد.
|
7
|
nat
|
POSTROUTING
|
اینجا
محلی است که ما عمل SNAT
را
انجام میدهیم.
در
اینجا هم توصیه میشود که عمل فیلترینگ
را انجام ندهید.
|
8
|
|
|
خروج
بسته از یک یا چند رابط (مثل
eth0)
|
9
|
|
|
بر
روی سیم (مثل
اینترنت)
|
حال
فرض کنیم که بسته متعلق به یک شبکه دیگر
است و قرار است از میزبان محلی به شبکهی
دیگری ارسال شود.بسته
از طریق مراحلی که در زیر آورده شده است
ارسال میشود:
مرحله
|
جدول
|
زنجیره
|
توضیحات
|
1
|
|
|
بر
روی سیم (مثل
اینترنت)
|
2
|
|
|
وارد
رابط شده است(مانند
eth0)
|
3
|
mangle
|
PREROUTING
|
این
زنجیره به طور معمول جهت دستکاری بستهها
مانند TOS
آنها،
استفاده می شود.
|
4
|
nat
|
PREROUTING
|
این
زنجیره به طور اصلی جهت DNAT
استفاده
میشود.
تا
قبل از رسیدن بسته به محل مقرر از
فیلترینگ آن خودداری کنید.
|
5
|
|
|
تصمیمات
مسیریابی، مانند اینکه آیا این بسته
مربوط به میزبان محلی است یا باید به
جای دیگری ارسال شود و به کجا.
|
6
|
mangle
|
FORWARD
|
بسته
به زنجیره FORWARD
از
جدول mangle
ارسال
میشود.
این
کار ممکن است برای بسیاری از نیازهای
مخصوص انجام شود، جایی که میخواهیم
بسته ها را بعد از تصمیمات ابتدایی
مسیریابی دستکاری کنیم و قبل از اینکه
تصمیمات نهایی مسیریابی انجام شود و
بسته ارسال شود.
|
7
|
filter
|
FORWARD
|
تنها
بستههای forward
شده
به این زنجیره بیایند و در اینجا عمل
فیلترینگ انجام می شود.
توجه
داشته باشید از آنجاییکه تمام ترافیک
از این نقطه میگذرد، باید مجموعه
قواعد خود را به درستی تنظیم کنید.
زیرا
دیگر وقتی برای تصحیح آنها نخواهید
داشت.
|
8
|
mangle
|
POSTROUTING
|
این
زنجیره برای انجام یک سری از انواع
بخصوص تغییرات، پس از مسیریابی و قبل
از خروج آنها از ماشین استفاده میشود.
|
9
|
nat
|
POSTROUTING
|
این
بخش هم برای انجام عمل SNAT
است.
در
این نقطه از فیلترینگ اجتناب کنید.
|
10
|
|
|
خروج
بسته از یک یا چند رابط (مثل
eth0)
|
11
|
|
|
بر
روی سیم (مثل
اینترنت)
|
همانطور
که میبینید، به طور کلی یک سری مراحلی
وجود دارد تا بسته از طریق آنها عبور کند.
بستهها
میتوانند در هر کدامیک از زنجیره های
iptables
یا
هر جای دیگری که بهتر باشد، متوقف شوند.
دقت
داشته باشید که برای رابط های مختلف زنجیره
ها یا جداول مجزا وجود ندارد. همچنین
توجه داشته باشید که ما در جدول قبلی از
زنجیره ی INPUT
برای
فیلتر کردن استفاده کردیم.
این
زنجیره فقط برای بسته های مربوط به ماشین
محلی است که به مقصد دیگری مسیردهی نشده
است. اکنون
مطابق نمودار زیر می بینید که بسته های
معرفی شده در سه سناریوی بالا چگونه
مسیردهی میشوند:
اگر
احساس کردید که به اطلاعات بیشتری نیاز
دارید، میتوانید از اسکریپت زیر استفاده
کنید.
این
اسکریپت تعدادی rule
به
شما میدهد تا نحوهی عملکرد جداول و
زنجیره ها را ببینید.
#!/bin/bash
#
# rc.test-iptables - test script for iptables chains and tables.
#
# Copyright (C) 2001 Oskar Andreasson <bluefluxATkoffeinDOTnet>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program or from the site that you downloaded it
# from; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# Filter table, all chains
#
iptables -t filter -A INPUT -p icmp --icmp-type echo-request \
-j LOG --log-prefix="filter INPUT:"
iptables -t filter -A INPUT -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="filter INPUT:"
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request \
-j LOG --log-prefix="filter OUTPUT:"
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="filter OUTPUT:"
iptables -t filter -A FORWARD -p icmp --icmp-type echo-request \
-j LOG --log-prefix="filter FORWARD:"
iptables -t filter -A FORWARD -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="filter FORWARD:"
#
# NAT table, all chains except OUTPUT which don't work.
#
iptables -t nat -A PREROUTING -p icmp --icmp-type echo-request \
-j LOG --log-prefix="nat PREROUTING:"
iptables -t nat -A PREROUTING -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="nat PREROUTING:"
iptables -t nat -A POSTROUTING -p icmp --icmp-type echo-request \
-j LOG --log-prefix="nat POSTROUTING:"
iptables -t nat -A POSTROUTING -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="nat POSTROUTING:"
iptables -t nat -A OUTPUT -p icmp --icmp-type echo-request \
-j LOG --log-prefix="nat OUTPUT:"
iptables -t nat -A OUTPUT -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="nat OUTPUT:"
#
# Mangle table, all chains
#
iptables -t mangle -A PREROUTING -p icmp --icmp-type echo-request \
-j LOG --log-prefix="mangle PREROUTING:"
iptables -t mangle -A PREROUTING -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="mangle PREROUTING:"
iptables -t mangle -I FORWARD 1 -p icmp --icmp-type echo-request \
-j LOG --log-prefix="mangle FORWARD:"
iptables -t mangle -I FORWARD 1 -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="mangle FORWARD:"
iptables -t mangle -I INPUT 1 -p icmp --icmp-type echo-request \
-j LOG --log-prefix="mangle INPUT:"
iptables -t mangle -I INPUT 1 -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="mangle INPUT:"
iptables -t mangle -A OUTPUT -p icmp --icmp-type echo-request \
-j LOG --log-prefix="mangle OUTPUT:"
iptables -t mangle -A OUTPUT -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="mangle OUTPUT:"
iptables -t mangle -I POSTROUTING 1 -p icmp --icmp-type echo-request \
-j LOG --log-prefix="mangle POSTROUTING:"
iptables -t mangle -I POSTROUTING 1 -p icmp --icmp-type echo-reply \
-j LOG --log-prefix="mangle POSTROUTING:"
در
قسمتهای بعدی با نحوهی تولید این rule
ها
آشنا میشوید.
منبع:
http://iptables-tutorial.frozentux.net/iptables-tutorial.html مترجم:
ایرج
هدایتی shotorbaan@yahoo.co.uk
|