pf هو محرّك تصفية الحزم في عائلة BSD — نفس الاسم على FreeBSD و OpenBSD، نفس الصياغة (تقريبًا)، وأنظف لغة جدار حماية على أي نظام تشغيل.
المتطلبات المسبقة
- FreeBSD 13/14 أو OpenBSD 7.x مع وصول root.
- جلسة SSH ثانية مفتوحة.
الخطوة 1: تمكين pf
FreeBSD — أضف إلى /etc/rc.conf:
pf_enable="YES"
pflog_enable="YES"
pf_rules="/etc/pf.conf"
الخطوة 2: اكتب /etc/pf.conf
ext_if = "vtnet0"
table <admin> const { 203.0.113.0/24 }
table <bruteforce> persist
set skip on lo
set block-policy drop
set loginterface $ext_if
antispoof quick for $ext_if
scrub in all
block in log all
pass out all keep state
pass in inet proto icmp icmp-type echoreq
pass in on $ext_if proto tcp from <admin> to ($ext_if) port 22 \
flags S/SA keep state \
(max-src-conn 5, max-src-conn-rate 5/30, overload <bruteforce> flush global)
pass in on $ext_if proto tcp to ($ext_if) port { 80 443 } \
flags S/SA keep state
block quick from <bruteforce>
الخطوة 3: اختبر الصياغة وحمّل
sudo pfctl -nf /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo service pf reload
الخطوة 4: الفحص
sudo pfctl -s rules
sudo pfctl -s states
sudo pfctl -s info
sudo pfctl -t bruteforce -T show
sudo tcpdump -n -i pflog0
الخطوة 5: NAT و port forward
int_if = "vtnet1"
nat on $ext_if inet from ($int_if:network) to any -> ($ext_if)
rdr pass on $ext_if proto tcp from any to ($ext_if) port 8443 \
-> 10.0.10.50 port 443
الخطوة 6: تنظيف الحظر والمراقبة
sudo pfctl -t bruteforce -T expire 3600
sudo pfctl -t bruteforce -T flush
watch -n 2 'sudo pfctl -s info | head -20'
التحقق
nmap -Pn -p 22,80,443 your.host.sa
الخاتمة
صياغة pf هي الأكثر قابلية للقراءة بين أي جدران حماية. ضعها في git، انشرها عبر Ansible، ولا تعدل أبدًا دون pfctl -nf أولاً.
Comments
0 total · 0 threads