Introduction to PF Firewall

0

שלום לכולם,

במאמר זה אדבר על ה- 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 וירטואלי, ואז יוצרים משתנה שכולל גם את הכרטיס רשת הפיזי וגם את הוירטואלי.

לדוגמא:

Capture

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

נראה כך:

'{ 24\network_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.22
block 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  all
block out all

דוגמא של pf.conf:

avimit.p

pf_img


שתף

אודות מחבר


שינוי גודל גופנים
ניגודיות