Linux: أساسيات الشبكات — ip / curl / ssh وتشخيص الشبكة
أوامر شبكات لينكس هي أدوات أساسية لتشخيص "لماذا لا أستطيع الاتصال." من عرض عناوين IP إلى اختبار اتصال المنافذ، ومن تحليل DNS إلى طلبات HTTP — هذه الأوامر تغطي عملية استكشاف أخطاء الشبكة الكاملة.
📋 المتطلبات المسبقة: يجب أن تعرف بالفعل
- الدرس 3: أساسيات الطرفية
1. ما ستتعلمه
- ip addr/route: عرض إعدادات الشبكة
- ping/mtr: اختبار الاتصال
- curl/wget: طلبات HTTP
- ss/netstat: المنافذ المستمع إليها
- dig: استعلامات DNS
2. قصة "الموقع لا يفتح"
(1) نقطة الألم: خدمة منشورة لكن لا يمكن الوصول إليها خارجيًا
نشر شياو مينغ خدمة Node.js على المنفذ 3000، لكن الوصول إلى http://server-ip:3000 من المتصفح يستمر في انتهاء المهلة.
تحقق محليًا أولًا:
curl http://localhost:3000
# ✅ يعيد HTML بشكل طبيعي
ثم فحص من الخارج:
# تحقق مما إذا كان المنفذ يستمع
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'). بعد إعادة التشغيل، الوصول الخارجي نجح.
PermitRootLogin no لتعطيل دخول الجذر المباشر عبر SSH، واستخدام مستخدم عادي + sudo بدلًا من ذلك. أيضًا عطّل تسجيل الدخول بكلمة مرور (PasswordAuthentication no) واستخدم مصادقة المفاتيح فقط.
(3) الفائدة: نهج منظم لاستكشاف الأخطاء
تعلّم شياو مينغ تسلسل الاستكشاف: curl محليًا لتأكيد عمل الخدمة → ss لفحص عنوان الاستماع → فحص الجدار الناري → curl خارجيًا للتحقق.
3. نقاط المعرفة
(1) ip — إعدادات الشبكة
# عرض عناوين 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 — اختبار الاتصال
# 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
# 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 — المنافذ المستمع إليها
# ss (موصى به، أسرع)
ss -tlnp # منافذ TCP المستمع إليها
ss -ulnp # منافذ UDP المستمع إليها
ss -tlnp | grep 80 # تصفية المنفذ 80
ss -tuna # كل اتصالات TCP/UDP
# netstat (تقليدي، قد يحتاج تثبيت)
netstat -tlnp
netstat -i # إحصائيات واجهة الشبكة
(5) dig — استعلامات DNS
# 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) ▶ مثال: عرض إعدادات الشبكة المحلية
# عرض كل عناوين 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
الإخراج:
TEXTlo 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) ▶ مثال: استكشاف أخطاء اتصال الشبكة
# 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
الإخراج:
TEXTPING 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
# طلب 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) ▶ مثال: استكشاف أخطاء المنافذ
# عرض كل منافذ 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
الإخراج:
TEXTState 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) ▶ مثال: تحميل ملفات
# تحميل ب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) ▶ مثال شامل: سكريبت تشخيص الشبكة
#!/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.
📖 ملخص
- ip addr / ip route عرض IP والتوجيه
- ping -c 4 اختبار الاتصال، وmtr تتبع المسار
- curl -I عرض رؤوس الاستجابة، وcurl -X POST -d '{}' إرسال طلبات
- ss -tlnp عرض المنافذ المستمع إليها
- dig +short استعلام DNS سريع
📝 تمارين
- أساسي (⭐): استخدم ip -br addr لعرض IP المحلي وواجهات الشبكة، ثم استخدم ping -c 4 google.com لاختبار الاتصال وتحليل النتائج
- متوسط (⭐⭐): استخدم ss -tlnp لعرض كل المنافذ المستمع إليها على جهازك، ثم استخدم curl -I https://example.com لعرض رؤوس استجابة HTTP، وdig +short github.com لاستعلام عنوان IP لـGitHub
- متقدم (⭐⭐⭐): اكتب سكريبت تشخيص شبكة يكتشف تلقائيًا IP المحلي والبوابة وDNS والاتصال واستجابة HTTP والمنافذ المستمع إليها، ويُخرج تقريرًا منسّقًا، ويُبرز التحذيرات باللون عند اكتشاف شذوذ