
آموزش ساخت فایروال با پایتون + تحلیل ترافیک و بلاک IPهای مشکوک
در دنیای امروز که بیشتر ارتباطات دیجیتال شدن، هر دستگاهی که به اینترنت وصله چه لپتاپ، چه سرور، چه حتی یخچال هوشمند در معرض تهدیدهای سایبریه.
از حملات ساده مثل پورت اسکن که فقط دنبال باز بودن درگاهها برای نفوذ هستن، گرفته تا حملات پیچیدهتری مثل DDoS که با حجم زیادی از ترافیک جعلی، یک سرویس رو فلج میکنن.
علاوه بر این، حملاتی مثل تزریق کد مخرب (Code Injection) میتونن باعث دسترسی کامل مهاجم به سیستم یا اطلاعات حساس بشن، که میتونه فاجعهبار باشه.
حتی اگر سیستم ما اطلاعات خاصی نگه نمیداره، میتونه به عنوان سکوی پرتاب برای حمله به سیستمهای دیگه استفاده بشه.
به همین دلیله که درک مفاهیم امنیت شبکه و ساخت ابزارهایی مثل فایروال شخصی، حتی در سطح ساده، میتونه قدم مهمی باشه در جهت ایمن نگهداشتن خودمون و دیگران در فضای دیجیتال.
فایروال چیه؟
فایروال (Firewall) مثل یه نگهبان در ورودی شبکه عمل میکنه.
وظیفهش اینه که بستههای اطلاعاتی (پکتها) رو بررسی کنه و اجازه بده یا نده وارد سیستم بشن، بر اساس یه سری قانون از پیش تعیینشده.
چرا بخوایم خودمون با پایتون یه فایروال بسازیم؟
📚 یادگیری عمیقتر امنیت شبکه
وقتی خودت پکتها رو تحلیل میکنی، بهتر میفهمی که حملات چطوری کار میکنن.
🌀 انعطافپذیری
میتونی بر اساس نیازهای خاص خودت رفتار فایروال رو تنظیم کنی. مثلاً بلاک کردن آیپیهایی که زیاد پینگ میفرستن.
🎓 پروژه آموزشی یا شخصی
برای ساخت نمونه اولیه IDS/IPS ساده یا پروژه دانشگاهی عالیه.
👁️ نظارت ترافیک شبکه محلی (LAN)
میتونی ترافیک ورودی رو زیر نظر بگیری و لاگبرداری کنی.
⚠️ نکته مهم : فایروالی که با پایتون میسازیم، جایگزین فایروالهای صنعتی نیست فایروال پایتونی برای یادگیری، تحلیل ترافیک، نمونه اولیه یا کارهای سبک محلی عالیه، ولی برای محیطهای پرمصرف، حساس یا تجاری توصیه نمیشه.
پیشنیازهای ساخت فایروال با پایتون
- آشنایی با پایتون
- آشنایی با مفاهیم شبکه
طراحی و برنامهنویسی فایروال ساده با پایتون
در ادامه یک راهنمای کاملاً مفهومی و مرحلهبهمرحله برای ساخت یک فایروال ساده با پایتون آورده شده.
در هر مرحله توضیحات متنیِ گامبهگام وجود دارد و درون کد هیچ کامنتی درج نشده است.
مرحله صفر : مفهوم بسته (packet)
وقتی اطلاعاتی توی اینترنت یا شبکه رد و بدل میشن (مثلاً باز کردن یه سایت یا ارسال یه پیام)، اون اطلاعات به تکههای کوچیک تقسیم میشن به اسم بسته یا همون Packet.
آدرس مبدأ و مقصد یعنی چی؟
فرض کن داری با گوشیت یه سایت رو باز میکنی :
- آدرس مبدأ : آدرس IP گوشی توئه
- آدرس مقصد : آدرس IP سرور سایت
به زبان ساده، بستهها مانند قطعات یک پازل هستند.
وقتی دادهای فرستاده میشود، به چند بستهی کوچکتر تقسیم میشود.
این بستهها به مقصد میرسند و آنجا دوباره کنار هم چیده میشوند تا دادهی کامل بازسازی شود.
سپس پاسخ هم به همین شکل، تکهتکه فرستاده شده و در مبدأ دوباره کامل میشود.
1. آماده سازی محیط
برای شروع باید پایتون نصب باشد و کتابخانه Scapy را بهعنوان موتور شنود و تحلیل بستههای شبکه نصب کنید.
pip install scapy
Scapy امکان ساخت، ارسال و دریافت بستههای شبکه را در اختیار میگذارد.
2. شنود ترافیک شبکه
در این مرحله کدی مینویسیم که تمام بستههای عبوری از کارت شبکه را دریافت کند.
سپس آدرس مبدأ و مقصد هر بسته را چاپ میکنیم تا مطمئن شویم شنود درست کار میکند.
from scapy.all import sniff, IPdef packet_callback(packet):if IP in packet:src = packet[IP].srcdst = packet[IP].dstprint(f"{src} -> {dst}")sniff(prn=packet_callback, store=0)
- src : ادرس ip شما
- dst : آدرس ip سایت مقصد
3. شمارش و تحلیل رفتار IP ها
برای شناسایی IPهای مشکوک، باید تعداد بستههای ارسالی از هر آدرس را در یک بازه زمانی مشخص بشمریم.
در این مثال، هر ده ثانیه یکبار شمارندهها صفر میشوند و IPهایی که بیش از صد بسته ارسال کردهاند تشخیص داده میشوند.
from collections import defaultdictimport timefrom scapy.all import sniff, IPpacket_counts = defaultdict(int)interval = 10threshold = 100start = time.time()def analyze(packet):if IP in packet:src = packet[IP].srcpacket_counts[src] += 1if time.time() - start > interval:for ip, count in packet_counts.items():if count > threshold:print(f"[!] Suspicious: {ip} ({count})")block(ip)packet_counts.clear()global startstart = time.time()sniff(prn=analyze, store=0)
4. بلاک کردن IPهای مشکوک
حالا باید طوری عمل کنیم که بستههای بعدی از IP مشکوک به سیستم نرسند. در لینوکس از iptables استفاده میکنیم.
import osdef block(ip):os.system(f"sudo iptables -A INPUT -s {ip} -j DROP")
- iptables : ابزار مدیریت فایروال در لینوکس
- A INPUT- : اضافه کردن قانون به زنجیرهی INPUT (ترافیکی که وارد سیستم میشه)
- s {ip}- : مشخص میکنه این قانون برای IP مبدأ اعمال بشه
- j DROP- : به ترافیک دستور میده بیصدا حذفش کن، هیچ جوابی هم نده
5. لاگبرداری و مدیریت لیست بلاک
برای پیگیری تاریخ و زمان بلاکشدن هر IP و امکان سفیدسازی (Whitelist) یا حذف از لیست بلاک، میتوانیم آنها را در یک فایل ساده ذخیره کنیم.
import datetimeblocked_file = "blocked_ips.log"def log_block(ip):timestamp = datetime.datetime.now().isoformat()with open(blocked_file, "a") as f:f.write(f"{timestamp} {ip}")
تابع block را طوری تغییر دهید که پس از بلاک کردن، log_block را فراخوانی کند.
6. اجرای همزمان شنود و بلاک
برای بهبود عملکرد و جداسازی مسئولیتها، از دو thread استفاده میکنیم: یکی وظیفهی دریافت بستهها را دارد و دیگری پردازش و بلاک کردن.
import threadingfrom queue import Queueimport timequeue = Queue()def producer():sniff(prn=lambda pkt: queue.put(pkt), store=0)def consumer():while True:pkt = queue.get()analyze(pkt)threading.Thread(target=producer, daemon=True).start()threading.Thread(target=consumer, daemon=True).start()while True:time.sleep(1)
هدف کلی این کد
- بستههای شبکه (Packets) رو به صورت لحظهای دریافت کنه
- اون بستهها رو یکییکی تحلیل کنه (با تابع analyze)
- و همهی اینها رو به صورت همزمان و بدون هنگ کردن سیستم انجام بده
جمعبندی و ادامه مسیر
این آموزش برای درک بهتر مفاهیم امنیت شبکه، تحلیل ترافیک، و کنترل ارتباطات مشکوک طراحی شده بود.
شما نهتنها یاد گرفتید چطور با پایتون یک فایروال ساده بسازید، بلکه با مفاهیمی مثل packet sniffing، شمارش رفتار IPها و بلاک کردن خودکار مهاجمان نیز آشنا شدید.
اما این تنها شروع کاره!
حالا که ابزارهای پایهای رو ساختید و فهمیدید بستههای شبکه چطور کار میکنن، با استفاده از دانش برنامهنویسیتون میتونید مسیر یادگیریتون رو با انجام پروژههای زیر گسترش بدید:
- ذخیرهسازی پیشرفته : استفاده از پایگاه داده برای پیگیری طولانی مدت
- هشدار بیدرنگ : دریافت اطلاعات ip بلاک شده از طریق تلگرام ایمیل
- بلاک موقت : امکان تعریف زمان مشخص برای رفع بلاک ip