Linux: أساسيات الشبكات — ip / curl / ssh وتشخيص الشبكة

أوامر شبكات لينكس هي أدوات أساسية لتشخيص "لماذا لا أستطيع الاتصال." من عرض عناوين IP إلى اختبار اتصال المنافذ، ومن تحليل DNS إلى طلبات HTTP — هذه الأوامر تغطي عملية استكشاف أخطاء الشبكة الكاملة.

📋 المتطلبات المسبقة: يجب أن تعرف بالفعل

1. ما ستتعلمه


2. قصة "الموقع لا يفتح"

(1) نقطة الألم: خدمة منشورة لكن لا يمكن الوصول إليها خارجيًا

نشر شياو مينغ خدمة Node.js على المنفذ 3000، لكن الوصول إلى http://server-ip:3000 من المتصفح يستمر في انتهاء المهلة.

تحقق محليًا أولًا:

BASH
curl http://localhost:3000
# ✅ يعيد HTML بشكل طبيعي

ثم فحص من الخارج:

BASH
# تحقق مما إذا كان المنفذ يستمع
ss -tlnp | grep 3000
# LISTEN 0 128 127.0.0.1:3000 0.0.0.0:*  ← يستمع على localhost فقط!

# Node.js مرتبط بـ127.0.0.1 بدلًا من 0.0.0.0

(2) إصلاح عنوان الربط

غيّر شياو مينغ server.listen(3000, '127.0.0.1') إلى server.listen(3000, '0.0.0.0'). بعد إعادة التشغيل، الوصول الخارجي نجح.

⚠️ تحذير: خدمات SSH تسمح افتراضيًا بتسجيل دخول المستخدم الجذر مباشرة — هذا هو أكثر ثغرة أمنية شيوعًا. خوادم الإنتاج يجب ضبط PermitRootLogin no لتعطيل دخول الجذر المباشر عبر SSH، واستخدام مستخدم عادي + sudo بدلًا من ذلك. أيضًا عطّل تسجيل الدخول بكلمة مرور (PasswordAuthentication no) واستخدم مصادقة المفاتيح فقط.

(3) الفائدة: نهج منظم لاستكشاف الأخطاء

تعلّم شياو مينغ تسلسل الاستكشاف: curl محليًا لتأكيد عمل الخدمة → ss لفحص عنوان الاستماع → فحص الجدار الناري → curl خارجيًا للتحقق.


3. نقاط المعرفة

(1) ip — إعدادات الشبكة

BASH
# عرض عناوين IP
ip addr show
# أو اختصارًا
ip a

# عرض جدول التوجيه
ip route
# أو اختصارًا
ip r

# عرض حالة واجهة الشبكة
ip link show

# تفعيل/تعطيل واجهة
sudo ip link set eth0 up
sudo ip link set eth0 down

(2) ping/mtr — اختبار الاتصال

TEXT
# ping (اختبار اتصال الشبكة)
ping google.com              # ping مستمر، Ctrl+C للإيقاف
ping -c 4 google.com         # ping 4 مرات فقط
ping -c 4 -i 2 google.com    # فاصل ثانيتين
ping -c 10 -q google.com     # ملخص فقط

# mtr (يجمع بين traceroute وping)
mtr google.com               # تتبع المسار باستمرار
mtr -r -c 10 google.com      # وضع التقرير (إخراج بعد 10 جولات)

(3) curl/wget — طلبات HTTP

BASH
# curl (طلبات HTTP)
curl https://example.com              # طلب GET
curl -I https://example.com           # الرؤوس فقط
curl -o page.html https://example.com # حفظ في ملف

> 💡 نصيحة: curl -v (الوضع المفصّل) أداة قوية لتصحيح مشاكل HTTP — يعرض رؤوس الطلب الكاملة، ورؤوس الاستجابة، وعملية مصافحة TLS، مما يساعدك على تحديد هل المشكلة في DNS، أو انتهاء مهلة الاتصال، أو خطأ شهادة، أو مشكلة إعادة توجيه. عندما يفشل طلب curl، خطوتك الأولى يجب أن تكون إضافة -v للتفاصيل.
curl -L http://httpbin.org/redirect/3 # اتبع إعادات التوجيه
curl -k https://self-signed.com       # تخطي التحقق من SSL
curl -X POST -d '{"key":"value"}' -H "Content-Type: application/json" https://api.example.com

# wget (تحميل ملفات)
wget https://example.com/file.zip     # تحميل ملف
wget -c https://example.com/big.zip   # استئناف التحميل
wget -r -np https://example.com/docs/ # تحميل متكرر

(4) ss/netstat — المنافذ المستمع إليها

BASH
# ss (موصى به، أسرع)
ss -tlnp           # منافذ TCP المستمع إليها
ss -ulnp           # منافذ UDP المستمع إليها
ss -tlnp | grep 80 # تصفية المنفذ 80
ss -tuna           # كل اتصالات TCP/UDP

