قابلیت NAT در PF:

NAT یا همان Network Address Translation راهی است برای map کردن یک یا چند شبکه به یک آدرس مشخص، این  قابلیت زمانی مورد نیاز است که شما قصد دارید شبکه خود را به شبکه جهانی وصل کنید  ولی به اندازه همه دستگاه های درون شبکه خود آدرس valid ندارید. برای مرتفع کردن این محدودیت از قابلیت NAT استفاده می کنید. در بحث شبکه یک سری آدرس های IP رزور شده وجود دارند که در شبکه اینترنت مورد استفاده قرار نمی گیرند این آدرس ها در هر سه کلاس ip وجود دارند. لیست این آدرس ها را در زیر مشاهده می کنید:

۱۰٫۰٫۰٫۰/۸       (۱۰٫۰٫۰٫۰ – ۱۰٫۲۵۵٫۲۵۵٫۲۵۵)

۱۷۲٫۱۶٫۰٫۰/۱۲    (۱۷۲٫۱۶٫۰٫۰ – ۱۷۲٫۳۱٫۲۵۵٫۲۵۵)

۱۹۲٫۱۶۸٫۰٫۰/۱۶   (۱۹۲٫۱۶۸٫۰٫۰ – ۱۹۲٫۱۶۸٫۲۵۵٫۲۵۵)

شما باید برای شبکه داخلی خود از این آدرس ها استفاده کنید. برای راه اندازی سرویس NAT شما نیاز به دو کارت شبکه دارید  یکی از کارت ها باید به شبکه اینترنت و دیگری به شبکه داخلی وصل شده باشد. به این ترتیب بعد از راه اندازی سرویس هر درخواستی که از طرف شبکه داخلی برای دسترسی به اینترنت به سرور ارسال می شود از طریق سرور وارد شبکه  اینترنت می شود. به اصطلاح به این عمل NAT می گویند. برای راه اندازی این سرویس مراحل زیر را اجرا کنید.

بخش IP Forwarding :

سرویس nat همیشه  برروی روترها و با gateways شبکه استفاده می شود، به همین منظور باید قابلیت IP Forwarding را فعال کیند تا بسته ها بتوانند بین کارت های شبکه در OpenBSD حرکت کنند. برای این کار باید از فرمان sysctl به صورت زیر استفاده کنید البته به این نکته هم توجه کنید که خط دوم زمانی مورد نیاز است که شما از ورژن۶ آدرس IP استفاده کنید:

# sysctl net.inet.ip.forwarding=1
# sysctl net.inet6.ip6.forwarding=1 (if using IPv6)

برای دایمی کردن این تغییرات باید خطوط زیر را در فایل  /etc/sysctl.conf اضافه کنید:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

البته شاید این بخش ها به صورت کامنت وجود دارند و نیاز است که از ابتدای خط کاراکتر # را حذف کنید.

NAT با استفاده از پارامتر nat-to در یک رول خروجی که شامل pass  است مشخص می شود. در بعضی از مواقع به جای استفاده از pass از پارامتر match استفاده می شود با این روش ابتدا بسته ها  به رول match برخورد می کند و بعد با استفاده از رول pass بسته رد می شود. در این روش شما هم می توانید یک رول match  داشته باشید و بعد می تواتید به pass یا block کردن ترافیک فکر کنید. در زیر با شکل کلی دو رول match و pass آشنا می شوید و در ادامه به توضیح هر بخش می پردازیم. این فرمت در فایل pf.conf مورد استفاده قرار می گیرد:

match out on interface [af] \
from src_addr to dst_addr \
nat-to ext_addr [pool_type] [static-port]

pass out [log] on interface [af] [proto protocol] \
from ext_addr [port src_port] \
to dst_addr [port dst_port]

بخش match :

وقتی شرایط یک بسته با رولی که در آن از این گزینه استفاده شده برخورد می کند نشانه گذاری شده و برای رول های دیگر آماده می شود.

بخش pass:

رولی که با بخش pass شروع شود به بسته هایی که با آن مچ می شوند اجازه عبور می دهد.

بخش out:

این بخش مسیر بسته را مشخص می کند و همیشه در بحث nat از بخش out استفاده می کنند.

بخش log :

اگر این بخش در رول آورده شده باشد با استفاده از برنامه pflogd گزارش گیری می شود.

بخش interface :

در این بخش نام واسط های شبکه ذکر می شوند.

