Firewalls - جدران الحماية — أمن الشبكات
Firewalls - جدران الحماية
ما هو Firewall؟
حاجز يراقب ويتحكم في حركة البيانات الداخلة والخارجة.
كيف يعمل؟
يفحص الحزم (packets) بناءً على قواعد محددة:
- Allow: السماح
- Deny: الرفض
- Drop: رفض بصمت
أنواع Firewalls
1. Packet Filtering
- يفحص headers فقط (IP, Port)
- سريع لكن بسيط
- مثال: iptables
2. Stateful Inspection
- يتتبع حالة الاتصالات
- أذكى وأكثر أماناً
3. Application Layer (WAF)
- يفحص محتوى البيانات
- يحمي من SQL Injection, XSS
- مثال: ModSecurity
4. Next-Generation Firewall (NGFW)
- يجمع كل شيء
- Deep Packet Inspection
- IDS/IPS مدمج
قواعد Firewall الأساسية
Default Deny
رفض كل شيء إلا المسموح صراحةً.
# المبدأ
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPTأمثلة على القواعد
- السماح لـ HTTP/HTTPS
- رفض Telnet (غير آمن)
- السماح لـ SSH من IPs محددة
- رفض كل الدخول على MySQL من خارج الشبكة
Hardware vs Software Firewall
| Hardware | Software |
|----------|----------|
| جهاز منفصل | برنامج على الجهاز |
| أسرع | أرخص |
| للشبكات | للأفراد |
| مثال: Cisco ASA | مثال: Windows Firewall |
# أمثلة على قواعد Firewall باستخدام iptables (Linux)
# ===== قواعد أساسية =====
# 1. رفض كل شيء افتراضياً (Default Deny)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 2. السماح للـ loopback (127.0.0.1)
sudo iptables -A INPUT -i lo -j ACCEPT
# 3. السماح للاتصالات الحالية
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ===== السماح لخدمات محددة =====
# السماح لـ SSH (منفذ 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# السماح لـ HTTP و HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# السماح لـ DNS
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
# ===== قواعد متقدمة =====
# السماح لـ SSH من IP محدد فقط
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
# رفض MySQL من خارج الشبكة المحلية
sudo iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.0/24 -j DROP
# منع Ping Flooding
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit \
--limit 1/second --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# منع Port Scanning
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# ===== عرض القواعد =====
# sudo iptables -L -v -n
# ===== حفظ القواعد =====
# sudo iptables-save > /etc/iptables/rules.v4
# ===== Python: محاكاة Firewall بسيط =====
class SimpleFirewall:
"""
محاكاة بسيطة لـ Firewall
"""
def __init__(self):
self.rules = []
self.default_action = 'DROP'
def add_rule(self, protocol, port, action, source_ip=None):
"""إضافة قاعدة"""
rule = {
'protocol': protocol,
'port': port,
'action': action,
'source_ip': source_ip
}
self.rules.append(rule)
def check_packet(self, protocol, port, source_ip):
"""فحص حزمة بيانات"""
for rule in self.rules:
# تطابق البروتوكول والمنفذ
if (rule['protocol'] == protocol and
rule['port'] == port):
# تطابق IP إذا كان محدداً
if rule['source_ip'] is None or rule['source_ip'] == source_ip:
return rule['action']
# القاعدة الافتراضية
return self.default_action
# إنشاء firewall
fw = SimpleFirewall()
# إضافة قواعد
fw.add_rule('TCP', 80, 'ALLOW') # السماح لـ HTTP
fw.add_rule('TCP', 443, 'ALLOW') # السماح لـ HTTPS
fw.add_rule('TCP', 22, 'ALLOW', '192.168.1.100') # SSH من IP محدد
fw.add_rule('TCP', 3306, 'DROP') # رفض MySQL
# اختبار
packets = [
('TCP', 80, '8.8.8.8'),
('TCP', 22, '192.168.1.100'),
('TCP', 22, '1.2.3.4'),
('TCP', 3306, '192.168.1.50'),
]
for proto, port, ip in packets:
action = fw.check_packet(proto, port, ip)
print(f"{action}: {proto}:{port} from {ip}")اختبر فهمك