العودة إلى المدونة

كيفية حماية الخادم من هجمات DDoS باستخدام البروكسي: إعداد في 15 دقيقة

دليل مفصل لحماية خدمات الويب من هجمات DDoS باستخدام البروكسي: إعداد Nginx و HAProxy، توزيع الحمل وتصفيه حركة المرور الضارة.

📅٦ رمضان ١٤٤٧ هـ
```html

هجمات DDoS قادرة على شل عمل أي خدمة ويب في غضون دقائق. يقوم المهاجمون بإرسال آلاف الطلبات من عناوين IP مختلفة، مما يؤدي إلى تحميل الخادم وجعله غير متاح للمستخدمين الحقيقيين. تعتبر خوادم البروكسي واحدة من الأدوات الفعالة للحماية، حيث تسمح بتصفية الحركة الضارة، وتوزيع الحمل، وإخفاء عنوان IP الحقيقي لخادمك.

في هذا الدليل، سنستعرض كيفية إعداد البروكسي لحماية من هجمات DDoS، وما هي أنواع البروكسي التي يجب استخدامها، وكيفية بناء نظام أمان متعدد المستويات. المادة موجهة لمسؤولي النظام، ومالكي خدمات الويب، ومتخصصي DevOps.

كيف تعمل هجمات DDoS ولماذا تساعد البروكسي

DDoS (الهجوم الموزع على رفض الخدمة) هو هجوم موزع على رفض الخدمة. يستخدم المهاجم شبكة من آلاف الأجهزة المصابة التي ترسل طلبات في نفس الوقت إلى خادمك. الهدف هو استنفاد موارد الخادم (المعالج، الذاكرة، عرض النطاق الترددي) وجعله غير متاح للمستخدمين الشرعيين.

الأنواع الرئيسية من هجمات DDoS:

  • الهجمات الحجمية — تملأ عرض النطاق الترددي بكمية هائلة من الحركة (تعزيز DNS، فيضان UDP)
  • الهجمات البروتوكولية — تستغل الثغرات في بروتوكولات الشبكة (فيضان SYN، Ping of Death)
  • هجمات مستوى التطبيق — تحاكي الطلبات الشرعية لتطبيق الويب (فيضان HTTP، Slowloris)

تساعد خوادم البروكسي في الحماية من DDoS بعدة طرق:

  • إخفاء عنوان IP الحقيقي للخادم — يرى المهاجمون فقط عنوان IP للبروكسي، وليس خادمك الرئيسي
  • تصفية الحركة الضارة — يقوم البروكسي بتحليل الطلبات وحظر المشبوهة منها
  • توزيع الحمل — عدة خوادم بروكسي توزع الحركة بين خوادم backend
  • تحديد معدل الطلبات — تحديد عدد الطلبات من عنوان IP واحد
  • تخزين المحتوى الثابت — يقلل من الحمل على الخادم الرئيسي

من المهم أن نفهم أن البروكسي ليست حلاً سحريًا لجميع أنواع DDoS. يمكن أن تسد الهجمات الحجمية القوية عرض النطاق الترددي حتى بروكسي الخادم. لذلك، فإن البروكسي فعالة عند دمجها مع طرق حماية أخرى: CDN، خدمات anti-DDoS السحابية (Cloudflare، AWS Shield)، جدران الحماية.

أنواع البروكسي لحماية من DDoS: العكسي مقابل المباشر

تستخدم لحماية من DDoS نوعان رئيسيان من خوادم البروكسي:

البروكسي العكسي

يقع البروكسي العكسي أمام خادم الويب الخاص بك ويستقبل جميع الطلبات الواردة من العملاء. يتفاعل العملاء فقط مع البروكسي، دون معرفة عنوان IP الحقيقي لخادمك. هذه هي الأداة الرئيسية للحماية من DDoS.

الحلول الشائعة للبروكسي العكسي:

  • Nginx — خادم ويب سريع وخفيف مع ميزات البروكسي العكسي
  • HAProxy — موزع تحميل متخصص مع إمكانيات تصفية قوية
  • Apache mod_proxy — وحدة لـ Apache، أقل كفاءة من Nginx
  • Varnish — مسرع HTTP يركز على التخزين المؤقت

البروكسي المباشر

تستخدم البروكسي المباشرة على جانب العميل للطلبات الصادرة. في سياق الحماية من DDoS، يتم استخدامها بشكل أقل، ولكن يمكن أن تكون مفيدة لـ:

  • إخفاء عناوين IP لخوادمك عند الوصول إلى واجهات برمجة التطبيقات الخارجية
  • توزيع الحركة الصادرة عبر العديد من عناوين IP
  • تجاوز الحظر عند جمع المعلومات حول الهجمات المحتملة

لهذه المهام، تناسب البروكسي السكنية — فهي تحتوي على عناوين IP حقيقية لمستخدمين منزليين وتبدو كحركة عادية، مما يجعل اكتشافها وحظرها أكثر صعوبة.

نوع البروكسي الاستخدام لحماية من DDoS المزايا
البروكسي العكسي (Nginx، HAProxy) استقبال الحركة الواردة، التصفية، توزيع الحمل يخفي عنوان IP الحقيقي للخادم، يصفي الهجمات، يخزن المحتوى
البروكسي السكنية إخفاء البنية التحتية، مراقبة التهديدات عناوين IP حقيقية، صعبة الحظر
بروكسي مراكز البيانات طبقة حماية إضافية، معالجة سريعة سرعة عالية، تكلفة منخفضة

إعداد البروكسي العكسي على Nginx لحماية الخادم

Nginx هو واحد من أكثر الأدوات شعبية لإنشاء البروكسي العكسي. إنه يعالج الطلبات الواردة بسرعة، ويدعم تحديد معدل الطلبات، ويمكنه تصفية الحركة المشبوهة.

الإعداد الأساسي للبروكسي العكسي

قم بتثبيت Nginx على خادم منفصل سيستقبل جميع الحركة الواردة. يجب أن يكون خادم الويب الحقيقي مخفيًا خلف البروكسي ويستقبل الطلبات فقط منه.

# /etc/nginx/nginx.conf

http {
    # تحديد عدد الاتصالات من عنوان IP واحد
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    limit_conn conn_limit 10;

    # تحديد عدد الطلبات (تحديد معدل الطلبات)
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    limit_req zone=req_limit burst=20 nodelay;

    # مهلات للحماية من Slowloris
    client_body_timeout 10s;
    client_header_timeout 10s;
    keepalive_timeout 5s 5s;
    send_timeout 10s;

    upstream backend {
        # عنوان IP لخادم الويب الحقيقي الخاص بك
        server 192.168.1.100:80;
        # يمكنك إضافة عدة خوادم للتوازن
        # server 192.168.1.101:80;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            # تمرير الطلبات إلى backend
            proxy_pass http://backend;
            
            # تمرير عنوان IP الأصلي للعميل
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            
            # مهلات للبروكسي
            proxy_connect_timeout 5s;
            proxy_send_timeout 10s;
            proxy_read_timeout 10s;
        }
    }
}

حظر User-Agent المشبوهة

تستخدم العديد من هجمات DDoS الروبوتات مع User-Agent مميز. أضف قواعد لحظرها:

# حظر الروبوتات المعروفة
map $http_user_agent $bad_bot {
    default 0;
    ~*bot 1;
    ~*crawler 1;
    ~*spider 1;
    ~*scraper 1;
    "" 1; # User-Agent فارغ
}

server {
    listen 80;
    server_name example.com;

    if ($bad_bot) {
        return 403;
    }

    location / {
        proxy_pass http://backend;
    }
}

حظر جغرافي للدول غير المرغوب فيها

إذا كانت خدمتك تعمل فقط لدول معينة، يمكنك حظر الحركة من مناطق أخرى باستخدام وحدة GeoIP:

# تثبيت وحدة GeoIP
# apt-get install nginx-module-geoip

load_module modules/ngx_http_geoip_module.so;

http {
    geoip_country /usr/share/GeoIP/GeoIP.dat;

    # السماح فقط بالحركة من روسيا وأوكرانيا
    map $geoip_country_code $allowed_country {
        default no;
        RU yes;
        UA yes;
    }

    server {
        listen 80;
        server_name example.com;

        if ($allowed_country = no) {
            return 403;
        }

        location / {
            proxy_pass http://backend;
        }
    }
}

HAProxy لتوزيع الحمل وتصفية الحركة

HAProxy هو موزع تحميل قوي مع إمكانيات متقدمة لتصفية الحركة. يدعم قوائم التحكم في الوصول المعقدة (ACL) لحظر الهجمات على مستوى التطبيقات.

التكوين الأساسي لـ HAProxy

# /etc/haproxy/haproxy.cfg

global
    maxconn 50000
    # تسجيل
    log /dev/log local0
    log /dev/log local1 notice

defaults
    mode http
    log global
    option httplog
    option dontlognull
    
    # مهلات
    timeout connect 5s
    timeout client 30s
    timeout server 30s
    
    # تحديد حجم الطلب (حماية من فيضان POST)
    maxconn 3000

frontend http_front
    bind *:80
    
    # تحديد معدل الطلبات: الحد الأقصى 100 طلب في 10 ثوانٍ من عنوان IP واحد
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny if { sc_http_req_rate(0) gt 100 }
    
    # حظر الطلبات بدون رأس Host
    acl has_host hdr(host) -m found
    http-request deny if !has_host
    
    # حظر User-Agent المشبوهة
    acl bad_bot hdr_sub(User-Agent) -i bot crawler spider scraper
    http-request deny if bad_bot
    
    # تمرير إلى backend
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    
    # قائمة خوادم backend
    server web1 192.168.1.100:80 check
    server web2 192.168.1.101:80 check
    server web3 192.168.1.102:80 check

الحماية من فيضان HTTP باستخدام ACL

فيضان HTTP هو هجوم يقوم فيه المهاجم بإرسال عدد كبير من الطلبات HTTP الشرعية. يسمح HAProxy بإنشاء قواعد معقدة لاكتشافها:

frontend http_front
    bind *:80
    
    # تتبع عدد الطلبات من عنوان IP واحد
    stick-table type ip size 100k expire 30s store http_req_rate(10s),conn_cur
    http-request track-sc0 src
    
    # حظر عند تجاوز الحدود
    acl too_many_requests sc_http_req_rate(0) gt 50
    acl too_many_connections sc_conn_cur(0) gt 10
    
    http-request deny deny_status 429 if too_many_requests
    http-request deny deny_status 429 if too_many_connections
    
    # حظر الطلبات إلى مسارات غير موجودة (مسح)
    acl valid_path path_beg /api /static /login /
    http-request deny if !valid_path
    
    default_backend web_servers

قائمة بيضاء لعناوين IP الموثوقة

أنشئ قائمة بيضاء لعناوين IP الموثوقة (مثل عناوين مكاتبك أو شركائك) التي لن تتعرض لتحديد معدل الطلبات:

frontend http_front
    bind *:80
    
    # قائمة بيضاء لعناوين IP الموثوقة
    acl whitelist src 203.0.113.0/24 198.51.100.50
    
    # تحديد معدل الطلبات فقط لعناوين IP غير المدرجة في القائمة البيضاء
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src if !whitelist
    http-request deny if { sc_http_req_rate(0) gt 100 } !whitelist
    
    default_backend web_servers

استخدام البروكسي السكنية لإخفاء البنية التحتية

بالإضافة إلى البروكسي العكسي أمام خادمك، يمكنك استخدام البروكسي السكنية لحماية إضافية للبنية التحتية. هذا مهم بشكل خاص إذا كنت بحاجة إلى:

  • إخفاء عناوين IP لخوادم المراقبة الخاصة بك — إذا كنت تتعقب هجمات DDoS أو تجمع معلومات حول التهديدات، ستساعدك البروكسي السكنية في إخفاء أنشطتك
  • التواصل مع واجهات برمجة التطبيقات الخارجية دون الكشف عن البنية التحتية — يمكن لخوادمك إجراء طلبات عبر البروكسي السكنية، مما يجعل اكتشافها أكثر صعوبة
  • اختبار الحماية من DDoS — محاكاة الهجمات من عناوين IP مختلفة للتحقق من فعالية مرشحاتك

تحتوي البروكسي السكنية على عناوين IP لمستخدمين منزليين حقيقيين، مما يجعلها غير قابلة للاكتشاف عن حركة المرور العادية. هذا يجعل من الصعب حظرها ويسمح بتجاوز القيود الجغرافية.

مثال: مراقبة التهديدات عبر البروكسي السكنية

لنفترض أنك تريد تتبع نشاط شبكات البوتات التي قد تهاجم خدمتك. باستخدام البروكسي السكنية، يمكنك جمع المعلومات دون الكشف عن عناوين IP لخوادمك:

import requests

# إعداد البروكسي السكنية
proxies = {
    'http': 'http://username:password@residential-proxy.com:8080',
    'https': 'http://username:password@residential-proxy.com:8080'
}

# جمع المعلومات حول التهديدات المحتملة
threat_sources = [
    'http://suspicious-site1.com',
    'http://suspicious-site2.com'
]

for source in threat_sources:
    try:
        response = requests.get(source, proxies=proxies, timeout=5)
        # تحليل الاستجابة لاكتشاف أنماط الهجمات
        print(f"Status: {response.status_code}, IP: {response.headers.get('X-Your-IP')}")
    except Exception as e:
        print(f"Error accessing {source}: {e}")

قواعد التصفية: كيفية التمييز بين الهجوم والحركة الشرعية

التحدي الرئيسي في حماية من DDoS على مستوى التطبيقات (L7) هو التمييز بين الحركة الضارة والحركة الشرعية. ت imit الهجمات الحديثة سلوك المستخدمين الحقيقيين، مما يجعل اكتشافها أكثر صعوبة.

علامات هجوم DDoS

  • زيادة حادة في عدد الطلبات — من 2 إلى 10 مرات أكثر من المعتاد في فترة قصيرة
  • طلبات بنفس User-Agent — غالبًا ما تستخدم الروبوتات نفس User-Agent
  • غياب Referer — طلبات مباشرة بدون الانتقال من صفحات أخرى
  • طلبات متشابهة — استدعاءات لنفس URL مع اختلافات طفيفة
  • غياب JavaScript — لا تقوم الروبوتات بتنفيذ كود JS على الصفحة
  • وقت منخفض على الصفحة — تغلق الروبوتات الاتصال فورًا بعد تلقي الاستجابة
  • نطاقات IP مشبوهة — طلبات جماعية من نفس الشبكة الفرعية

تصفية متعددة المستويات

توفر الحماية الفعالة عدة مستويات من التصفية:

المستوى 1: سمعة IP

تحقق من عنوان IP من خلال قواعد بيانات الشبكات المعروفة، البروكسي، VPN. حظر IP مع سمعة سيئة.

المستوى 2: تحديد معدل الطلبات

تحديد عدد الطلبات من عنوان IP واحد. على سبيل المثال، لا تزيد عن 50 طلبًا في الدقيقة للمستخدمين العاديين.

المستوى 3: تحليل السلوك

تحقق من User-Agent، Referer، الكوكيز، وتنفيذ JavaScript. حظر الطلبات بدون هذه المعلمات.

المستوى 4: CAPTCHA

يتم عرض CAPTCHA للحركة المشبوهة. لا يمكن للروبوتات تجاوزها، بينما يمر المستخدمون الشرعيون مرة واحدة.

مثال: تحدي JavaScript في Nginx

طريقة بسيطة لتصفية الروبوتات هي طلب تنفيذ JavaScript لتثبيت الكوكيز:

server {
    listen 80;
    server_name example.com;

    # تحقق من وجود الكوكيز
    set $has_cookie 0;
    if ($http_cookie ~* "verified=true") {
        set $has_cookie 1;
    }

    # إذا لم يكن هناك كوكيز، نعرض تحدي JS
    location / {
        if ($has_cookie = 0) {
            return 200 '
                <html>
                <head><title>Verification</title></head>
                <body>
                <script>
                    document.cookie = "verified=true; path=/";
                    window.location.reload();
                </script>
                <noscript>يرجى تمكين JavaScript</noscript>
                </body>
                </html>
            ';
        }

        proxy_pass http://backend;
    }
}

المراقبة والاستجابة لهجمات DDoS في الوقت الحقيقي

تتطلب الحماية الفعالة من DDoS مراقبة مستمرة للحركة واستجابة سريعة للشذوذ. قم بإعداد نظام مراقبة يتتبع المقاييس الرئيسية:

  • عدد الطلبات في الثانية — الزيادة الحادة قد تشير إلى هجوم
  • عدد عناوين IP الفريدة — غالبًا ما تأتي هجمات DDoS من العديد من IPs
  • نسبة الأخطاء 4xx/5xx — زيادة الأخطاء قد تكون علامة على التحميل الزائد
  • وقت استجابة الخادم — زيادة التأخير تشير إلى مشاكل
  • استهلاك الموارد — المعالج، الذاكرة، حركة الشبكة

أدوات المراقبة

الأداة الغرض الميزات
Prometheus + Grafana جمع المقاييس والتصور إعداد مرن للتنبيهات، لوحات معلومات جميلة
ELK Stack (Elasticsearch، Logstash، Kibana) تحليل السجلات في الوقت الحقيقي بحث قوي في السجلات، اكتشاف الأنماط
Netdata مراقبة موارد النظام تثبيت بسيط، مقاييس في الوقت الحقيقي
Fail2ban حظر IP تلقائي تحلل السجلات وتحظر عناوين IP المشبوهة

إعداد التنبيهات في Prometheus

أنشئ قواعد للتنبيه التلقائي عند اكتشاف الشذوذ:

# prometheus_alerts.yml

groups:
  - name: ddos_detection
    interval: 10s
    rules:
      # تنبيه عند زيادة حادة في الطلبات
      - alert: HighRequestRate
        expr: rate(nginx_http_requests_total[1m]) > 1000
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "تم اكتشاف معدل طلبات مرتفع"
          description: "معدل الطلبات هو {{ $value }} req/s"

      # تنبيه عند زيادة الأخطاء 5xx
      - alert: HighErrorRate
        expr: rate(nginx_http_requests_total{status=~"5.."}[5m]) > 10
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "معدل الأخطاء 5xx مرتفع"
          description: "أخطاء 5xx: {{ $value }} req/s"

      # تنبيه عند استخدام CPU مرتفع
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "استخدام CPU مرتفع"
          description: "استخدام CPU هو {{ $value }}%"

استجابة تلقائية باستخدام Fail2ban

يقوم Fail2ban بتحليل السجلات وحظر عناوين IP تلقائيًا التي تتجاوز حدود الطلبات:

# /etc/fail2ban/jail.local

[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]

# /etc/fail2ban/filter.d/nginx-req-limit.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"
ignoreregex =

حماية متعددة المستويات: دمج البروكسي مع طرق أخرى

تعتبر خوادم البروكسي عنصرًا مهمًا في الحماية من DDoS، لكنها تكون أكثر فعالية عند دمجها مع طرق أخرى. دعونا نلقي نظرة على هيكل الحماية متعددة المستويات:

المستوى 1: الحماية الشبكية (L3/L4)

  • خدمات anti-DDoS السحابية — تقوم Cloudflare، AWS Shield، Google Cloud Armor بتصفية الحركة قبل أن تصل إلى خوادمك
  • جدران الحماية المخصصة — معدات متخصصة لتصفية حركة الشبكة
  • BGP blackholing — إعادة توجيه الحركة الضارة إلى "ثقب أسود" على مستوى المزود

المستوى 2: CDN والتخزين المؤقت

  • CDN (شبكة توصيل المحتوى) — توزع المحتوى الثابت عبر العديد من الخوادم، مما يقلل من الحمل على الأصل
  • التخزين المؤقت على البروكسي — يقوم Varnish وNginx بتخزين الصفحات الشائعة وتقديمها دون الحاجة إلى الاتصال بـ backend
  • تحسين المحتوى — تقليل حجم الحركة من خلال تصغير CSS/JS، وضغط الصور

المستوى 3: البروكسي والتوازن (L7)

  • البروكسي العكسي — تقوم Nginx وHAProxy بتصفية الطلبات على مستوى التطبيقات
  • توزيع الحمل — توزيع الحمل بين عدة خوادم backend
  • تحديد معدل الطلبات — تحديد عدد الطلبات من عنوان IP واحد
  • WAF (جدار حماية تطبيق الويب) — تقوم ModSecurity وAWS WAF بحظر الهجمات على تطبيقات الويب

المستوى 4: تحسين backend

  • تحسين قاعدة البيانات — الفهارس، تخزين الطلبات، نسخ القراءة
  • المعالجة غير المتزامنة — تنفيذ المهام الثقيلة في الخلفية عبر قوائم الانتظار (RabbitMQ، Redis)
  • التوسع الأفقي — إضافة خوادم جديدة عند زيادة الحمل

مثال على الهيكل

العميل
  ↓
Cloudflare (anti-DDoS L3/L4، CDN)
  ↓
Nginx بروكسي عكسي (تحديد معدل الطلبات، تصفية)
  ↓
HAProxy (توازن الحمل)
  ↓
خوادم backend (تطبيق الويب)
  ↓
قاعدة البيانات (مع النسخ)

يضمن هذا الهيكل الحماية على جميع المستويات: الشبكية، والنقل، والتطبيق. حتى إذا اجتازت الهجمة مستوى واحد، سيتوقفها المستوى التالي.

استخدام بروكسي مراكز البيانات كطبقة إضافية

في بعض الحالات، قد يكون من المنطقي إضافة بروكسي مراكز البيانات كطبقة وسيطة بين CDN وخوادمك. توفر سرعة معالجة عالية ويمكنها تنفيذ تصفية إضافية للحركة. بروكسي مراكز البيانات أرخص من البروكسي السكنية والمحمولة، مما يجعلها حلاً اقتصاديًا لمعالجة كميات كبيرة من الحركة.

الخاتمة

تعتبر الحماية من هجمات DDoS باستخدام خوادم البروكسي طريقة فعالة، حيث تسمح بتصفية الحركة الضارة، وإخفاء عناوين IP الحقيقية للخوادم، وتوزيع الحمل. توفر البروكسي العكسية المبنية على Nginx أو HAProxy إعدادًا مرنًا لقواعد التصفية، وتحديد معدل الطلبات، وحظر الطلبات المشبوهة.

النقاط الرئيسية التي ناقشناها:

  • البروكسي العكسية (Nginx، HAProxy) — الأداة الرئيسية للحماية على مستوى التطبيقات (L7)
  • تحديد معدل الطلبات وتصفية حسب User-Agent، سمعة IP تساعد في تصفية معظم الهجمات
  • البروكسي السكنية مفيدة لإخفاء بنية المراقبة وجمع معلومات حول التهديدات
  • تضمن الحماية متعددة المستويات (CDN + بروكسي + WAF + تحسين backend) أقصى مقاومة
  • تعتبر المراقبة والاستجابة التلقائية ضرورية لاكتشاف الهجمات وحظرها بسرعة

تذكر أن هجمات DDoS تتطور باستمرار، لذا فإن نظام الحماية يحتاج إلى تحديث واختبار منتظم. قم بإجراء اختبارات تحميل، وتحليل السجلات، وتحديث قواعد التصفية، وراقب طرق الهجوم الجديدة.

إذا كنت تخطط لبناء نظام حماية متعدد المستويات باستخدام البروكسي، نوصي بالنظر في البروكسي السكنية لإخفاء البنية التحتية الحرجة وبروكسي مراكز البيانات لمعالجة سريعة لكميات كبيرة من الحركة. توفر مجموعة من أنواع البروكسي توازنًا مثاليًا بين الأمان والأداء والتكلفة.

```