جميع الطرق للتحقق مما إذا كان منفذ مفتوح في نظام Linux

يتم تشغيل خادم Linux الخاص بك ، وترغب الآن في التحقق مما إذا كان منفذ محدد مفتوحًا حتى تتمكن من الوصول إليه عن بُعد. يعد التحقق من الأبواب المفتوحة مهمة شائعة لمسؤولي النظام ، وهناك بضع طرق مختلفة للقيام بذلك في Linux.

في هذه المقالة ، ستتعلم عدة طرق للتحقق مما إذا كان منفذ مفتوحًا في Linux حتى تتمكن من اختيار الأفضل بالنسبة لك. هل أنت مستعد؟ استمر في القراءة!

المتطلبات

سيكون هذا البرنامج التعليمي عرضًا عمليًا. إذا كنت ترغب في متابعة ، تأكد من وجود ما يلي.

  • A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
  • الوصول إلى واجهة سطر الأوامر. إذا كنت تستخدم بيئة سطح مكتب رسومية ، فابحث عن برنامج محاكي لوحة المفاتيح في قائمة التطبيقات الخاصة بك. أو ، إذا قمت بتسجيل الدخول إلى خادم بعيد عبر SSH ،
  • A user account with sudo privileges. For simplicity, this tutorial uses the root user.

تحقق مما إذا كان منفذًا مفتوحًا في Linux باستخدام netstat

الطريقة الأولى للتحقق مما إذا كان منفذًا مفتوحًا في Linux هي تشغيل الأمر “netstat”. يعرض هذا الأمر اتصالات الشبكة وجداول التوجيه وإحصاءات الواجهة الشبكية العديدة.

يعد الأمر “netstat” جزءًا من حزمة “net-tools” ، وقد لا تأتي هذه الحزمة افتراضيًا مع توزيعة Linux الخاصة بك. في أوبونتو ، قم بتثبيت “netstat” عن طريق تشغيل الأوامر التالية في وحدة التحكم.

apt update -y && apt install net-tools -y

لنفترض أن لديك خادم ويب NGINX يعمل وترغب في التحقق مما إذا كان منفذ 80 مفتوحًا. يمكنك القيام بذلك عن طريق تشغيل الأمر التالي. استبدل 80 برقم المنفذ الذي ترغب في التحقق منه.

توجيه العلامات -tulpn netstat بعرض جميع المنافذ الاستماع. يقوم الأمر grep الأول بالعثور على السطر الذي يحتوي على كلمة LISTEN في النتيجة وتصفيته. يقوم الأمر grep الثاني بتصفية النتائج لعرض فقط تلك العناصر التي تتطابق مع :80.

netstat -tulpn | grep LISTEN | grep :80

لمعرفة المزيد حول علامات netstat، قم بتشغيل الأمر netstat –help.

إذا كان المنفذ مفتوحًا، فسترى النتيجة التالية. كما يمكنك رؤية، فإن النتيجة تظهر أن المنفذ 80 مفتوحًا على النظام. tcp هو نوع البروتوكول، و :::80 يشير إلى أنه منفذ TCPv6. 0.0.0.0:80 يعني أن المنفذ مفتوح لجميع عناوين IPv4. 80 هو منفذ HTTP الافتراضي الذي يخدم الوصول إلى الموقع على الويب.

Checking If a Port is Open with netstat

التحقق مما إذا كان منفذ مفتوحًا باستخدام ss

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

مثل الأمر netstat، يوجه العلم -t الأمر ss لعرض المقابس TCP فقط، -u لعرض المقابس UDP فقط، و -l لعرض المقابس الاستماعية فقط. يشير العلم -p إلى اسم العملية أو PID الذي يستخدم المنفذ.

ss -tulpn | grep LISTEN | grep :80

