كيف تعرف عنوان IP في لينكس: ip addr وhostname -I وcurl
- ٣٠ أكتوبر ٢٠٢٦
- ٠٩:٠٠ ص
- بقلم Adrien Roche
- الشبكات

معرفة عنوان IP في لينكس باستخدام ip addr
الأمر الذي يجيب عن سؤال "ما هو عنوان IP الخاص بي" في أي توزيعة لينكس حديثة هو ip من حزمة iproute2. وهو مثبّت افتراضياً في كل التوزيعات الكبرى، ويعمل من دون صلاحيات الجذر، وبقية الأوامر في هذا الدليل إما تغلّفه أو حلّ محلّها. تسرد الصيغة الأساسية كل واجهة مع جميع عناوينها:
ip addr show
ip a # same thing, shorterعلى خادم يحتوي على بطاقة شبكة واحدة، تبدو المخرجات هكذا (مع اختصار أسطر مدة الصلاحية valid_lft):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 203.0.113.25/24 brd 203.0.113.255 scope global eth0
inet6 2001:db8:1::25/64 scope global
inet6 fe80::5054:ff:fe12:3456/64 scope linkكيف تقرأ المخرجات:
- اسم الواجهة. الواجهة
loهي واجهة الاسترجاع، وعنوانها دائماً127.0.0.1، ولا يمكن الوصول إليها إلا من الجهاز نفسه. أما البطاقة الحقيقية فهيeth0هنا؛ ومع أسماء الواجهات القابلة للتنبؤ تظهر باسمens3أوenp0s3أوeno1، وتبدأ بطاقات اللاسلكي بـwl. inetهو عنوان IPv4، وinet6هو عنوان IPv6. واللاحقة/24هي طول البادئة بصيغة CIDR، وهي الكتابة الحديثة لقناع الشبكة255.255.255.0.scope globalتعني أن العنوان قابل للتوجيه خارج هذا المضيف؛ وscope link(سطرfe80::) صالح فقط داخل مقطع الشبكة المتصل؛ وscope hostتعني واجهة الاسترجاع.state UPمعLOWER_UPتعني أن الواجهة مفعّلة ولديها اتصال فعلي. أماstate DOWNأوNO-CARRIERفهي السبب المعتاد في عدم امتلاك الواجهة أي عنوان.
صيغ مفيدة أخرى:
ip -4 addr # IPv4 only
ip -6 addr # IPv6 only
ip -br -4 addr # one line per interface
ip -4 addr show dev eth0 # a single interfaceالصيغة المختصرة (-br) هي أسرع طريقة لمعرفة عنوان IP في لينكس عند وجود عدة واجهات، وهي الحالة المعتادة على خادم VPS يشغّل Docker:
$ ip -br -4 addr
lo UNKNOWN 127.0.0.1/8
eth0 UP 203.0.113.25/24
docker0 DOWN 172.17.0.1/16hostname -I: العناوين فقط
عندما تحتاج إلى العناوين فقط، يطبع hostname -I (بحرف I كبير) كل عنوان مضبوط في سطر واحد مفصولاً بمسافات، باستثناء واجهة الاسترجاع وعناوين IPv6 المحلية للوصلة:
$ hostname -I
203.0.113.25 2001:db8:1::25هناك تحذيران. الأمر hostname -i بحرف صغير مختلف تماماً: فهو يحلّ اسم مضيف الجهاز عبر /etc/hosts ثم DNS، وهو ما يعطي عادةً 127.0.1.1 على Debian وUbuntu. كما أن hostname -I يطبع العناوين بترتيب غير مضمون، بما فيها الجسور الافتراضية مثل docker0، لذا فإن hostname -I | awk '{print $1}' اختصار مناسب للبشر لا وسيلة موثوقة لتحديد "العنوان الأساسي" في السكربتات. وهذا الخيار ليس جزءاً من POSIX: تدعمه Debian وUbuntu وFedora وRHEL، وقد لا تدعمه الصور المصغّرة القائمة على BusyBox مثل Alpine.
ifconfig وnmcli وnetworkctl
ifconfig (مهجور، من net-tools)
الأمر ifconfig هو ما تعرضه الشروحات القديمة. وهو ينتمي إلى حزمة net-tools المهجورة لصالح iproute2 منذ سنوات، ولم يعد ضمن التثبيت الافتراضي لإصدارات Ubuntu وDebian وFedora/RHEL الحالية. وإذا أعاد command not found، فانتقل إلى ip أو ثبّت الحزمة:
sudo apt install net-tools # Debian / Ubuntu
sudo dnf install net-tools # Fedora / RHEL / Rocky / Alma$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 203.0.113.25 netmask 255.255.255.0 broadcast 203.0.113.255
inet6 fe80::5054:ff:fe12:3456 prefixlen 64 scopeid 0x20<link>مخرجاته سهلة القراءة، لكن له قيداً حقيقياً: يعرض ifconfig عنوان IPv4 واحداً فقط لكل واجهة. أما العناوين الثانوية المضافة عبر ip addr add، وهي شائعة على خادم VPS بعدة عناوين عامة، فلا تظهر فيه.
nmcli وnetworkctl
تدير أنظمة سطح المكتب وخوادم عائلة Fedora/RHEL شبكتها عبر NetworkManager؛ بينما يستخدم Ubuntu Server أداة netplan فوق systemd-networkd، وتتبع كثير من صور VPS النموذج نفسه. ولكل منها أداة حالة تعرض العنوان والبوابة وخوادم DNS في كتلة واحدة:
nmcli device show eth0
nmcli -g IP4.ADDRESS device show eth0 # NetworkManager: just the address field
networkctl status eth0 # systemd-networkdيطبع الخيار -g (--get-values) القيمة المجردة لحقل واحد، بما في ذلك طول البادئة، وهو مفيد للسكربتات. وإذا لم تكن متأكداً من حزمة الشبكة التي يشغّلها جهازك، أو حتى من التوزيعة وإصدارها، فابدأ بـتحديد إصدار نظام التشغيل من سطر الأوامر؛ فالجواب يحدد الأداة المتوفرة.
معرفة عنوان IP العام باستخدام curl
كل ما سبق يعرض العنوان المضبوط على الواجهة. وعلى معظم خوادم VPS يُسند عنوان IPv4 العام مباشرةً إلى الواجهة، فيكون هو نفسه ما تراه الإنترنت. أما في المنزل أو المكتب أو على بعض السحابات، فتحمل الواجهة عنواناً خاصاً من نطاقات RFC 1918 (10.0.0.0/8 و172.16.0.0/12 و192.168.0.0/16)، ويترجمه موجّه أو NAT بنسبة 1:1 عند الخروج. والطريقة الموثوقة الوحيدة لرؤية الجانب العام هي سؤال خدمة خارجية:
curl -4 icanhazip.com
curl -4 ifconfig.me/ip
curl -4 https://api.ipify.org
curl -6 icanhazip.com # public IPv6, if the host has oneيفرض الخياران -4 و-6 عائلة العناوين، وهو أمر مهم على المضيفات ثنائية المكدس: فبدونهما قد يفضّل curl بروتوكول IPv6 ويعيد عنواناً غير متوقع. ويشغّل موقع icanhazip.com شركة Cloudflare منذ 2021 وهو يعيد نصاً صرفاً. واقرأ الجواب على أنه "العنوان الذي تخرج منه بياناتي": فخلف شبكة VPN أو وكيل يكون عنوان عقدة الخروج لا عنوان مزوّد خدمتك.
IPv6: العنوان العام مقابل المحلي للوصلة
تعرض كل واجهة لينكس تقريباً سطر inet6 واحداً على الأقل، وكثيراً ما يُظن أنه عنوان IPv6 عام. لكن السطر الذي يبدأ بـfe80:: ويحمل الوسم scope link هو عنوان محلي للوصلة: تولّده كل واجهة تلقائياً، وهو صالح فقط داخل الشبكة المتصلة، ولا يمكن الوصول إليه من الإنترنت أبداً. أما عنوان IPv6 العام فيحمل الوسم scope global ويبدأ بالرقم 2 أو 3، لأن مجال البث الأحادي العام هو 2000::/3.
ip -6 addr show scope global
ip -6 route show defaultإذا لم يطبع الأمر الأول شيئاً، فالجهاز لا يملك عنوان IPv6 قابلاً للتوجيه وسيفشل curl -6. أما العناوين العامة الإضافية الموسومة بـtemporary على أجهزة سطح المكتب فتأتي من امتدادات الخصوصية؛ وتبقيها الخوادم معطلة ليظل العنوان ثابتاً لقواعد DNS وجدار الحماية.
البوابة الافتراضية والتوجيه وخوادم DNS
العنوان وحده لا يخبرك ما إذا كان الجهاز قادراً على الوصول إلى أي شيء. جدول التوجيه هو من يفعل ذلك، ويطبعه الأمر ip route (الصيغة المختصرة ip r):
$ ip route
default via 203.0.113.1 dev eth0 proto static
203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.25سطر default via هو البوابة الافتراضية، أي الموجّه الذي تستخدمه كل حزمة عندما لا يطابقها مسار أكثر تحديداً. أما السطر الثاني فقد أضافته النواة عند ضبط العنوان؛ وحقل src فيه هو العنوان الذي يفضّله المضيف كمصدر على تلك الشبكة. وأنفع حيلة هنا تبني على ذلك: اسأل النواة أي عنوان ستستخدمه نحو وجهة معينة.
$ ip route get 1.1.1.1
1.1.1.1 via 203.0.113.1 dev eth0 src 203.0.113.25 uid 1000
cacheقيمة src هذه هي بالتعريف عنوان الجهاز الصادر نحو الإنترنت، مهما كانت الواجهات أو الجسور أو الأنفاق الموجودة. أما بالنسبة إلى DNS، فما زال /etc/resolv.conf هو الملف الذي تنظر فيه، لكنه على الأنظمة التي تشغّل systemd-resolved (Ubuntu منذ 18.04، وإصدارات Fedora الحديثة) لا يحتوي سوى على الوسيط المحلي 127.0.0.53؛ أما محللات DNS الحقيقية فيعرضها resolvectl status، أو حقول IP4.DNS في nmcli device show على المضيفات التي تستخدم NetworkManager.
السكربتات: وضع عنوان IP في متغير
المخرجات التفاعلية مصمَّمة للبشر؛ أما السكربت فيحتاج إلى عنوان واحد بلا أي زوائد. وهذه الأنماط موثوقة، من الأبسط إلى الأمتن:
# One interface, IPv4, prefix length stripped
IP=$(ip -4 -o addr show dev eth0 | awk '{print $4}' | cut -d/ -f1)
# Robust: the source address used to reach the internet
IP=$(ip route get 1.1.1.1 | awk '{for (i=1; i<=NF; i++) if ($i == "src") {print $(i+1); exit}}')
# Same thing with JSON output and jq
IP=$(ip -j route get 1.1.1.1 | jq -r '.[0].prefsrc')
# Public IP, with a timeout so the script never hangs offline
PUBLIC_IP=$(curl -4 -s --max-time 5 https://icanhazip.com)يجعل الخيار -o الأمر ip يطبع عنواناً واحداً في كل سطر، ما يحافظ على مواضع الحقول في awk؛ وأضف head -n 1 إذا كانت الواجهة تحمل عدة عناوين IPv4. أما الخيار -j فيحوّل مخرجات ip إلى صيغة JSON، ثم يختار jq الحقول بأسمائها. وفضّل هذه الصيغة في كل ما يعمل على أكثر من جهاز: فأسماء الواجهات تختلف من مضيف إلى آخر، بخلاف أسماء الحقول.
| الأمر | ما يعرضه | الأنسب لـ |
|---|---|---|
ip addr / ip -br -4 addr | كل الواجهات وجميع العناوين والحالة | الاستخدام اليومي والصورة الكاملة |
hostname -I | كل العناوين في سطر واحد | نظرة سريعة |
ip route get 1.1.1.1 | عنوان المصدر المستخدم نحو الإنترنت | السكربتات والمضيفات متعددة الواجهات |
ifconfig | عنوان IPv4 واحد لكل واجهة (مهجور) | الأنظمة القديمة والشروحات القديمة |
curl -4 icanhazip.com | عنوان IPv4 العام كما تراه الإنترنت | NAT وVPN وتأكيد عنوان خادم VPS |
ما الذي يختلف على خادم VPS
على خادم VPS بعنوان IPv4 مخصص، يجب أن تعيد الأوامر ip -4 addr وhostname -I وcurl -4 icanhazip.com العنوان نفسه، لأن عنوان IP العام مضبوط مباشرةً على الواجهة من دون NAT بينهما. وعندما تختلف النتائج، فهناك شيء في المسار: NAT من جهة المزوّد، أو عميل VPN منسي، أو جسر Docker احتل المرتبة الأولى في مخرجات hostname -I.
بعد تأكيد العنوان، تحقق من أمرين. أولاً، هل يمكن الوصول إليه فعلاً وعلى أي منافذ، وهو سؤال مختلف عن كونه مضبوطاً: تحقق من المنافذ المفتوحة على خادم لينكس من الداخل عبر ss -tulpn ومن الخارج عبر nmap. وثانياً، سجل DNS العكسي. ابحث عن سجل PTR الخاص بعنوانك:
dig -x 203.0.113.25 +shortعادةً ما يجيب خادم VPS الجديد باسم عام للمزوّد، أو لا يجيب بشيء إطلاقاً. وإذا كان الخادم يرسل البريد أو يقدّم أي خدمة عامة، فاضبط اسم المضيف وسجل DNS العكسي ليتطابقا؛ فالبريد الصادر تحديداً يُرفض بانتظام عندما لا يتطابق سجل PTR مع اسم HELO.
تتحول هذه الأوامر إلى عادة تلقائية بأسرع ما يكون على خادم عنوانه ملكك وحدك ولا يتغير. خادم لينكس VPS من rdp.monster يأتي بعنوان IPv4 مخصص، مع صلاحيات جذر كاملة، ومعالج وذاكرة مخصصين، وعرض نطاق غير محدود (ضمن الاستخدام العادل)، ومن دون إجراءات KYC، مع قبول العملات الرقمية، ابتداءً من 8.99 دولار شهرياً. ويصبح الخادم متاحاً بعد نحو 10 ثوانٍ من تأكيد الدفع، فأول أمر ip -br -4 addr تنفّذه عليه لا يبعد سوى لحظات.
الأسئلة الشائعة
لماذا يعرض hostname -I أكثر من عنوان IP؟
hostname -I كل العناوين على جميع الواجهات باستثناء واجهة الاسترجاع والعناوين المحلية للوصلة من نوع IPv6، لذا يعرض جهاز يشغّل Docker أو libvirt أو عميل VPN أو بطاقة شبكة ثانية عدة عناوين. فالواجهة docker0 تضيف 172.17.0.1، وvirbr0 تضيف عادةً 192.168.122.1، ويضيف المضيف ثنائي المكدس عنوان IPv6 العام. والترتيب غير مضمون. وعندما تحتاج إلى العنوان الذي تخرج منه بياناتك فعلاً، نفّذ ip route get 1.1.1.1 واقرأ حقل src فيه بدلاً من ذلك.لماذا يظهر ifconfig برسالة command not found على Ubuntu؟
ifconfig جزء من حزمة net-tools المهجورة لصالح iproute2 وغير الموجودة في التثبيت الافتراضي لإصدارات Ubuntu وDebian وFedora/RHEL الحالية. وبديله هو ip addr المتوفر في كل مكان. وإذا كان سكربت أو عادة قديمة تتطلبه فعلاً، فثبّت الحزمة عبر sudo apt install net-tools أو sudo dnf install net-tools، مع تذكّر أن ifconfig يعرض عنوان IPv4 واحداً فقط لكل واجهة ويخفي العناوين الثانوية المضافة عبر ip addr add.لماذا يعيد hostname -i العنوان 127.0.1.1؟
hostname -i الشبكة إطلاقاً: بل يحلّ اسم مضيف النظام كما يفعل أي تطبيق، عبر /etc/hosts ثم DNS. ويضيف مثبّتا Debian وUbuntu سطراً يربط اسم المضيف بالعنوان 127.0.1.1 كي يتمكن الجهاز من حل اسمه الخاص من دون شبكة، وهذا السطر هو ما يعود إليك. استخدم الصيغة بحرف I كبير، hostname -I، التي تقرأ عناوين الواجهات الحقيقية، أو ip -4 addr للحصول على التفاصيل الكاملة.كيف أعرف عناوين IP لبقية الأجهزة على شبكتي؟
ip neigh show (أو arp -a إذا كانت net-tools مثبتة). وللحصول على صورة كاملة، امسح الشبكة الفرعية بالـping: يسرد nmap -sn 192.168.1.0/24 كل مضيف يستجيب، مع الأسماء عندما يوفرها DNS العكسي. واستبدل ذلك بشبكتك الخاصة التي يمكنك قراءتها من مسار scope link في ip route. وعلى خادم VPS نادراً ما يكون هذا مفيداً، وقد يخالف مسحُ العناوين المجاورة شروطَ المزوّد.Adrien Roche, محرر البنية التحتية والاستضافة
مهندس أنظمة بخبرة تزيد عن 10 سنوات في تشغيل أساطيل Windows Server وLinux. يدير أدريان وثائق البنية التحتية في rdp.monster ويكتب أدلتنا حول RDP واستضافة VPS وإدارة الخوادم والشبكات وأدوات الخصوصية.
مقالات ذات صلة




