Introduction to PF Firewall

שלום לכולם,
במאמר זה אדבר על ה- Firewall מבית היוצר של OpenBSD.
מה אפשר לעשות עם ה-Firewall הזה?
ה- Packet Filtering משמש ל-Filter של פרוטוקולי TCP/UDP, תרגום של כתובות NAT. שליטה בכל תעבורת הרשת באירגון.
יש יתרונות וחסרונות, ההיתרונות הם: ניהול של פרוטוקולים כמו TCP או UDP ,ניהול של IPSEC.
לא דורש ביצועים גבוהים, בגלל העניין של מערכת ההפעלה.
החסרונות העיקריים הם:
אין AV כדוגמת Firewall אחרים כגון: Check Point, Fortigate.
אין SSL_VPN וכדומה.
לא קיים תמיכה במוצר הזה.
לא תומך בכל המרכזיות.
תחילה, אני רוצה לדבר בכללי, על איזה קבצים מבוסס ה-Firewall הזה?
נתחיל עם הקובץ המרכזי שנקרא pf.conf, בעצם כל הקונפיגורציה של ה- Firewall יושבת על הקובץ הזה.
אראה דוגמא של הקובץ הנ"ל ואיך הוא אמור להיבנות:
הנתיב של הקובץ הוא : /etc/pf.conf/
Interface Definitions – בחלק הזה, נרשום את כל ה-IP של הכרטיסי רשת.
שבדרך כלל מורכב מ- bge או em או carp
איך זה נראה?
lan_if = em0
wan_if = em1
וכן הלאה.
מה שמתואר פה בעצם, הבאנו משתנה בשם lan_if, שבעצם הוא שווה ערך ל-em0, וכאשר נבוא ונרצה לעשות חוקים, אפשר להשתמש במשתנה הזה.
CARP-  הוא נושא בפני עצמו, רק אגיד כמה מילים עליו. זהו פרוטוקול שמשמש ל- HA, כלומר, זה Interface וירטואלי, שבודק כל הזמן מול הרשת ה-LAN האם יש תקשורת איתה. (זה רק כמה מילים, ארחיב על כך בהמשך).
יש לשים לב: לכל Interface פיזי מצמידים כרטיס CARP וירטואלי, ואז יוצרים משתנה שכולל גם את הכרטיס רשת הפיזי וגם את הוירטואלי.
לדוגמא:

