امنیت و فایروال / فایروال

Policy و NAT در فورتی گیت: VIP، IP Pool و port forwarding

policy فورتی گیت چطور match می‌شود؛ ترتیب و implicit deny، آبجکت‌ها، SNAT با IP pool، Central SNAT، port forwarding با VIP، hairpin NAT و بررسی با debug flow.

نوشته‌ی تیم پیکوگاید آخرین بازبینی فنی: ۱۱ دقیقه مطالعه
در این صفحه
  1. policy چطور انتخاب می‌شود
  2. فیلدهای policy
  3. آبجکت‌ها: آدرس، گروه و سرویس
  4. Source NAT: IP اینترفیس یا IP pool
  5. Central SNAT
  6. port forwarding با VIP
  7. hairpin NAT
  8. بررسی و عیب یابی
  9. Policy match
  10. جدول session
  11. debug flow
  12. لاگ
  13. اشتباه‌های رایج
  14. قدم بعدی

فورتی گیت هر ارتباط جدید را با policyهای فایروال از بالا به پایین مقایسه می‌کند و اولین policy که اینترفیس ورودی و خروجی، مبدأ، مقصد، سرویس و schedule آن جور باشد تصمیم می‌گیرد؛ اگر هیچ policy جور نشود، ترافیک به implicit deny (policy شماره‌ی 0) می‌خورد. NAT هم بخشی از همین policyهاست: برای ترافیک خروجی nat enable آدرس مبدأ را با IP اینترفیس یا یک IP pool عوض می‌کند، و برای port forwarding یک Virtual IP (VIP) آدرس مقصد را عوض می‌کند و خودش باید مقصد policy ورودی باشد. کانفیگ پایه‌ی دستگاه در کانفیگ اولیه‌ی فورتی گیت آمده است.

policy چطور انتخاب می‌شود

  • بالا به پایین، اولین match: بعد از اولین match، policyهای بعدی بررسی نمی‌شوند. Fortinet توصیه می‌کند policyهای خاص‌تر بالاتر باشند و از all یا any فقط برای مقصد اینترنت استفاده شود.
  • implicit deny: آخر فهرست است و ID آن 0 است. آن را با یک policy «همه را قبول کن» در انتهای فهرست دور نزنید. برای لاگ کردن ترافیکی که به آن می‌خورد:
config log setting
    set fwpolicy-implicit-log enable
end
  • ID در برابر ترتیب: ID شناسه‌ی ثابت policy است و ترتیب بررسی را تعیین نمی‌کند. policy با ID 10 می‌تواند بالای policy با ID 3 باشد. در GUI با کشیدن ردیف و در CLI با move جا به جا کنید؛ ID بعد از جا به جایی عوض نمی‌شود:
config firewall policy
    move 10 before 3
end
  • نمای فهرست: در Policy & Objects → Firewall Policy، نمای Interface Pair View (پیش فرض) policyها را بر اساس جفت اینترفیس ورودی و خروجی گروه بندی می‌کند و By Sequence ترتیب واقعی بررسی را بدون گروه بندی نشان می‌دهد. تا 7.2، وجود policy با any یا چند اینترفیس GUI را به By Sequence مجبور می‌کرد؛ از 7.4 هر دو نما در دسترس است. برای پیدا کردن policy پنهان شده، By Sequence را ببینید.
  • VIP اولویت دارد: DNAT پیش از جستجوی policy انجام می‌شود. طبق Best Practices، policyهایی که VIP دارند یا در آن‌ها match-vip روشن است، بر policyهای دیگر اولویت دارند (جزئیات در بخش اشتباه‌های رایج).

فیلدهای policy

فیلد GUI CLI نکته
Name name نام یکتا؛ policy بدون استفاده نگه ندارید
Incoming / Outgoing Interface srcintf / dstintf اینترفیس یا zone مشخص، نه any
Source srcaddr، users، groups آدرس و در صورت نیاز کاربر یا گروه
Destination dstaddr برای port forwarding نام VIP
Schedule schedule معمولاً always
Service service ALL یا سرویس‌های مشخص
Action action accept یا deny
Inspection Mode inspection-mode پیش فرض flow
NAT nat، ippool، poolname پیش فرض خاموش
Security Profiles av-profile، webfilter-profile، ips-sensor، ssl-ssh-profile و … فقط profileهای لازم
Log Allowed Traffic logtraffic utm (پیش فرض، در GUI: Security Events)، all یا disable

آبجکت‌ها: آدرس، گروه و سرویس

آدرس‌ها در Policy & Objects → Addresses ساخته می‌شوند. نوع‌های رایج: ipmask (subnet یا host)، iprange، fqdn و geography (کشور). برای مرور subnet و mask، تقسیم بندی IP را ببینید.