سترى الناتج التالي إذا كان المنفذ مفتوحًا. كما ترى، يتضمن الناتج اسم العملية و PID لكل منفذ استماع. في هذه الحالة، المنفذ 80 مفتوح، ويستخدم خادم الويب NGINX هذا المنفذ.

Checking If a Port is Open Using ss

التحقق مما إذا كان المنفذ مفتوحًا باستخدام lsof

الأمر lsof هو أداة مفيدة أخرى لفحص المنافذ المفتوحة. يعني اسم lsof قائمة الملفات المفتوحة، والتي تعرض معلومات حول الملفات التي تم فتحها على النظام. تشمل هذه المعلومات معرفات الملفات، ومعرفات العمليات، ومعرفات المستخدمين، إلخ.

كيف يساعدك سرد الملفات المفتوحة في تحديد ما إذا كان المنفذ مفتوحًا؟ ربما سمعت بالفعل عبارة “كل شيء في لينكس هو ملف”، وهذه العبارة تعني ما تقوله.

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

العلم: يُشير العلم -i إلى lsof بعرض جميع مأخذات الإنترنت المفتوحة. يُظهر العلم -P أرقام المنافذ بدلاً من أسماء الخدمات. ويُكبِّر العلم -n بحث DNS وأسماء الخدمات، لذا سترى عناوين IP بدلاً من أسماء الضيوف البعيدة.

lsof -i -P -n | grep LISTEN | grep :22

إذا كانت البورت مفتوحًا، سترى الناتج التالي. كما ترون، يحتوي الناتج على معلومات حول:

  • 1027 هو معرف العملية لخدمة sshd.
  • root هو معرف المستخدم الذي يستخدم البورت.
  • 3u و 4u هي وصفي الملف لـ IPv4 و IPv6 على التوالي.
  • 31035 و 31037 هي منافذ الشبكة لـ IPv4 و IPv6 على التوالي.
  • :22 يشير إلى أن البورت 22 مفتوح لجميع عناوين IPv4 و IPv6.
  • (LISTEN) يشير إلى أن البورت يستمع للاتصالات الواردة.
  • 0t0 هو حالة المأخذ، مما يعني أن المأخذ في حالة الاستماع (LISTEN).
Checking If a Port is Open Using lsof

التحقق مما إذا كان البورت مفتوحًا باستخدام nmap

حتى الآن، رأيت كيفية التحقق مما إذا كان البورت مفتوحًا على Linux باستخدام سطر الأوامر. ولكن ماذا لو أردت التحقق مما إذا كان البورت مفتوحًا على جهاز بعيد؟ في هذه الحالة، يمكنك استخدام أداة nmap.

لكن قبل تشغيل nmap، تنبيه أن هذه الأداة قد لا تكون جزءًا من الحزم الافتراضية في توزيعة Linux الخاصة بك. في هذه الحالة، يجب عليك أولاً تثبيت nmap عن طريق تشغيل الأمر التالي.

apt install nmap -y

الآن، قم بتشغيل الأمر التالي للتحقق مما إذا كان منفذ مفتوحًا على جهاز بعيد. يختبر هذا الأمر ما إذا كان منفذ 22 مفتوحًا على 159.89.176.25 بحيث يمكن لمستخدمك الدخول إلى خادمك عبر SSH. قم بتبديل عنوان IP حسب الحاجة بالخاص بك.

nmap -p 22 159.89.176.25

كما يمكنك رؤية، فإن الإخراج يحتوي على معلومات حول:

  • وقت بدء فحص المنفذ (2022-06-30 16:58 UTC).
  • عنوان IP للجهاز البعيد (159.89.176.25).
  • حالة المنفذ (مفتوح).
  • الخدمة التي تستخدم المنفذ (ssh).
  • حالة المضيف (متصل).
Checking If a Port is Open Using nmap

النتيجة تؤكد أن المستخدمين يمكنهم الدخول إلى الكمبيوتر باستخدام عنوان IP والمنفذ.

ssh [email protected] -p 22