# netstat (تقليدي، قد يحتاج تثبيت)
netstat -tlnp
netstat -i         # إحصائيات واجهة الشبكة

(5) dig — استعلامات DNS

TEXT
# dig
dig example.com                    # استعلام DNS كامل
dig +short example.com             # IP فقط
dig example.com A                  # استعلام سجل A
dig example.com MX                 # استعلام سجل البريد
dig @8.8.8.8 example.com          # استخدام خادم DNS محدد

# أدوات DNS أخرى
nslookup example.com               # استعلام بسيط
host example.com                   # أكثر إيجازًا

ℹ️ ملاحظة: dig وnslookup وhost كلها تستعلم سجلات DNS لكن بصيغ إخراج مختلفة — dig الأكثر تفصيلًا (يتضمن وقت الاستعلام، والخادم، إلخ)، وnslookup أكثر إيجازًا، وhost الأقل (IP فقط). استخدم dig لاستكشاف أخطاء DNS، وhost أو dig +short للبحث السريع عن IP.

(6) ▶ مثال: عرض إعدادات الشبكة المحلية

BASH
# عرض كل عناوين IP
ip -br addr
# lo               UNKNOWN        127.0.0.1/8
# eth0             UP             192.168.1.100/24

# عرض البوابة الافتراضية
ip route | grep default
# default via 192.168.1.1 dev eth0

# عرض DNS
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 1.1.1.1

الإخراج:

TEXT
lo               UNKNOWN        127.0.0.1/8
eth0             UP             192.168.1.100/24
default via 192.168.1.1 dev eth0
nameserver 8.8.8.8
nameserver 1.1.1.1

(7) ▶ مثال: استكشاف أخطاء اتصال الشبكة

BASH
# 1. ping البوابة أولًا (تأكيد عمل LAN)
ping -c 2 192.168.1.1

# 2. ping IP خارجي (تأكيد عمل الإنترنت)
ping -c 2 8.8.8.8

# 3. تحليل DNS (تأكيد عمل تحليل النطاق)
dig +short google.com

# 4. اتصال المنفذ (تأكيد أن منفذ الخدمة مفتوح)
nc -zv google.com 80
# Connection to google.com (142.250.80.14) 80 port [tcp/http] succeeded!

# 5. طلب HTTP (تأكيد عمل الخدمة)
curl -I https://example.com

الإخراج:

TEXT
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.423 ms

--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=12.3 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss
142.250.80.14
Connection to google.com (142.250.80.14) 80 port [tcp/http] succeeded!
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: ECS (dcb/7F84)

(8) ▶ مثال: اختبار واجهات API بcurl

BASH
# طلب GET
curl https://api.github.com/users/octocat

# عرض رؤوس الاستجابة
curl -I https://httpbin.org

# إرسال بيانات JSON بـPOST
curl -X POST https://httpbin.org/post \
    -H "Content-Type: application/json" \
    -d '{"name":"Alice","role":"developer"}'

# طلب بمصادقة
curl -u "username:token" https://api.github.com/user

# اختبار رمز حالة HTTP
curl -s -o /dev/null -w "%{http_code}" https://example.com

الإخراج:

TEXT
{"login":"octocat","id":583231,"avatar_url":"https://avatars.githubusercontent.com/u/583231?v=4"}
HTTP/1.1 200 OK
Server: gunicorn/19.9.0
Content-Type: application/json
{
  "json": {
    "name": "Alice",
    "role": "developer"
  }
}
200

(9) ▶ مثال: استكشاف أخطاء المنافذ

BASH
# عرض كل منافذ TCP المستمع إليها
ss -tlnp

# تحقق مما إذا كان المنفذ 3306 (MySQL) يستمع
ss -tlnp | grep 3306

# عرض منافذ عملية محددة
ss -tlnp | grep nginx

# اختبار ما إذا كان منفذ بعيد مفتوحًا
echo "Testing port 80..."
timeout 3 bash -c "echo >/dev/tcp/example.com/80" && echo "Open" || echo "Closed"

# عرض حالات الاتصال
ss -tuna | grep ESTAB

الإخراج:

TEXT
State   Recv-Q  Send-Q   Local Address:Port    Peer Address:Port  Process
LISTEN  0       128      0.0.0.0:22           0.0.0.0:*
LISTEN  0       128      0.0.0.0:80           0.0.0.0:*
LISTEN  0       128      0.0.0.0:443          0.0.0.0:*
LISTEN  0       128            *:3306               *:*
LISTEN  0       511            *:80                 *:*    users:(("nginx",pid=1234,fd=6))
Open
ESTAB   0       0        192.168.1.100:22     10.0.0.50:52341
ESTAB   0       0        192.168.1.100:443    172.16.0.5:49832

(10) ▶ مثال: تحميل ملفات

BASH
# تحميل بwget
wget -c https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