config firewall address
    edit "LAN-192.168.10.0"
        set subnet 192.168.10.0 255.255.255.0
    next
    edit "SRV-WEB-01"
        set subnet 192.168.20.10 255.255.255.255
    next
    edit "NET-SERVERS"
        set subnet 192.168.20.0 255.255.255.0
    next
    edit "FQDN-UPDATES"
        set type fqdn
        set fqdn "updates.example.com"
    next
end
config firewall addrgrp
    edit "GRP-INTERNAL"
        set member "LAN-192.168.10.0" "NET-SERVERS"
    next
end

سرویس‌ها در Policy & Objects → Services هستند. سرویس‌های آماده مثل HTTP، HTTPS، SSH و ALL از قبل وجود دارند. در سرویس سفارشی فقط پورت مقصد را بدهید؛ محدود کردن پورت مبدأ معمولاً باعث می‌شود ترافیک با policy جور نشود.

config firewall service custom
    edit "TCP-8443"
        set tcp-portrange 8443
    next
end
config firewall service group
    edit "SVC-WEB"
        set member "HTTP" "HTTPS" "TCP-8443"
    next
end

در 8.0 می‌توانید به آدرس‌ها و policyها tag سفارشی بدهید و فهرست policyها را بر اساس tag، bytes و hit count فیلتر کنید.

Source NAT: IP اینترفیس یا IP pool

nat enable بدون pool، آدرس مبدأ را با IP اینترفیس خروجی عوض می‌کند و برای بیشتر شبکه‌ها کافی است. اگر چند IP عمومی دارید یا باید ترافیک یک گروه با IP مشخصی خارج شود، IP pool بسازید (Policy & Objects → IP Pools):

نوع رفتار کاربرد
overload (پیش فرض) چند IP داخلی پشت IP(های) pool با تغییر پورت؛ حدود 60416 پورت برای هر IP عمومی خروج یک گروه با IP مشخص
one-to-one هر IP داخلی یک IP عمومی، بدون تغییر پورت؛ به ترتیب درخواست سرویس‌هایی که به پورت مبدأ ثابت نیاز دارند
fixed-port-range بازه‌ی داخلی و خارجی تعریف می‌شود و پورت‌های هر IP عمومی بین IPهای داخلی تقسیم می‌شود نگاشت ثابت هر IP داخلی به یک بازه‌ی پورت
port-block-allocation به هر IP داخلی چند بلوک پورت داده می‌شود (block-size پیش فرض 128، num-blocks-per-user پیش فرض 8) شبکه‌های بزرگ با کاربران زیاد
config firewall ippool
    edit "POOL-203.0.113.10"
        set type overload
        set startip 203.0.113.10
        set endip 203.0.113.10
    next
end
config firewall policy
    edit 0
        set name "SERVERS-to-Internet"
        set srcintf "dmz"
        set dstintf "wan1"
        set srcaddr "NET-SERVERS"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set nat enable
        set ippool enable
        set poolname "POOL-203.0.113.10"
    next
end

arp-reply در IP pool پیش فرض روشن است، یعنی FortiGate به ARP آدرس‌های pool روی اینترفیس خروجی جواب می‌دهد. IPهای pool باید از subnet عمومی خودتان باشند یا ارائه دهنده آن‌ها را به سمت FortiGate route کرده باشد.

Central SNAT

در حالت پیش فرض NAT داخل هر policy تعریف می‌شود. با Central SNAT قوانین SNAT در جدول جداگانه‌ای (Policy & Objects → Central SNAT) نگه داشته می‌شوند و گزینه‌ی NAT از policyها حذف می‌شود. این حالت برای وقتی است که قوانین NAT زیاد و مستقل از قوانین دسترسی‌اند؛ برای شبکه‌ی کوچک و متوسط NAT داخل policy ساده‌تر است.

  • روشن کردن: System → Settings → Central SNAT، یا:
config system settings
    set central-nat enable
end
config firewall central-snat-map
    edit 1
        set srcintf "lan"
        set dstintf "wan1"
        set orig-addr "LAN-192.168.10.0"
        set dst-addr "all"
        set nat enable
    next
end
  • اگر policyها VIP دارند، Central SNAT روشن نمی‌شود (خطای Cannot enable central-nat with firewall policy using vip)؛ اول VIPها را از policyها بردارید.
  • با Central SNAT، VIPها در Policy & Objects → DNAT & Virtual IPs ساخته می‌شوند و بدون قرار گرفتن در policy اعمال می‌شوند. مقصد policy ورودی آدرس واقعی سرور است، نه VIP.

port forwarding با VIP