يظهر اللقطة الشاشية أدناه اتصال SSH ناجح بالخادم، مما يثبت أن المنفذ 22 مفتوح.

SSHing into your server

اختبار ما إذا كان منفذ مفتوحًا من خلال سكريبت القابوس

التلقائية دائمًا فكرة جيدة. فحص المنافذ المفتوحة عن طريق تشغيل سكريبت قابوس هو طريقة ممتازة لاختبار عدة منافذ. يمكنك استخدام أي طرق سابقة للتحقق مما إذا كان منفذ مفتوحًا. ولكن، لهذا المثال، ستكتب سكريبت قابوس أساسي يقوم بتشغيل الأمر Netcat nc.

1. قم بإنشاء ملف باسم check_port.sh في دليلك الرئيسي باستخدام محرر النص المفضل لديك. يستخدم هذا المثال نانو (nano).

nano check_port.sh

2. انسخ الكود العينة أدناه إلى محرر النص الخاص بك. قم بتغيير الرقم 80 برقم المنفذ الذي ترغب في التحقق منه.

الشرط if يتحقق مما إذا كان منفذ 80 مفتوحًا باستخدام أمر nc. تقوم الأرقام 2>&1 و >/dev/null بتوجيه الأخطاء والرسائل الناتجة إلى /dev/null، على التوالي. الملف /dev/null هو ملف خاص يتجاهل كل ما يتلقاه.

إذا كان المنفذ مفتوحًا، فسيقوم نصيب check_port.sh بطباعة كلمة “Online” على وحدة التحكم. في حالة عدم ذلك، سيقوم النص بطباعة كلمة “Offline”.

if ( nc -zv localhost 80 2>&1 >/dev/null ); then
    echo 'Online'
else
    echo 'Offline'
fi

يجب أن يكون ملف النص المكتوب مشابهًا للشاشة أدناه. احفظ النص واخرج من المحرر.

Creating the Shell script

3. قم بتشغيل السيناريو الشل لبدء التحقق من المنافذ المفتوحة التي حددتها داخل السيناريو.

bash check_port.sh

سترى أحد الإخراجات التالية اعتمادًا على ما إذا كان المنفذ مفتوحًا. في هذه الحالة، يتأكد الرسالة Online من أن المنفذ مفتوح.

Check if the 80 port is open

يمكنك استخدام هذا السكريبت الخاص بالشل للتحقق مما إذا كان منفذ مفتوحًا بفاصل زمني أو وظيفة مجدولة. البرمجة النصية مفيدة بشكل خاص عندما تحتاج إلى التحقق من عدة خوادم. تحتاج فقط إلى نسخ هذا السكريبت check_port.sh إلى جميع الخوادم التي تريد التحقق منها وتشغيله باستخدام أدوات CI/CD مثل Jenkins أو Ansible.

اختبار ما إذا كان منفذ مفتوحًا باستخدام PowerShell

PowerShell لديه cmdlet مدمج لاختبار الاتصالات الشبكية يسمى Test-NetConnection – ولكن هذا الcmdlet متاح فقط على أنظمة Windows. لا تقلق؛ يمكنك ما زلت استخدام PowerShell في Linux للتحقق من المنافذ المفتوحة والاتصالات باستخدام فئة TcpClient.

إذا لم يكن لديك جهاز كمبيوتر Linux الخاص بك PowerShell بعد ، قم بتثبيته باتباع التعليمات في هذا الوثائق من Microsoft: تثبيت PowerShell على Linux.

1. قم بتشغيل PowerShell عن طريق تشغيل الأمر أدناه.

pwsh
Launching PowerShell

2. بعد ذلك ، قم بإنشاء ملف يسمى Test-Port.ps1 باستخدام محرر النص الخاص بك. يستخدم هذا المثال nano.

nano Test-Port.ps1