# تحميل بcurl
curl -L -o ubuntu.iso https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso

# تحميل واستخراج
curl -L https://github.com/user/repo/archive/main.tar.gz | tar -xz

الإخراج:

TEXT
--2026-07-07 10:23:01--  https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso
Resolving releases.ubuntu.com... 185.125.190.37
HTTP request sent, awaiting response... 200 OK
Length: 2014838784 (1.9G) [application/x-iso9660-image]
Saving to: 'ubuntu-22.04.3-live-server-amd64.iso'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload  Total   Spent    Left  Speed
 45%  891M    0     0  891M      0     0  12.3M      0:00:02  0:00:01  0:00:01 12.3M

(11) ▶ مثال شامل: سكريبت تشخيص الشبكة

BASH
#!/bin/bash
# net-diag.sh - أداة تشخيص الشبكة

TARGET="${1:-google.com}"

echo "========================================"
echo "    Network Diagnostics Report"
echo "    Time: $(date)"
echo "========================================"

echo ""
echo "1. Local Network Configuration"
echo "----------------"
ip -br addr 2>/dev/null || ifconfig

echo ""
echo "2. Default Gateway"
echo "-----------"
ip route | grep default

echo ""
echo "3. DNS Servers"
echo "--------------"
cat /etc/resolv.conf | grep nameserver

echo ""
echo "4. DNS Resolution ($TARGET)"
echo "----------------------"
dig +short "$TARGET" 2>/dev/null || nslookup "$TARGET" 2>/dev/null || host "$TARGET"

echo ""
echo "5. Network Connectivity"
echo "--------------"
ping -c 4 -q "$TARGET" 2>&1 | tail -3

echo ""
echo "6. HTTP Response"
echo "-------------"
curl -s -o /dev/null -w "HTTP %{http_code}, time: %{time_total}s\n" "https://$TARGET" --connect-timeout 5

echo ""
echo "7. Route Tracing"
echo "------------"
mtr -r -c 3 "$TARGET" 2>/dev/null | tail -5 || echo "mtr not installed"

echo ""
echo "8. Listening Ports"
echo "-----------"
ss -tlnp 2>/dev/null | head -10 || netstat -tlnp 2>/dev/null | head -10

echo ""
echo "========================================"

❓ أسئلة شائعة

س: إذا فشل ping، هل هي دائمًا مشكلة شبكة؟ ج: ليس بالضرورة. كثير من الخوادم تحجب ICMP (ping) بجدارها الناري. من الطبيعي تمامًا أن يفشل ping لكن HTTP يعمل. بديل: nc -zv host port أو curl -I لاختبار منافذ خدمات محددة.

س: ما الفرق بين curl وwget؟ ج: curl أغنى مميزات (يدعم كل طرق HTTP، ورؤوس مخصصة، وبيانات JSON)، مثالي لاختبار واجهات API. wget أقوى في التحميل (تحميل متكرر، استئناف، نسخ مواقع). استخدم curl لاختبار API يوميًا، وwget لتحميل الملفات.

س: أيهما أفضل، ss أم netstat؟ ج: ss أحدث وأسرع — يقرأ مباشرة من ذاكرة مقابس النواة دون تحليل /proc/net. netstat أقدم وأبطأ على أنظمة بكثير من الاتصالات. فضّل ss؛ netstat قد لا يكون مثبتًا افتراضيًا على الأنظمة الأحدث.

س: ما الفرق بين المنفذ 80 و443؟ ج: 80 هو HTTP (نص عادي)، و443 هو HTTPS (مشفر). المواقع الحديثة تستخدم 443 فقط أساسًا. إذا لم يعمل curl http://...، جرّب curl https://...

س: لماذا اتصال SSH بطيء؟ ج: أسباب شائعة: 1) بحث DNS عكسي (اضبط UseDNS no). 2) مصادقة GSSAPI (اضبط GSSAPIAuthentication no). 3) زمن استجابة الشبكة. إصلاح سريع: أضف UseDNS no وGSSAPIAuthentication no في ~/.ssh/config.


📖 ملخص


📝 تمارين

  1. أساسي (⭐): استخدم ip -br addr لعرض IP المحلي وواجهات الشبكة، ثم استخدم ping -c 4 google.com لاختبار الاتصال وتحليل النتائج
  2. متوسط (⭐⭐): استخدم ss -tlnp لعرض كل المنافذ المستمع إليها على جهازك، ثم استخدم curl -I https://example.com لعرض رؤوس استجابة HTTP، وdig +short github.com لاستعلام عنوان IP لـGitHub
  3. متقدم (⭐⭐⭐): اكتب سكريبت تشخيص شبكة يكتشف تلقائيًا IP المحلي والبوابة وDNS والاتصال واستجابة HTTP والمنافذ المستمع إليها، ويُخرج تقريرًا منسّقًا، ويُبرز التحذيرات باللون عند اكتشاف شذوذ
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%