اتصال به سرور پشت روتر می‌رسد، ولی پاسخ برنمی‌گردد. امشب مسیر رفت و برگشت، ترجمهٔ آدرس و وضعیت اتصال را کنار هم می‌گذاریم. NAT را جای مسیریابی یا policy امنیتی نمی‌نشانیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: srv به‌عنوان روتر Ubuntu؛ دو کارت lab؛ client در شبکهٔ 56 و backend در شبکهٔ 57؛ iptables، conntrack و ipset؛ کنسول.

جایگاه در دوره: هدف‌های 334.3 آزمون 303-300.

توپولوژی این جلسه#

روی روتر، کارت اول 192.168.56.10/24 و کارت دوم 192.168.57.1/24 دارد. client برابر 192.168.56.20 و backend برابر 192.168.57.20 است. نام‌های enp0s8 و enp0s9 را با کارت‌های واقعی خودت جایگزین کن. backend می‌تواند Clone ماشین mac باشد، ولی در این جلسه نقش دیگری دارد.

قبل از NAT، روی client مسیر 192.168.57.0/24 از طریق 192.168.56.10 و روی backend مسیر 192.168.56.0/24 از طریق 192.168.57.1 تعریف کن. این مسیرهای آزمایشی را با ip route add و آدرس‌های همین شبکهٔ ایزوله اضافه کن. روتر باید forwarding و rule عبور مناسب داشته باشد.

sysctl net.ipv4.ip_forward
sudo iptables-save > ~/lpic303/router.before
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -A FORWARD -i enp0s8 -o enp0s9 \
  -s 192.168.56.0/24 -d 192.168.57.0/24 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i enp0s9 -o enp0s8 \
  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

این فرمان‌ها روی Clone با chain فاقد drop زودتر اجرا می‌شوند؛ -A پس از drop موجود مؤثر نخواهد بود. از client، backend را ping کن؛ مسیر برگشت باید قبل از ترجمه کار کند. مقدار پیشین forwarding را برای برگشت ثبت کن.

ترجمه را با capture ببین#

sudo iptables -t nat -A POSTROUTING -o enp0s9 \
  -s 192.168.56.0/24 -d 192.168.57.0/24 \
  -j SNAT --to-source 192.168.57.1
sudo conntrack -L
sudo iptables -t nat -nvL

در اتصال تازه، backend باید مبدأ ترجمه‌شده را ببیند. جدول nat معمولاً روی بستهٔ نخست جریان تصمیم می‌گیرد؛ conntrack نگاشت را برای ادامه نگه می‌دارد. تغییر rule، اتصال موجود را الزاماً تغییر نمی‌دهد. SNAT آدرس مشخص می‌دهد؛ MASQUERADE برای برخی رابط‌های دارای آدرس متغیر مفید است.

DNAT مقصد را تغییر می‌دهد. اگر backend روی TCP/80 سرویس آماده دارد، می‌توانی TCP/8080 ورودی کارت اول را به 192.168.57.20:80 ترجمه کنی؛ rule در PREROUTING nat و مجوز عبور در FORWARD هر دو لازم‌اند. برای آزمون از خود روتر، مسیر OUTPUT متفاوت است؛ آن را با آزمون client اشتباه نگیر. DMZ هم یک معماری تفکیک دسترسی است، نه نام دیگری برای یک rule NAT.

مجموعهٔ آدرس به‌جای تکرار صد rule#

sudo ipset create lpic303_clients hash:ip
sudo ipset add lpic303_clients 192.168.56.20
sudo ipset list lpic303_clients

می‌توان از -m set --match-set lpic303_clients src در rule استفاده کرد. اگر می‌خواهی deny پیش‌فرض باشد، rule عمومی قبلی را هم بازبینی کن؛ ساخت set به‌تنهایی دسترسی را محدود نمی‌کند. خانوادهٔ آدرس set باید با IPv4 یا IPv6 سازگار باشد.

ebtables به فیلتر لایهٔ bridge مربوط است؛ conntrackd برای کاربردهای همگام‌سازی وضعیت اتصال در طرح‌های افزونگی مطرح می‌شود. داشتن دو روتر بدون هماهنگی state لزوماً session را حفظ نمی‌کند.

پایان: ruleهای فایروال را از router.before restore و forwarding و routeهای افزوده‌شده را به وضعیت ثبت‌شده برگردان. set بدون reference را حذف کن. مأموریت: با دو capture، مبدأ قبل و بعد SNAT را ثابت کن. منابع: conntrack-tools و ipset .