3. بعد ذلك ، قم بنسخ الكود أدناه إلى محررك. احفظ الملف واخرج من المحرر بعد ذلك.

ملاحظة: هذا الشيفرة هو مقتطف من أداة اختبار البورتات باستخدام PowerShell المتكاملة.

<#
	.SYNOPSIS
		تقوم هذه الوظيفة بفحص البورتات المفتوحة TCP/UDP.
	.DESCRIPTION
		تقوم هذه الوظيفة بفحص أي بورت TCP/UDP لمعرفة ما إذا كان مفتوحًا أو مغلقًا.
	.NOTES

	.PARAMETER Computername
		اسم أو أسماء أكثر من حاسوب بعيد، مفصولة بفواصل
	.PARAMETER Port
		رقم أو أرقام البورت المفصولة بفواصل التي ترغب في اختبارها.
	.PARAMETER TcpTimeout
		عدد ميلي الثانية التي ستنتظرها الوظيفة حتى تعلن
		إغلاق البورت TCP. الافتراضي هو 1000.
	.EXAMPLE
		PS> Test-Port -Computername 'LABDC','LABDC2' -Protocol TCP 80,443
		
		هذا المثال يختبر بورتي الشبكة TCP 80 و 443 على كل من خوادم
		LABDC و LABDC2.
	#>
[CmdletBinding()]
[OutputType([System.Management.Automation.PSCustomObject])]
param (
    [Parameter(Mandatory)]
    [string[]]$ComputerName,
    [Parameter(Mandatory)]
    [int[]]$Port,
    [Parameter()]
    [int]$TcpTimeout = 1000
)
begin {
    $Protocol = 'TCP'
}
process {
    foreach ($Computer in $ComputerName) {
        foreach ($Portx in $Port) {            
            $Output = @{ 'Computername' = $Computer; 'Port' = $Portx; 'Protocol' = $Protocol; 'Result' = '' }
            Write-Verbose "$($MyInvocation.MyCommand.Name) - Beginning port test on '$Computer' on port '$Protocol<code>:$Portx'"

            $TcpClient = New-Object System.Net.Sockets.TcpClient
            $Connect = $TcpClient.BeginConnect($Computer, $Portx, $null, $null)
            $Wait = $Connect.AsyncWaitHandle.WaitOne($TcpTimeout, $false)
            if (!$Wait -or !($TcpClient.Connected)) {
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' failed port test on port '$Protocol</code>:$Portx'"
                $Output.Result = $false
            }
            else {
                $TcpClient.EndConnect($Connect)
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol<code>:$Portx'"
                $Output.Result = $true
                $TcpClient.Close()
                $TcpClient.Dispose()
            }
            [pscustomobject]$Output
        }
    }
}

4. بعد حفظ الشيفرة Test-Port.ps1، قم بتشغيل الأمر أدناه لاختبار البورتات 22، 80، 443، و 53.

يقبل المعامل -ComputerName قائمة بأسماء الأجهزة، FQDN، أو عناوين IP المستهدفة.

يقبل المعامل -Port مصفوفة تحتوي على رقم أو أرقام بورت للاختبار.

./Test-Port.ps1 -ComputerName localhost -Port 22,80,443

كما يمكنك رؤية أدناه، يظهر النتيجة أن البورتين 22 و 80 مفتوحين (True)، في حين أن البورت 443 ليس مفتوحًا (False).

Checking for open ports using PowerShell scripting

لتشغيل نفس الشيفرة ضد عدة نقاط نهاية مستهدفة وبورتات، قم بتعديل الشيفرة أدناه لإضافة جميع أجهزة الكمبيوتر المستهدفة في معامل ComputerName وأرقام البورت في معامل Port.

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53
Checking for open ports on multiple targets using PowerShell scripting

الختام

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

لكن لا تتوقف هنا، تحقق من المقالات الأخرى لمواصلة تنمية مهاراتك كمسؤول نظام!

Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/