بخش af:

در این بخش شما ورژن آدرس IP که شبکه شما از آن استفاده می کنند را مشخص می کنید.

بخش protocol :

در این بخش شما پروتکلی که قصد nat کردن آنرا دارید را مشخص می کنید مثلا tcp, udp  البته شما در بخش های src_port و dist_port می توانید مبدا و مقصد پورت سرویس موردنظر را تعیین کنید.

بخش src_addr:

در این بخش شما آدرس داخلی شبکه خود را قرار می دهید. که به حالت های مختلف می توانید آنرا بنویسید، مثلا تک IP  در دو ورژن، حالت CIDR.

بخش dst_addr:

در این بخش مقصد آدرسی که باید بسته در آن ترجمه شوند را تعیین کنید، روش نوشتن آن هم مثل بخش src_addr است. این بخش بیشتر موارد از any استفاده می کنند.

بخش ext_addr:

این بخش در حقیقت آدرس IP در سرور است که از طریق آن سیستم به شبکه اینترنت و یا سایر شبکه های مورد نظر وصل است.

بخش pool_type:

در بعضی از موارد شما قصد دارید که آدرس ها را به یک سری از آدرس های دیگر ترجمه کنید برای این منظور از این بخش استفاده می کنید.

بخش static-port:

این بخش به pf می گوید که پورت های مبدا در بسته های tcp و udp را ترجمه کند.

حال در ادامه با یک مثال در این زمینه آشنا می شوید، در ابتدا از بخش match در رول و در ادامه از یک تک رول برای nat استفاده می کنیم.

match out on tl0 from 192.168.1.0/24 to any nat-to 24.5.0.5
pass on tl0 from 192.168.1.0/24 to any

و بخش بدون استفاده از match :

pass out on tl0 from 192.168.1.0/24 to any nat-to 24.5.0.5

این رول به pf می گوید که عمل nat را برروی کارت شبکه tl0 انجام بدهد “ذکر این نکته در اینجا ضروری است که این کارت شبکه همان کارت شبکه ای است که به شبکه دیگر وصل است و  یا به شبکه اینترنت متصل شده است”  و  در همه بسته هایی که از شبکه ۱۹۲٫۱۶۸٫۱٫۰ دریافت می کند آدرس مبدا را به ۲۴٫۵٫۰٫۵ که آدرس IP همان کارت شبکه tl0 است تغییرداده و به اصطلاح ترجمه می کند تا شبکه مذکور به شبکه اینترنت دسترسی داشته باشد. فقط برای راه اندازی در این بخش به نکات گفته شده توجه داشته باشید در غیر این صورت nat  به درستی کار نمی کند. برای بارگذاری فایل pf.conf با این رول جدید فرمان زیر را اجرا کنید و در صورتی که پیغام خطایی دریافت نکردید رول شما به درستی بارگذاری شده:

#pfctl –f /etc/pf.conf

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

#pfctl –sr

برای مشاهده وضعیت و فعالیت nat از فرمان pfctl به صورت زیر استفاده کنید:

# pfctl -s state

   fxp0 tcp 192.168.1.35:2132 (24.5.0.5:53136) -> 65.42.33.245:22 TIME_WAIT:TIME_WAIT

   fxp0 udp 192.168.1.35:2491 (24.5.0.5:60527) -> 24.2.68.33:53   MULTIPLE:SINGLE

در ادامه فقط خط اول این بخش را تفسیر می کنم:

fxp0  :این بخش  نام رابط است.

TCP : پروتکلی است که در این بخش مورد استفاده قرار می گیرد.

۱۹۲٫۱۶۸٫۱٫۳۵:۲۱۳۲: این بخش آدرس و پورت بسته ای است که از شبکه داخلی ارسال شده است، بعد از علامت : شماره پورت را مشاهده می کنید.

۲۴٫۵٫۰٫۵:۵۳۱۳۶:  در این بخش رول nat جای آدرس و پورت  را با آدرس خود و یک شماره پورت دیگر تغییر داده  تا وارد شبکه دیگر شود.

۶۵٫۴۲٫۳۳٫۲۴۵:۲۲ : این بخش آدرس و شماره پورت سروری است که دستگاه در شبکه داخلی قصد برقراری ارتباط با آن را داشته است.

TIME_WAIT:TIME_WAIT: این بخش وضعیت ارتباط را مشخص می کند.