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

0
SNAT=Source Address Transtlation
DNAT=Destination Address Transtlation

راه اندازی SNAT با iptables

SNAT یکی از پرکاربردترین انواع nat با iptables بدلیل نوع توپولوژی مورد استفاده میباشد.
برای نمونه سناریو زیر را مورد بررسی قرار می دهیم :
سیستم ها با رنج آدرس 192.168.1.0/24 در دفتر ما واقع شده اند و شبکه محلی و خصوصی در این سناریو به حساب می آیند .یک ارتباط ethernet با تامین کننده اینترنت با IP آدرس 30/1.2.3.1 بر روی روتر لینوکس مورد نظر و 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 فعال کرد :

iptables    -t   nat    -A   POSTROUTING   -s   192.168.1.0/24      -j     SNAT     --to     1.2.3.1

با اجرای دستور بالا همه سیستم ها در شبکه محلی به اینترنت دسترسی خواهند داشت.

اگر IP آدرس Eth1 بصورت پویا اختصاص داده می شود و یا اگر از مودم Dial-UP بجای کارت شبکه استفاده می کنید از ویژگی MASQUERADE به شکل زیر می توان بهره برد :

iptables   -t   nat   -A   POSTROUTING   -s   192.168.1.0/24    -j   MASQUERADE

استفاده از MASQUERADE اثری مشابه SNAT دارد و سیستم ها به اینترنت دسترسی خواهند داشت ، پس کاربرد MASQUERADE بیشتر برای زمانهایی است که آدرس ثابت از سوی تامین کننده اینترنت اختصاص داده نمی شود.

تصور کنید تامین کننده اینترنت کلیه پورت های بالاتر از 1024 را فیلتر کرده است ، در این صورت برای جلوگیری از بروز مشکل نیاز است علاوه بر تغییر 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_irc در کرنل بارگزاری نشده است ، پس برای حل این مشکل برای کاربران IRC و FTP بدین ترتیب عمل می کنیم :

modprobe ip_conntrack_irc
 modprobe ip_conntrack_ftp

برای مشاهده ماژول های بارگزاری شده مربوط بهNAT از دستور زیر استفاده می کنیم :

lsmod   |   grep nat

بعد از چند هفته کاربران دیگر هم شروع به استفاده از IRC می کنند و نتیجه آن شکایت کاربران از عدم اتصال به شبکه IRC خواهد بود و دلیل آن اینست که IRC فقط به تعداد محدودی ارتباط از یک IP اجازه اتصال می دهد. پس برای حل این مشکل باید IP های مورد استفاده در شبکه اینترنت برای اتصال به IRC را افزایش دهیم.طبق محاسبات استفاده از 32 آدرس IP برای حل این مشکل کفایت می کند ، پس با تامین کننده اینترنت تماس گرفته و درخواست تعداد بیشتری IP را به آنها می دهیم و در نهایت محدوده 27/1.2.4.0 را به ما اختصاص می دهند.حال باید قوانین قبلی را بدین صورت تغییر دهیم :

iptables   -t   nat   -A   POSTROUTING   -s    192.168.1.0/24    -j   SNAT   --to   1.2.4.0-1.2.4.32

(لازم به یادآوری است که برای حذف قانون قبلی می توان از -D بجای -A استفاده کرد و یا برای حذف کلیه قانون های مربوط به نت از دستور iptables -t nat -F بهره جست.)
بدین ترتیب شکایت کاربران قطع می شود ولی ملاحظه می کنیم که آدرس معتبر ابتدایی ما در این محدوده وجود ندارد، پس می توانیم برای افزایش تعداد آدرس ها ، آن را هم به این محدوده اضافه کنیم :

iptables   -t  nat   -A   POSTROUTING   -s    192.168.1.0/24    -j    SNAT    --to    1.2.4.0-1.2.4.32    --to   1.2.3.1

یکی از کاربران در یک شبکه irc اختلال ایجاد میکند در حالیکه IP کاربر مورد نظر به 1.2.4.15 ترجمه شده بوده است ، در نتیجه این 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 های محدوده /24192.168.1.0 که در محدوده 192.168.1.0/27 واقع نشده اند از طریق روتر لینوکسی عبور می کنند و آدرس آنها ترجمه می شود. برای حل این مشکل 2 راه حل وحود دارد :
اول اینکه SNAT برای 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 خودمان با محدوده آدرس 24/192.168.2.0 بدون انجام SNAT متصل شویم :

