
Iptables Essentials: قواعد وأوامر جدار الحماية الشائعة
:small_orange_diamond: Shorewall - أداة متقدمة لتكوين البوابة/جدار الحماية لنظام GNU/Linux.
:small_orange_diamond: Firewalld - توفر جدار حماية يُدار ديناميكيًا.
:small_orange_diamond: UFW - أداة تكوين جدار الحماية الافتراضية لأوبونتو.
:small_orange_diamond: FireHOL - تقدم تكوينًا بسيطًا وقويًا لجميع متطلبات جدار الحماية وتشكيل حركة المرور في Linux.
:small_orange_diamond: أفضل الممارسات: iptables - بقلم Major Hayden
:small_orange_diamond: دليل متعمق لـ Iptables، جدار الحماية Linux
:small_orange_diamond: الميزات المتقدمة لـ netfilter/iptables
:small_orange_diamond: جدران الحماية Linux باستخدام iptables
:small_orange_diamond: تصحيح أخطاء iptables والمزالق الشائعة لجدار الحماية؟
:small_orange_diamond: دليل اختراق Netfilter HOWTO
:small_orange_diamond: تحديد المعدل لكل عنوان IP باستخدام iptables
تعطيل التثليث في التوجيه. الرد على الاستعلامات عبر نفس الواجهة، وليس أخرى. كما تحمي من انتحال IP.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/conf/all/rp_filter = 1 EOF
- [rp_filter وأمان لينكس LPIC-3](https://www.theurbanpenguin.com/rp_filter-and-lpic-3-linux-security/)
- [إعدادات rp_filter لنواة لينكس (تصفية المسار العكسي)](https://www.slashroot.in/linux-kernel-rpfilter-settings-reverse-path-filtering)
- [تصفية المسار العكسي](http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.rpf.html)
##### log_martians
> _تمكين تسجيل الحزم ذات عناوين IP غير صالحة._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/conf/all/log_martians = 1
EOF
تعطيل إرسال جميع حزم إعادة توجيه ICMP الخاصة بـ IPv4 على جميع الواجهات.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/conf/all/send_redirects = 0 EOF
- [تعطيل توجيه المصدر](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-server_security-disable-source-routing)
- [ما هي عمليات إعادة توجيه ICMP وهل يجب حظرها؟](https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked)
##### accept_source_route
> _تعطيل الحزم الموجهة المصدر (الحزم التي تحتوي على خيار التوجيه الصارم للمصدر (SSR) أو التوجيه غير الصارم للمصدر (LSR))._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/conf/all/accept_source_route = 0
EOF
تعطيل قبول إعادة التوجيه ICMP.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/conf/all/accept_redirects = 0 EOF
- [ما هي إعادة توجيه ICMP وهل يجب حظرها؟](https://askubuntu.com/questions/118273/what-are-icmp-redirects-and-should-they-be-blocked)
- [يجب على نظام التشغيل Red Hat Enterprise Linux تجاهل رسائل إعادة توجيه بروتوكول الإنترنت الإصدار 4 (IPv4) لبروتوكول رسائل التحكم بالإنترنت (ICMP).](https://www.stigviewer.com/stig/red_hat_enterprise_linux_7/2018-11-28/finding/V-73175)
##### tcp_syncookies
> _قم بتشغيل حماية فيضان SYN (الحماية من هجمات حرمان الخدمة (DOS))._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/tcp_syncookies = 1
EOF
تعطيل الاستجابة لطلبات ping الموجهة للبث.```bash cat << EOF >> /etc/sysctl.d/40-custom.conf net/ipv4/icmp_echo_ignore_broadcasts = 1 EOF
- [ما فائدة البث ICMP؟](https://superuser.com/questions/306065/what-is-icmp-broadcast-good-for)
- [يجب ألا يستجيب النظام لـ ICMPv4 المرسلة إلى عنوان بث.](https://www.stigviewer.com/stig/red_hat_enterprise_linux_6/2018-11-28/finding/V-38535)
##### ip_forward
> _تمكين توجيه IP. مطلوب إذا كان جدار الحماية الخاص بك يحمي شبكة، بما في ذلك NAT._```bash
cat << EOF >> /etc/sysctl.d/40-custom.conf
net/ipv4/ip_forward = 1
EOF
netfilter-persistent save
###### قائم على RedHat```bash
service iptables save
iptables -n -L -v
#### قائمة بجميع قواعد iptables النشطة مع الأسطر المرقمة والمفصّلة```bash
iptables -n -L -v --line-numbers
iptables -S
#### قائمة القواعد كجداول لسلسلة INPUT```bash
iptables -L INPUT
iptables -S INPUT
#### عرض عدد الحزم والحجم الإجمالي```bash
iptables -L INPUT -v
iptables -L INPUT -n -v iptables -L OUTPUT -n -v --line-numbers
#### حذف القاعدة حسب السلسلة والرقم```bash
iptables -D INPUT 10
iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
#### مسح جميع القواعد، وحذف جميع السلاسل، وقبول الكل```bash
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
iptables -F
#### مسح سلسلة واحدة```bash
iptables -F INPUT
iptables -I INPUT 2 -s 202.54.1.2 -j DROP
#### السماح باتصالات الحلقة المحلية```bash
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
#### السماح بالاتصالات الصادرة المُنشأة```bash
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
#### إسقاط الحزم غير الصالحة```bash
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -s 192.168.252.10 -j DROP
#### الحظر وعنوان IP والرفض```bash
iptables -A INPUT -s 192.168.252.10 -j REJECT
iptables -A INPUT -i eth0 -s 192.168.252.10 -j DROP
#### السماح بجميع اتصالات SSH الواردة```bash
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح بخروج SSH```bash
iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 873 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 873 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح بجميع طلبات HTTP الواردة```bash
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح بكل HTTP و HTTPS الواردة```bash
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح لـ MySQL بالوصول إلى واجهة شبكة محددة```bash
iptables -A INPUT -i eth1 -p tcp --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح لـ PostgreSQL بواجهة شبكة محددة```bash
iptables -A INPUT -i eth1 -p tcp --dport 5432 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j REJECT
#### السماح بكل SMTP الوارد```bash
iptables -A INPUT -p tcp --dport 25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 25 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 143 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح بكل IMAPS الواردة```bash
iptables -A INPUT -p tcp --dport 993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 993 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 110 -m conntrack --ctstate ESTABLISHED -j ACCEPT
#### السماح بجميع اتصالات POP3S الواردة```bash
iptables -A INPUT -p tcp --dport 995 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 995 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
#### إسقاط كل الاتصالات الصادرة إلى شبكات فيسبوك
الحصول على AS فيسبوك:```bash
whois -h v4.whois.cymru.com " -v $(host facebook.com | grep "has address" | cut -d " " -f4)" | tail -n1 | awk '{print $1}'
إسقاط:```bash for i in $(whois -h whois.radb.net -- '-i origin AS32934' | grep "^route:" | cut -d ":" -f2 | sed -e 's/^[ \t]*//' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | cut -d ":" -f2 | sed 's/$/;/') ; do
iptables -A OUTPUT -s "$i" -j REJECT
done
#### تسجيل وإسقاط الحزم```bash
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
بشكل افتراضي، يتم تسجيل كل شيء في ملف /var/log/messages:```bash
tail -f /var/log/messages
grep --color 'IP SPOOF' /var/log/messages
#### تسجيل وإسقاط الحزم بعدد محدود من إدخالات السجل```bash
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
#### حظر أو السماح ICMP Ping Request```bash
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT
#### موازنة التحميل باستخدام `random*` أو `nth*````bash
_ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")
for ip in "${_ips[@]}" ; do
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \
-j DNAT --to-destination ${ip}:80
done
أو```bash _ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")
for ip in "${_ips[@]}" ; do
iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25
-j DNAT --to-destination ${ip}:80
done
#### تقييد عدد الاتصالات باستخدام `limit` و `iplimit*````bash
iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
-m limit --limit 20/hour --limit-burst 5 -j ACCEPT
أو```bash iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP
#### صيانة قائمة بالاتصالات الحديثة للمطابقة ضدها```bash
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 100 -j DROP
iptables -A FORWARD -p tcp -i eth0 --dport 443 -m recent --name portscan --set -j DROP
string* في حمولة بيانات الحزمة```bashiptables -A FORWARD -m string --string '.com' -j DROP iptables -A FORWARD -m string --string '.exe' -j DROP
#### قواعد زمنية مع `time*````bash
iptables -A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
-m time --timestart 21:30 --timestop 22:30 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT
iptables -A INPUT -s 1.2.3.4 -m ttl --ttl-lt 40 -j REJECT
#### الحماية من فحص المنافذ```bash
iptables -N port-scanning
iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
iptables -A port-scanning -j DROP
iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
#### حماية من Syn-flood```bash
iptables -N syn_flood
iptables -A INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460 iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
#### حظر الحزم الجديدة التي ليست SYN```bash
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
أو```bash iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
#### التحقق من حزم التجزئة القسرية```bash
iptables -A INPUT -f -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
#### تجاهل جميع الحزم الخالية```bash
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
#### حظر الحزم ذات أعلام TCP المزيفة```bash
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
_subnets=("224.0.0.0/3" "169.254.0.0/16" "172.16.0.0/12" "192.0.2.0/24" "192.168.0.0/16" "10.0.0.0/8" "0.0.0.0/8" "240.0.0.0/5")
for _sub in "${_subnets[@]}" ; do iptables -t mangle -A PREROUTING -s "$_sub" -j DROP done iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
## أمثلة متقدمة للتكوين
### معالجة الحزم في بايثون باستخدام هدف NFQUEUE
> _يقوم هذا الهدف بتمرير الحزمة إلى مساحة المستخدم باستخدام معالج nfnetlink_queue. توضع الحزمة في قائمة الانتظار المحددة برقم القائمة ذي 16 بت. يمكن لمساحة المستخدم فحص الحزمة وتعديلها إذا رغبت. يجب على مساحة المستخدم بعد ذلك إسقاط الحزمة أو إعادة حقنها في النواة._
#### ACCEPT جميع الحزم من مصدر محدد على (filter:INPUT) و DROP كل شيء آخر
> _تقوم هذه القاعدة بتوجيه جميع حزم filter:INPUT إلى قائمة الانتظار 1 باستخدام هدف NFQUEUE._```bash
iptables -A INPUT -j NFQUEUE --queue-num 1
نص برمجي للارتباط بـ netfilter queue 1 ومعالجة الحزم.```python #!/usr/bin/python3
from netfilterqueue import NetfilterQueue from scapy.all import *
def packetanalyzer(pkt): ip=IP(pkt.get_payload()) if(ip.src=="192.168.122.1"): print(f"New packet from {ip.src}") pkt.accept() else: pkt.drop()
nfqueue=NetfilterQueue() nfqueue.bind(1, packetanalyzer) nfqueue.run()
#### اكتب نص برمجي خاص بالطرق على المنافذ لتأمين الوصول عبر SSH
> _قم بإسقاط جميع طلبات SSH وأرسل طلبات المنافذ السرية إلى مساحة المستخدم باستخدام هدف NFQUEUE._```bash
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
iptables -t raw -I PREROUTING -p tcp --sport 65534 --dport 65535 -j NFQUEUE --queue-num 1
_يقوم هذا البرنامج النصي بالتقاط الحزم من netfilter queue 1 والتحقق من SOURCEPORT و SECRETPORT من أجل port knocking ويسمح للمصدر بالاتصال بـ ssh لمدة EXPIRETIME، الافتراضي هو 30 دقيقة.```python #!/usr/bin/python3
from os import system from netfilterqueue import NetfilterQueue from scapy.layers.inet import IP from time import time
SOURCEPORT=65534 SECRETPORT=65535 EXPIRETIME=30 ALLOWED={}
def portknocking(pkt): packet=IP(pkt.get_payload()) currtime=time() for item in list(ALLOWED): if(currtime-ALLOWED[item] >= EXPIRETIME*60): del ALLOWED[item] if(packet.sport==SOURCEPORT and packet.dport==SECRETPORT and packet.src not in ALLOWED): print(f"Port {packet.dport} knocked by {packet.src}:{packet.sport}") system(f"iptables -I INPUT -p tcp --dport 22 -s {packet.src} -j ACCEPT") system(f"echo 'iptables -D INPUT -p tcp --dport 22 -s {packet.src} -j ACCEPT' | at now + {EXPIRETIME} minutes") ALLOWED[packet.src]=time() pkt.drop()
nfqueue=NetfilterQueue() nfqueue.bind(1, portknocking)
try: nfqueue.run() except KeyboardInterrupt: print("\nExit with Keyboard Interrupt")
> _لطرق المنفذ والسماح باتصالات ssh من جهاز الكمبيوتر الخاص بك، ما عليك سوى تنفيذ هذا الأمر:_```bash
nc -p 65534 SERVER 65535