Policy و NAT در فورتی گیت: VIP، IP Pool و port forwarding
policy فورتی گیت چطور match میشود؛ ترتیب و implicit deny، آبجکتها، SNAT با IP pool، Central SNAT، port forwarding با VIP، hairpin NAT و بررسی با debug flow.
در این صفحه
فورتی گیت هر ارتباط جدید را با 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
endarp-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 است جور نمیشود. دو راه دارید:
- DNS داخلی (split DNS): نام سرور در DNS داخلی به IP داخلی
192.168.20.10اشاره کند. سادهترین راه است و NAT اضافه نمیخواهد. - 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 را مرور کنید.
منابع
- FortiOS 7.6.0 Best Practices fortinetweb.s3.amazonaws.com
- FortiOS 7.6.7 CLI Reference fortinetweb.s3.amazonaws.com
- FortiOS 7.6.7 Release Notes fortinetweb.s3.amazonaws.com
- FortiOS 8.0.0 Release Notes fortinetweb.s3.amazonaws.com
- FortiOS 7.6 Troubleshooting Cheat Sheet fortinetweb.s3.amazonaws.com
- Fortinet Community — Technical Tip: Firewall policy views community.fortinet.com
- Fortinet Community — Technical Tip: Using the CLI to change the order of the IPV4 policy list community.fortinet.com
- Fortinet Community — Technical Tip: Firewall policy lookups community.fortinet.com
- Fortinet Community — Technical Tip: How to configure SNAT with IP pool community.fortinet.com
- Fortinet Community — Technical Tip: Enabling and Configuring Central SNAT on the FortiGate community.fortinet.com
- Fortinet Community — Technical Tip: Configure firewall policies for a VIP when Central NAT is enabled community.fortinet.com
- Fortinet Community — Technical Tip: Virtual IP (VIP) port forwarding configuration community.fortinet.com
- Fortinet Community — Technical Tip: Troubleshooting VIP (port forwarding) community.fortinet.com
- Fortinet Community — Technical Tip: How to access VIP from LAN machine with a hairpin NAT through the GUI community.fortinet.com
- Fortinet Community — Troubleshooting Tip: FortiGate session table information community.fortinet.com