iptables   -t   nat   -I   POSTROUTING   -s   192.168.1.0/24   -d   24/192.168.2.0   -j   ACCEPT

این دستور قانون فوق را قبل از قوانین نت قرار میدهد بنابراین اگر بسته ای از 192.168.1.0/24 برای 24/192.168.2.0 فرستاده شود ، قانون فوق اعمال شده و زنجیره آنالیز بیشتر را ادامه نمی دهد و 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

این قانون دسترسی تاج ملک ملوک تحت پروتکل TCP را فقط برای مشاهده وب باز می گذارد ولی همچنان به سرویس های تحت پروتکل UDP نظیر DNS دسترسی خواهد داشت.

راه اندازی DNAT با iptables

برای بررسی DNAT همچنان از سناریو در ابتدا معرفی شده پیروی می کنیم.
مدیر شرکت در تماسی خواهان استفاده دسترسی از خانه به سیستمش در دفتر شرکت می شود ، پر واشح است که با تنظیمات فعلی این کار شدنی نیست زیرا سیستم مورد نظر در حال حاظر دارای آدرس غیر معتبر 192.168.1.50 می باشد که در اینترنت قابل مسیریابی نیست.
اگر از آدرس های معتبری که تامین کننده اینترنت به ما داده یکی را به سیستم مدیر اختصاص دهیم ، یکی از IP هایی که همه سیستم ها بصورت مشترک برای دسترسی به اینترنت از آن استفاده می کنند را از دست می دهیم .
راه حل در ترجمه یک IP معتبر( 1.2.4.1 ) به IP غیر معتبر ( 192.168.1.50 ) سیستم مدیر می باشد.
البته در اصطلاح به این عمل DNAT گفته می شود :

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 می باشد.
مسئول بخش مالی طی نامه ای خواهان امکان دسترسی به برنامه جهت اضافه کاری در زمانهایی که در شرکت حضور ندارد می باشد ، از آنجایی که دسترسی به برنامه برای عموم خلاف سیاست امنیتی شرکت می باشد ، آدرس معتبری ( 1.2.5.17 ) که فرد مورد نظر از طریق آن خواهان اتصال به برنامه هست را گرفته و بدین شیوه عمل می کنیم :

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

مسئول محترم مالی برای دسترسی به برنامه باید از آدرس 1.2.4.2 استفاده کند.

می خواهیم خارج از شرکت بواسطه ssh به سرور متصل شویم ، ولی برای بالا بردن امنیت سرور مثلا برای مواقعی که با پیدا شدن یک باگ در ssh سرور ، ممکن است امنیت آن به خطر بیافتد پورت دیگری را جز 22 به آن اختصاص می دهیم :

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 24/192.168.2.0 -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 را مورد بررسی قرار می دهیم :
[email protected]:~# iptables   -t   nat   -L   -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT all — 0.0.0.0/01.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/01.2.4.2 tcp dpt:65521 to:192.168.1.100:22
DNAT tcp — 0.0.0.0/01.2.4.5 tcp dpt:80 to:192.168.1.200
ACCEPT tcp — 192.168.1.50 0.0.0.0/0tcp dpt:80
REDIRECT tcp — 192.168.1.0/24 0.0.0.0/0tcp 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
[email protected]:~#

نکته مهم :
اجرای دستورات بالا بدون فعال کرده ویژگی IP forwarding ثمری نخواهد داشت ، به عبارت دیگر بدون فعال کردن این ویژگی هیچ کدام از دستورات ذکر شده در بالا کاری صورت نمی دهند.
برای فعال کردن ip forwarding بدین شکل عمل می کنیم :

echo 1 > /proc/sys/net/ipv4/ip_forward

برای اطمینان از اجرای درست دستور فوق مقدار ip forwarding را مورد بررسی قرار می دهیم که می بایست برابر با 1 باشد :

cat /proc/sys/net/ipv4/ip_forward

برای آنکه نخواهید پس از هر بار روشن شدن سیستم دستورات را اجرا کنید ، آنها را در فایل etc/rc.local/ قرار دهید.

نوسنده : Lucian Gheorghe
ترجمه و تالیف : رضا بهروزی

نظرات مسدود است.