Misc Options-
פה בעצם יצויין כמה אופציות חשובות שמתארות את אופי ה-Firewall לדוגמא:
set ruleset-optimization basic – אופציה זו היא חשובה מכיוון שהיא נותנת לנו 3 דברים:
א' : Remove Duplicate Rules
ב' : משפר את כתיבת החוקים אוטומטית.
set optimization normal – יקבע באיזה סביבה Firewall עובד,
Normal – מציין סביבה רגילה, לעומת high-latency – שמיועד לביצועים גבוהים מאוד של ה-Firewall.
Gateways and NAT – 
כאן נרשום בעצם את כל כתובות ה-NAT, אם זה של ה-WAN ואם זה של ה-VOIP,
לדוגמא:
'gateway_012 = '192.138.1.2 (סתם כתובת IP שרשמתי)*
Host:
כאן נרשום את כל רשימת המחשבים/שרתים , שעליהם בעצם יתבסס החוקים. לדוגמא
'Fileserver = '192.168.20.1
Services:
כאן נרשום את כל הפורטים שנרצה לפתוח בפייריול, נראה כך :
{ dhcp_port = { 68 67
Tables:
כאן בעצם נרשום את כל הכתובותטווחי כתובות.
לדוגמא החלטנו שאת ה- LAN Network נשים בכתובת : 192.168.1.0
נראה כך:
'{ 24network_lan = '{ 192.168.1.0
או שאפשר לרשום באופן הבא:
} table <test_machine> const
192.168.1.2
192.168.1.1
{
בואו נפרש את זה:
לדוגמא, יש לי Server מסויים עם כמה כתובות, בעזרת ה-Table אני יכול לציין אותם.
או בעזרת האופציה הראשונה או האופציה השניה.
persist- אופציה זו נועדה למצב , כאשר בכל מקרה, יש או אין Rules שתואם לטבלה הספציפית הזו, השורה הזאת של בתוך ה-Table  תירשם בתוך ה- Kernel.
const – אם האופציה הזו לא תסומן, הפקודה של ה-pfctl שאליה משתמשים לביצוע פעולות כמו טעינת הקובץ של ה- Firewall עלולה למחוק את ה-table הזה אם אין שום קישור מאחד ה-Rules אל הטבלה הספציפית הזו.
אם נרצה להכניס שורות בתוך ה- Tables , מבלי לערוך את הקובץ של ה- ipsec.conf, נצטרך להקיש את הפקודה הבאה:
pfctl -t avimit-T add 192.168.30.0.24
זה בעצם יוסיף את הקבוצה avimit עם כתובות IP שרשמתי.
כדי לראות את הקבוצה, נקיש:
pfctl -t avimit -T show  ואז נראה את כל הכתובות תחת הקבוצה avimit.
Global rules –
פה נשים את כל החוקים הכללים, לדוגמא:
pass quick proto carp – בלעדי החוק הזה, פרוטוקול ה- CARP לא יעבוד.
block in quick inet from any to 224.0.0.22block in quick inet from any to 255.255.255.255
block log quick from <blocked> to any
NAT:
פה נרשום את כל כתובות ה- NAT:
אני יראה עכשיו חוק שמתרגם את כתובות ה-LAN לכתובת החיצונית של האירגון.
סך-הכל יש לנו כמה משתנים:
כרטיס הרשת שעליו ניצור את החוק, את ה- Source של מה שנרצה לעשות לו NAT ואת ה-כתובת החיצונית שלנו. 3 בסה"כ.
אז ככה:
match out on $wan_if from <net_rfc1918> nat-to $our_nat_address
ה- match out הוא אופציה לעשות NAT החוצה, על גבי כרטיס הרשת wan_if$ מהכתובות של ה-LAN לכתובת החיצונית.
Traffic Redirection:
פה נכנס עניין הניתוב, לדוגמא איל מגיעים למצב שבו אומרים ל – Firewall איך להעביר את כל תעבורה של הרשת ה-LAN על גבי כרטיס רשת מסויים?
ככה:
(pass in quick on $lan_ifs inet proto { tcp udp icmp } from { <net_lan>  } to route-to ($wan_if $gw_isp
לאפשר פרוטוקול icmp tcp udp, מהרשת ה- LAN, ותנתב אותה אל הכתובת ה- GW  של הספק על גבי כרטיס הרשת $wan_if
FW Access : 
pass quick log inet proto tcp from <fw_users> to (self) port ssh
לאפשר גישה ל-Firewall, מהקבוצה של כתובות IP  – fw_users ב-Port SSH.
network_lan-
פה יהיה בעצם כל החוקים שקשורים לרשת ה-LAN.
pass quick inet proto icmp from <network_lan> to any
כלומר אפשרתי, גישה של פרוטוקול icmp לכל מקום – any.
חברים, כמובן שזה רק ה- Basic. קובץ ה- pf,conf מורכב מהמון חוקים.
קיימים עוד כמה קבצים מסויימים:
mygate.conf
ששם בעצם מוגדר ה-IP Address של כתובת ה- NAT.
עוד דבר, כאשר מקימים כרטיסי רשת בין אם זה כרטיס הרשת הפיזי לבין אם זה ה- carp:
יש להיכנס אל תוך תיקיית ה- etc/
וליצור קבצים בשם : hostname.em0
ובתוך רושמים את ה- IP Address של הכרטיס רשת.
נראה כך :
inet 192.138.2.2 255.255.255.0 none
לדוגמא, יצרתי בנוסף כרטיס CARP שאראה בהמשך איך עושים זאת. וארצה להכניס את השינוים לתוקף:
קיים בתוך ה- etc קובץ Script  שנקרא : netstrat.
איך מפעילים אותו?
sh netstart hostname.em0
sh- בעצם מריץ את ה-Script.
netstart- עושה מן reload להגדרות של הכרטיס רשת.
hostname.em0 זה בעצם הכרטיס הפיזי שלנו.
אני חוזר על כך, מה שנרשום בתוך ההגדרות של ה- hostname.em0 זה בעצם ההגדרות שיכנסו לתוקף.
עוד דבר, כדי לראות את כל כרטיסי הרשת, נקיש את הפרודה: ifconfig -g
יש לראות שכל הכרטיסים נמצאים ב- active. ( במאמרים היותר מתקדמים אני אראה איך לעשות Cluser בין שני Firewalls.)
דברים כלליים:
pfctl -nf "/etc/pf.conf" כדי לטעון את הקובץ יש להקיש את הפקודה הזאת.
שימו לב:
ה- n יעשה לכם בדיקה על כלל הקובץ pf.conf ויראה שהכל בסדר, אך הוא לא טוען את הקובץ!
בלי ה- n, אתם תטענו את הקובץ החדש של ה-pf.conf.
tcpdump -n -e -ttt -r /var/log/pflog  – יראה בעצם את קובץ ה- LOG של התעבורה של ה- Firewall.
במאמרים המתקדמים אראה איך לקנפג שכל ה-LOGS יעברו דרך הכרטיס רשת של ה- LOG שדרך-אגב נקרא : pflog
ifconfig -g : מראה את כל כרטיסי הרשת.
Default Deny :
block in  allblock out all
דוגמא של pf.conf:

דילוג לתוכן