۱۳۸۶ خرداد ۹, چهارشنبه

راه اندازی NAT در لینوکس

SNAT=source address transtlation
DNAT=destination address translation
راه اندازی SNAT با iptables :
SNAT یکی از پرکاربردترین انواع nat با iptables بدلیل نوع توپولوژی مورد استفاده میباشد.
اجازه بدید برای نمونه سناریو زیر را بررسی کنیم :
شبکه 192.168.1.0/24 داخل دفتر ماست.یک ارتباط ethernet با تامین کننده اینترنت داریم که آدرس ip که به ما اختصاص دادند 1.2.3.1/30 و gateway پیش فرض هم 1.2.3.2 میباشد.
همه کامپیوترهای داخل 192.168.1.0/24 با خروجی پیش فرض 192.168.1.1 تنظیم شده اند.
روتر لینوکس ما دارای 2 تا کارت شبکه میباشد :
1-Eth0 با ip آدرس 192.168.1.1 و netmask=255.255.255.0 به یک سوییچ که با بقیه سیستم ها در شبکه 192.168.1.0/24 ارتباط دارد متصل میباشد.
2-Eth1 با ip آدرس 1.2.3.1 و netmask=255.255.255.252 به تامین کننده اینترنت متصل میاشد.
ما میتونیم SNAT رو برای همه سیستم ها در 192.168.1.0/24 راه بیاندازیم فقط با یک rule
iptables -t nat - A POSTROUTING -s 192.168.1.0/24 -j SNAT –to 1.2.3.1
این دستور اثری مشابه دستور زیر داره که ما استفاده میکنیم اگر آدرس eth1 , ip بصورت پویا اختصاص داده میشود یا اگر ما از dial-up modem بجای یک کارت شبکه استفاده میکنیم :
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
تصور کنید تامین کننده ما همه ی پورت های بالایتر از 1024 را فیلتر کرده است.در این صورت ما نیاز به تغییر پورت منبع(source) هم داریم و نه فقط آدرس های ip منبع .
این تغییرات بدین شکل قابل انجام میباشد :
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to 1.2.3.1:1-1024
یکی از کابران در شکل قیلی از طرفداران IRC هست و با شما تماس میگیره و میگه که نمی تونه به هیچ یک از شبکه های IRC وصل شه.این معنیش اینه که ماژول ip_conntrack نیاز به کمی کمک داره و ما میتونیم کمکش کنیم با قرار دادن ip_conntrack_irc ماژول در کرنل.همچنین ممکنه ما بخوایم به کاربرا اجازه بدیم تا ارتباطات ftp رو با موفقیت انجام بدن پس ماژول ip_conntrack_ftp رو در کرنل اضافه میکنیم.
modprobe ip_conntrack_irx #or insmod ip_conntrack_irc
modprobe ip_conntrack_ftp #or insmod ip_conntrack_ftp
بعد از چند هفته بقیه کابرها هم به استفاده از IRC روی میارن و شروع به شکایت در مورد اتصال به IRC میکنن چون شبکه IRC اجازه چند ارتباط محدود از یک ip خاص رو میده پس ما تصمیم گرفتیم که با افزایش ip ها این مشکل رو حل کنیم.حساب کردیم که 32 تا آدرس ip کافی هست برای اونها پس به تامین کننده اینترنت تماس گرفتیم و درخواست ip ادرسهای بیشتر رو دادیم و اونها به ما 1.2.4.0/27 رو اختصاص دادند.ما میباست rule اولیه رو اینجوری تغییر بدیم :
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to 1.2.4.0-1.2.4.32
شکایت کاربرا قطع میشه ولی ما میدونیم که public ip address کامپیتر لینوکس ما در دستور بالا استفاده نمیشه برای nat , پس اون رو هم اضافه میکنیم
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to 1.2.4.0-1.2.4.30 –to 1.2.3.1
یکی از کاربرا در یک شبکه irc اختلال ایجاد میکنه در حالیکه ip اون به 1.2.4.15 ترجمه شده بود..این ip به لیست ip به لیست فیلترینگ اضافه میشه و ما نیاز داریم که این آدرس رو از nat خارج کنیم
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to 1.2.4.0-1.2.4.14 –to 1.2.4.16-1.2.4.32 –to 1.2.3.1
یکی از کاربران با Ip ادرس 192.168.1.19 شکایت میکنه که نمیتونه به هیچ کامپیوتری با آدرس ip های بالاتر از 192.168.1.32 دسترسی داشته باشه.این امکان وجود داره که کاربر مورد نظر netmask رو به 255.255.255.227 تغییر داده باشه , پس همه ip packet ها از کامپیوتر اون به کامپیوترهای داخل 192.168.1.0/24 که داخل 192.168.1.0/27 نیستند از طریق روتر لینوکسی ما عبور میکنند و ادرسشون ترجمه میشه(SNATED). برای حل این مشکل ما 2 راه حل داریم.
اول اینکه SNAT برای 192.168.1.0/24 وقتیکه مقصد کامپیوتری دیگر در 192.168.1.0/24 هست صورت نگیرد :
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d ! 192.168.1.0/24 -j SNAT –to 1.2.4.0-1.2.4.30 –to 1.2.3.1
دومین گزینه ما اینه که SNAT فقط برای بسته هایی که از eth1 خارج میشوند صورت پذیرد :
iptables -t nat -A POSTROUTNG -s 192.168.1.0/24 -o eth1 -j SNAT –to 1.2.4.0-1.2.4.32 –to 1.2.3.1
فرض کنید ما میخواهیم به یک شبکه دیگر در vlan خودمون با آدرس 192.168.2.0/24 بدون انجام SNAT متصل شویم :
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
این دستور rule رو قبل از nat rule قرار میده پس اگر هر بسته ای از 192.168.1.0/24 برای 192.168.2.0/24 فرستاده شده این ruleاعمال میشه و زنجیره آنالیز بیشتر رو ادامه نمیده و SNAT صورت نمیگیره.
تاج ملک ملوک , منشی شرکت , به درست کرن چای عالی معروفه ولی از وقتی عاشق IRC شده دیگه خبری از چای و … نیست.مدیر نمیخواد اونو بندازه بیرون چون به چای تاج ملک ملوک معتاد شده(شاید علت دیگه داره!!) پس میاد پیش ما و درخواست میکنه تا این مشکل و حل کنیم.چند تا راه حل داریم :
از بین بردن بسته هایی از کامپیوتر تاج ملک ملوک (192.168.1.31) که سعی در دسترسی به پورت های 6666 تا 6669 دارند در زنجیره POSTROUTING :
iptables -t nat -I POSTROUTING -s 192.168.1.31 -p tcp –dport 6666:6669 -j DROP
یا از مدیر میپرسیم دوست داره تاج ملک ملوک چه کاری اجازه انجام داشته باشه , مدیر هم مثلا میگه فقط به وب دسترسی داشته باشه :
iptables -t nat -I POSTROUTING -s 192.168.1.31 -p tcp –dport 80 -j DROP
این rule آدرس ip تاج ملک ملوک رو SNAT نخواهد کرد وقتی سعی در دسترسی به چیزی جز پورت 80 tcp داشته باشد.ولی همچنان به سرویس های udp دسترسی خواهد داشت.
راه اندازی DNAT با iptables :
ما همچنان با سناریو قبلی برای DNAT هم ادامه خواهیم داد.یک روز مدیر تماس میگیره و میگه که از خونه میخواد به کامیپوترش دسترسی داشته باشه.پر واضحه که اون الان نمی تونه دسترسی داشته باشه چون Ip کامپیوترش در اداره 192.168.1.50 هست.ما تصمیم گرفتیم که یکی از ip های معتبر رو برای کامپیوترشون اختصاص بدیم ولی اگر بیایم این ip رو به eth0 کامپیوتر مدیر واگذار کنیم هم چند Ip معتبر از دست میدیم هم مدیر به کامیپتر های داخل شبکه دیگه دسترسی نخواهد داشت.راه حل در ترجمه یک ip معتبر(1.2.4.1) به ip غیر معتبر (192.168.1.50) کامپیوتر مدیر میباشد.
البته این معنیش DNAT ldfhan:
iptables -t nat -A PREROUTING -d 1.2.4.1 -j DNAT –to 192.168.1.50
کار بعدی اینه که با مدیر تماس گرفته و پس از یه پاچه خواری تر وتمیز بهشون میگیم برای دسترسی به کامپیوترشون از ip آدرس 1.2.4.1 استفاده کنند.
سرور داخلی ما ip آدرس 192.168.1.100 دارد.یکی از بر و بچ بخش مالی تماس میگیره و درخواست میکنه تا به سرور از خانه بتونه وصل بشه که شما چون وامتون تو نوبته ابن کا رو انجام میدید و ip معتبرشو (1.2.5.17) ازش میگیرید و میگید برای دسترسی از ip آدرس 1.2.4.2 استفاده کنه , ما هم این طور عمل میکنیم :
iptables -t nat -A PREROUTING -s 1.2.5.17 -d 1.2.4.2 -p tcp –dport 80 -j DNAT –to 192.168.1.100
ما میخوایم به سرور از طریق ssh از خارج از شرکت بتونیم وصل شیم ولی این کار خردمندانه ایی نیست که یه ip رو به Ip اون ترجمه کنیم چون ممکنه با پیدا شدن یک باگ در ssh سرور که برای ما حیاتی است رو در معرض خطر قرار بدهیم , پس بهترین کار اختصاص یک پورت با شماره بالا به ssh میباشد
iptables -t nat -A PREROUTING -d 1.2.4.2 -p tcp –dport 65521 -j DNAT –to 192.168.1.100:22
با این روش اگر ما در شرکت نباشیم و احتیاج به ارتباط با سرور رو داریم یک ارتباط ssh به 1.2.4.2 با پورت 65521 برقرار میکنیم.
فرض کنید یک وب سرور با ip آدرس 192.168.1.200 نصب کرده ایم. وب سرور www.persianadmins.com هست و در DNS به 1.2.4.5 اشاره شده.برای در دسترس بودت از خارج از شبکه ما به طریق زیر عمل میکنیم :
iptables -t nat -A PREROUTING -d 1.2.4.5 -p tcp –dport 80 -j DNAT –to 192.168.1.200
استفاده ازاسکرپیت:
برای سناریو بالا از این اسکریپت استفاده کنید که با نیازهای خودتون میتونید هماهنگ کنید و تغییرات لازم رو انجام بدهید :
#!/bin/bash
IP=/sbin/iptables
#… some packet filtering rules
### NAT SECTION
#first of all, we want to flush the NAT table
$IP –t nat –F
############ SNAT PART
#Taj malek molok's special rule.
#Don't SNAT any TCP connections from her computer except www and all #udp connections except DNS
$IP –t nat –A POSTROUTING –s 192.168.1.31 –p tcp –-dport ! 80 –j DROP
$IP –t nat –A POSTROUTING –s 192.168.1.31 –p udp –-dport ! 53 –j DROP
#Don't SNAT anything from 192.168.1.0/24 to 192.168.2.0/24
$IP –t nat –A POSTROUTING –s 192.168.1.0/24 –d 192.168.2.0/24 –j ACCEPT
#The boss needs DNAT but we should also SNAT her IP address to 1.2.4.1
$IP –t nat –A POSTROUTING –s 192.168.1.50 –j SNAT –-to 1.2.4.1
#Snat Everyone
$IP –t nat –A POSTROUTING –s 192.168.1.0/24 –o eth1 –j SNAT –-to 1.2.4.0-1.2.4.32 –-to 1.2.3.1
############ DNAT PART
#Dnat the boss so he can access her PC from home
$IP –t nat –A PREROUTING –d 1.2.4.1 –j DNAT –-to 192.168.1.50
#DNAT the intranet server for the guy in the financial department
$IP –t nat –A PREROUTING –s 1.2.5.17 –d 1.2.4.2 –p tcp –-dport 80 –j DNAT -–to 192.168.1.100
#DNAT for us to ssh into the intranet server
$IP –t nat –A PREROUTING –d 1.2.4.2 –p tcp –-dport 65521 –j DNAT –-to 192.168.1.100:22
#DNAT the web server
$IP –t nat –A PREROUTING –d 1.2.4.5 –p tcp –-dport 80 –j DNAT –-to 192.168.1.200
### End of NAT section
بررسی تنظیمات :
برای بررسی ما نیاز داریم که زنجیره های جدول nat رو ببینیم :
root@router:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all — 0.0.0.0/0 1.2.4.1 to:192.168.1.50
DNAT tcp — 1.2.5.17 1.2.4.2 tcp dpt:80 to:192.168.1.100
DNAT tcp — 0.0.0.0/0 1.2.4.2 tcp dpt:65521 to:192.168.1.100:22
DNAT tcp — 0.0.0.0/0 1.2.4.5 tcp dpt:80 to:192.168.1.200
ACCEPT tcp — 192.168.1.50 0.0.0.0/0 tcp dpt:80
REDIRECT tcp — 192.168.1.0/24 0.0.0.0/0 tcp dpt:80 redir ports 3128
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
DROP tcp — 192.168.1.31 0.0.0.0/0 tcp dpt:!80
DROP udp — 192.168.1.31 0.0.0.0/0 tcp dpt:!53
ACCEPT all — 192.168.1.0/24 192.168.2.0/24
SNAT all — 192.168.1.50 0.0.0.0/0 to:1.2.4.1
SNAT all — 192.168.1.0/24 0.0.0.0/0 to:1.2.4.0-1.2. 4.32 1.2.3.1
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
root@router:~#
نوسنده :
Lucian Gheorghe
ترجمه* :
رضا بهروزی

هیچ نظری موجود نیست: