یکی از مشکلات پروتکل IPv4 فضای آدرس‌دهی اندک آن است. چون IPv4 از ۳۲ بیت برای آدرس‌دهی استفاده می‌کند، می‌توان ‎۲^۳۲‎ آدرس مختلف (حدود چهار میلیارد) داشت که البته محدوده وسیعی از آن برای استفاده‌های خاصی رزرو شده‌اند و در اینترنت قابل استفاده نیستند. محدوده آدرس‌های زیر برای استفاده در شبکه‌های محلی رزرو شده و در اینترنت قابل استفاده نیست:

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

امروزه با توجه به افزایش تعداد کاربران اینترنت، این محدودیت IPv4 دردسرساز شده است که البته راه‌حل هایی هم برای آن ارائه شده که راه حل قطعی آن پروتکل IPv6 است. اما با اینکه IPv6 در حال جایگزین شدن است، اما هنوز تا جایگزینی کامل با IPv4 راهی دراز در پیش است و تا آن موقع می‌توان از راه‌حل‌های موقتی مانند NAT یا Network Address Translation استفاده کرد. NAT تکنیکی است که می‌توان در یک شبکه محلی از آن برای به اشتراک گذاشتن یک خط ارتباطی اینترنت بین چندین رایانه استفاده کرد. همان طور که می‌دانید هر بسته یک فیلد Source Address دارد که این فیلد حاوی آدرس IP کامپیوتری است که آن بسته را تولید کرده. در تکنیک NAT با تغییر دادن این فیلد به یک آدرس IP معتبر و قابل مسیردهی در اینترنت می‌توان یک ارتباط اینترنت را میان چند رایانه به اشتراک گذاشت. در FreeBSD این کار بر عهده دایمنی به نام natd است. این دایمن بسته‌های IP ورودی را دریافت کرده، فیلد source address آن را به آدرس ماشینی که بر روی آن اجرا می‌شود تغییر داده و بسته را مجدداً ارسال می‌کند. natd علاوه بر فیلد source address ، فیلد source port را هم تغییر می‌دهد. بدین ترتیب وقتی که پاسخی را مقصد دریافت کرد، می‌تواند مشخص کند که بسته توسط چه کسی ارسال شده و پاسخ را به کلاینت تحویل دهد.

برای انجام این کار، FreeBSD باید دو عدد کارت شبکه داشته باشد که یکی به اینترنت و دیگری به شبکه محلی متصل شده است. تمام کامپیوترهای موجود در شبکه محلی از طریق یک هاب یا سوئیچ به یکدیگر متصل شده‌اند. FreeBSD بسته‌ها را از شبکه محلی دریافت کرده، سپس فیلد source address و source port آن را تغییر می‌دهد و بسته را به اینترنت ارسال می‌کند. بعد از اینکه پاسخی از طرف اینترنت دریافت کرد، آن را برای کلاینت مربوطه ارسال می‌کند. همان طور که گفته شد natd با تغییر دادن فیلد source port می‌تواند کلاینت ها را شناسایی کند.

قابلیت ترجمه آدرسهای شبکه به کمک natd در هسته GENERIC وجود ندارد. اما این قابلیت‌ها به صورت ماژول در دسترس هستند. برای بارگذاری این ماژول‌ها در هنگام بوت شدن سیستم کافی است خطوط زیر را به فایل /boot/loader.conf اضافه کنید.

ipfw_load="YES"
ipdivert_load="YES"

علاوه بر آن net.inet.ip.fw.default_to_accept هم باید بر روی ۱ تنظیم شود.

اگر استفاده از ماژول‌ها را دوست ندارید و ترجیح می‌دهید این قابلیت را به صورت ثابت در هسته فعال کنید، کافی است خطوط زیر را به فایل پیکربندی هسته اضافه نمایید:

options IPFIREWALL 
options IPDIVERT 
options IPFIREWALL_DEFAULT_TO_ACCEPT 
options IPFIREWALL_VERBOSE

برای فعال کردن فایروال و natd در هنگام بوت، خطوط زیر را به فایل /etc/rc.conf اضافه کنید:

gateway_enable="YES" 
firewall_enable="YES" 
firewall_type="OPEN" 
natd_enable="YES 
natd_interface="fxp0" 
natd_flags=""

خط اول باعث می‌شود تا FreeBSD به عنوان یک gateway عمل کند و بسته‌ها بتوانند در میان کارت‌های شبکه رد و بدل شوند. اجرای دستور sysctl net.inet.ip.fw.default_to_accept=1 نتیجه مشابهی دارد.

خط دوم rule های فایروال را از فایل /etc/rc.firewall بارگذاری می‌کند. در این فایل تعدادی ruleset وجود دارد که می‌توان از آن‌ها استفاده کرد.

خط سوم یکی از ruleset های فایل /etc/rc.firewall که OPEN نام دارد را در IPFW بارگذاری می‌کند. خط چهارم کارت شبکه‌ای که به اینترنت متصل شده است را به natd معرفی می‌کند. natd پس از اینکه بسته‌ها را دریافت کرد، آن‌ها را به آدرس موجود روی این کارت شبکه ترجمه می‌کند.

اگر قصد دارید natd را با پارامتر خاصی فراخوانی کنید، می‌توانید این پارامترها را به کمک خط آخر مشخص کنید.

با اضافه کردن خطوط بالا به فایل /etc/rc.conf دستور natd -interface fxp0 در هنگام بوت شدن سیستم اجرا می‌شود.

اگر تعداد پارامترهای زیادی می خواهید برای natd ارسال کنید، می‌توانید این پارامترها را در فایلی نوشته و این فایل را به natd معرفی کنید.

به عنوان مثال:

natd_flags="-f /etc/natd.conf"

فایل /etc/natd.conf باید حاوی یک پارامتر در هر خط باشد: به عنوان مثال:

redirect_port tcp 192.168.0.2:6667 6667 
redirect_port tcp 192.168.0.3:80 80

حالا باید تمام کلاینت‌هایی که در شبکه محلی شما قرار دارند یک آدرس IP نامعتبر داشته و default gateway آن‌ها بر روی ماشینی که natd را اجرا می‌کند تنظیم شود.