برای انتشار وب سرور داخلی 192.168.20.10 روی IP عمومی WAN، ابتدا VIP (Policy & Objects → Virtual IPs) و بعد policy از WAN به اینترفیس سرور بسازید:

config firewall vip
    edit "VIP-WEB-HTTPS"
        set extip 203.0.113.2
        set extintf "wan1"
        set portforward enable
        set mappedip "192.168.20.10"
        set protocol tcp
        set extport 443
        set mappedport 443
    next
end
config firewall policy
    edit 0
        set name "WAN-to-WEB"
        set srcintf "wan1"
        set dstintf "dmz"
        set srcaddr "all"
        set dstaddr "VIP-WEB-HTTPS"
        set action accept
        set schedule "always"
        set service "HTTPS"
        set logtraffic all
    next
end
  • مقصد policy خود VIP است، نه all و نه آدرس داخلی سرور (وقتی Central SNAT خاموش است).
  • NAT را روی این policy روشن نکنید. با nat enable سرور به جای IP کاربر، IP فورتی گیت را می‌بیند.
  • سرویس: policy بعد از DNAT بررسی می‌شود، پس سرویس باید mappedport را پوشش دهد. اگر extport و mappedport فرق دارند، مقاله‌ی عیب یابی VIP در Fortinet Community توصیه می‌کند هر دو پورت را در سرویس policy بگذارید.
  • extintf: باید با اینترفیس ورودی policy یکی باشد؛ در غیر این صورت VIP در GUI جزو گزینه‌های مقصد نمی‌آید. VIP روی IP اینترفیس WAN با extintf any و بدون تنظیم کامل hairpin ممکن است ترافیک را به policy 0 بیندازد.
  • gateway سرور باید FortiGate باشد؛ وگرنه جواب از مسیر دیگری برمی‌گردد و ارتباط برقرار نمی‌شود.
  • مبدأ: اگر سرویس عمومی نیست، به جای all آدرس‌های مشخص بگذارید.
  • چند VIP با یک extip: VIPها به ترتیب خودشان از بالا به پایین بررسی می‌شوند و ترتیب policyها اثری ندارد. VIP فقط وقتی فعال است که دست کم در یک policy استفاده شده باشد.

اگر از میکروتیک می‌آیید: در فایروال میکروتیک قانون dstnat و قانون filter جدا هستند. در FortiGate هم VIP فقط آدرس را عوض می‌کند و اجازه‌ی عبور را policy می‌دهد.

hairpin NAT

کاربر داخلی که آدرس عمومی سرور را باز می‌کند به FortiGate می‌رسد، ولی با policy بالا که ورودی‌اش wan1 است جور نمی‌شود. دو راه دارید:

  1. DNS داخلی (split DNS): نام سرور در DNS داخلی به IP داخلی 192.168.20.10 اشاره کند. ساده‌ترین راه است و NAT اضافه نمی‌خواهد.
  2. VIP برای کاربران داخلی: extintf در VIP را any کنید و یک policy از اینترفیس کاربر به اینترفیس سرور با مقصد همان VIP بسازید:
config firewall vip
    edit "VIP-WEB-HTTPS"
        set extintf "any"
    next
end
config firewall policy
    edit 0
        set name "LAN-to-WEB-hairpin"
        set srcintf "lan"
        set dstintf "dmz"
        set srcaddr "LAN-192.168.10.0"
        set dstaddr "VIP-WEB-HTTPS"
        set action accept
        set schedule "always"
        set service "HTTPS"
    next
end

اگر کاربر و سرور در یک subnet و پشت یک اینترفیس هستند، dstintf هم همان lan است و باید روی این policy nat enable بگذارید؛ در غیر این صورت سرور جواب را مستقیم به کاربر می‌فرستد و ارتباط برقرار نمی‌شود.

بررسی و عیب یابی

Policy match

از 7.4.1 ابزار Policy Lookup جای خود را به Policy match داده است: در Policy & Objects → Firewall Policy دکمه‌ی Policy match را بزنید، مشخصات ترافیک را وارد کنید و Find matching policy را بزنید. معادل CLI:

diagnose firewall iprope lookup 192.168.10.50 50000 198.51.100.10 443 tcp lan

خروجی به شکل matches policy id: 5 است. matches policy id: 0 یعنی implicit deny. این دستور برای policyهای دارای احراز هویت کاربر نتیجه‌ی دقیق نمی‌دهد.

جدول session

diagnose sys session filter clear
diagnose sys session filter dst 192.168.20.10
diagnose sys session filter dport 443
diagnose sys session list

در خروجی، policy_id شماره‌ی policy است. خط hook=pre dir=org act=dnat نشان می‌دهد VIP آدرس مقصد را عوض کرده و خط hook=post dir=org act=snat نشان می‌دهد SNAT انجام شده است. قالب هر خط <src_ip>:<src_port>-><dst_ip>:<dst_port>(<nat_ip>:<nat_port>) است.

