پرش به محتوا

فایروال PF در FreeBSD

یک قانون‌نامه‌ی PF بنویسید که فقط SSH و وب را باز بگذارد، جلوی حملات brute-force را با جدول overload بگیرد و قوانین را بدون قطع ارتباط اعمال کنید.

FreeBSD 15سطح: متوسطبه‌روزرسانی: ۱۶ آبان ۱۴۰۵

۱. فعال‌سازی

shell
sysrc pf_enable="YES"
sysrc pflog_enable="YES"

۲. قانون‌نامه

shell
vi /etc/pf.conf
ext_if = "vtnet0"
admin_net = "{ 192.168.10.0/24 }"
tcp_services = "{ 80, 443 }"

table <bruteforce> persist

set skip on lo0
scrub in all

block in log all
block quick from <bruteforce>
pass out all keep state

pass in on $ext_if proto tcp from $admin_net to port 22 \
    flags S/SA keep state (max-src-conn 10, max-src-conn-rate 5/30, overload <bruteforce> flush global)
pass in on $ext_if proto tcp to port $tcp_services keep state
pass in inet proto icmp icmp-type { echoreq, unreach }

هر IP که بیش از ۵ اتصال SSH در ۳۰ ثانیه برقرار کند، به جدول bruteforce اضافه و مسدود می‌شود.

۳. بررسی و اعمال

shell
pfctl -nf /etc/pf.conf          # فقط بررسی نحوی
service pf start
pfctl -sr                       # قوانین فعال

اگر از راه دور وصل هستید، پیش از اعمال یک برگشت خودکار بگذارید تا اشتباه احتمالی دسترسی شما را برای همیشه قطع نکند:

shell
(sleep 120 && pfctl -d) &
pfctl -f /etc/pf.conf

اگر اتصال برقرار ماند، فرایند پس‌زمینه را با kill %1 متوقف کنید.

۴. مدیریت جدول مسدودها

shell
pfctl -t bruteforce -T show
pfctl -t bruteforce -T delete 203.0.113.25
pfctl -t bruteforce -T expire 86400     # حذف ورودی‌های قدیمی‌تر از یک روز

۵. مشاهده‌ی بسته‌های رد شده

shell
tcpdump -n -e -ttt -i pflog0