debug flow

debug flow مسیر یک بسته را در FortiOS قدم به قدم نشان می‌دهد: route، DNAT، policy انتخاب شده و دلیل رد شدن.

diagnose debug reset
diagnose debug flow filter clear
diagnose debug flow filter addr 198.51.100.25
diagnose debug flow filter dport 443
diagnose debug flow show function-name enable
diagnose debug console timestamp enable
diagnose debug flow trace start 20
diagnose debug enable

ارتباط را از کلاینت تکرار کنید، بعد debug را متوقف کنید:

diagnose debug disable
diagnose debug reset

پیام Denied by forward policy check (policy 0) یعنی هیچ policy جور نشده است؛ علت معمولاً اینترفیس، آدرس، سرویس یا schedule اشتباه است. همین ابزار در GUI در Network → Diagnostics، تب Debug Flow هم هست و خروجی را به صورت CSV ذخیره می‌کند.

لاگ

در Log & Report → Forward Traffic شماره‌ی policy و نتیجه‌ی هر ارتباط را ببینید و در Log & Report → Security Events ارتباط‌هایی را که security profileها بسته‌اند. برای عیب یابی، logtraffic all را موقتاً روی policy روشن کنید.

اشتباه‌های رایج

  • مقصد policy ورودی all یا IP داخلی سرور است: با Central SNAT خاموش، مقصد باید خود VIP باشد.
  • policy پنهان (shadowed): یک policy کلی‌تر بالای policy خاص همان ترافیک را می‌گیرد. در By Sequence ترتیب و ستون hit count را بررسی کنید؛ اگر شمارنده‌ی یک policy هیچ وقت بالا نمی‌رود، یا اشتباه است یا زیر policy دیگری مانده است.
  • policy deny بالای VIP کار نمی‌کند: VIP اولویت دارد. برای این که deny روی ترافیک VIP هم اثر کند، در آن set match-vip enable بگذارید؛ از 7.2.4 این گزینه در policyهای deny جدید پیش فرض روشن است و فقط در policy با action deny در دسترس است.
  • فراموش کردن NAT در policy خروجی: بسته با آدرس خصوصی به اینترنت می‌رود و جوابی برنمی گردد.
  • NAT روشن روی policy ورودی VIP: لاگ سرور همه‌ی کاربران را با IP فورتی گیت نشان می‌دهد.
  • security profile ترافیک را می‌بندد: policy درست match شده ولی Web Filter، Application Control، IPS یا SSL inspection ارتباط را قطع می‌کند. نشانه‌اش ثبت در Security Events است، نه policy 0.
  • سرویس سفارشی با پورت مبدأ: فقط پورت مقصد را در سرویس بدهید.

قدم بعدی

وقتی ترافیک داخلی و خروجی درست کار کرد، شبکه را با VLAN و policy بین segmentها جدا کنید (راهنمای VLAN) و برای درک این که هر فیلد policy روی کدام لایه اثر دارد، مدل OSI و TCP/IP را مرور کنید.

منابع

  1. FortiOS 7.6.0 Best Practices fortinetweb.s3.amazonaws.com
  2. FortiOS 7.6.7 CLI Reference fortinetweb.s3.amazonaws.com
  3. FortiOS 7.6.7 Release Notes fortinetweb.s3.amazonaws.com
  4. FortiOS 8.0.0 Release Notes fortinetweb.s3.amazonaws.com
  5. FortiOS 7.6 Troubleshooting Cheat Sheet fortinetweb.s3.amazonaws.com
  6. Fortinet Community — Technical Tip: Firewall policy views community.fortinet.com
  7. Fortinet Community — Technical Tip: Using the CLI to change the order of the IPV4 policy list community.fortinet.com
  8. Fortinet Community — Technical Tip: Firewall policy lookups community.fortinet.com
  9. Fortinet Community — Technical Tip: How to configure SNAT with IP pool community.fortinet.com
  10. Fortinet Community — Technical Tip: Enabling and Configuring Central SNAT on the FortiGate community.fortinet.com
  11. Fortinet Community — Technical Tip: Configure firewall policies for a VIP when Central NAT is enabled community.fortinet.com
  12. Fortinet Community — Technical Tip: Virtual IP (VIP) port forwarding configuration community.fortinet.com
  13. Fortinet Community — Technical Tip: Troubleshooting VIP (port forwarding) community.fortinet.com
  14. Fortinet Community — Technical Tip: How to access VIP from LAN machine with a hairpin NAT through the GUI community.fortinet.com
  15. Fortinet Community — Troubleshooting Tip: FortiGate session table information community.fortinet.com