כל הדרכים לבדוק אם פורט פתוח בלינוקס

השרת שלך ב־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. ב־Ubuntu, התקן את 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

עד כה, ראית איך לבדוק אם פורט פתוח בלינוקס באמצעות שורת הפקודה. אך מה אם ברצונך לבדוק אם פורט פתוח במכונה מרוחקת? במקרה כזה, אתה יכול להשתמש בכלי nmap.

אך לפני הרצת nmap, חשוב לזכור כי כלי זה עשוי שלא להיות חלק מהחבילות הבסיסיות בהפצת הלינוקס שלך. במקרה כזה, עליך תחילה להתקין את 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

התוצאה מאשרת שמשתמשים יכולים להתחבר ב-SSH למחשב באמצעות כתובת ה-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 ידפיס "מקוון" למסך. אחרת, התסקריפט ידפיס "לא מקוון".

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

תראה אחת מהפלטים הבאים בהתאם לכך האם הפורט פתוח או לא. במקרה זה, הפורט פתוח, מה שהודעת מקוון מאשר.

Check if the 80 port is open

ניתן להשתמש בתסריט הזה כדי לבדוק האם פורט מסוים פתוח בקפיצות זמן או במשימה מתוזמנת. כתיבת תסריטים מועילה במיוחד כאשר יש לבדוק שרתים מרובים. יש רק להעתיק את תסריט check_port.sh זה לכל השרתים שתרצה לבדוק ולהפעיל אותו באמצעות כלים כמו Jenkins או Ansible.

בדיקת פתיחת פורט באמצעות PowerShell

PowerShell מגיע עם cmdlet מובנה לבדיקת חיבורי רשת שנקרא Test-NetConnection – אך הcmdlet זה זמין רק במערכות Windows. אל תדאג; עדיין ניתן להשתמש ב-PowerShell ב-Linux כדי לבדוק פורטים פתוחים וחיבורים באמצעות הclass TcpClient.

אם המחשב שלך ב-Linux אינו מכיל עדיין PowerShell, התקן אותו על ידי מעקב אחר ההוראות במסמך של Microsoft הבא: התקנת PowerShell על Linux.

1. הפעל את PowerShell על ידי הרצת הפקודה הבאה.

pwsh
Launching PowerShell

2. לאחר מכן, צור קובץ בשם Test-Port.ps1 באמצעות עורך הטקסט שלך. בדוגמה זו, אנו משתמשים ב-nano.

nano Test-Port.ps1

3. לאחר מכן, העתק את הקוד לתוך העורך שלך. שמור את הקובץ וצא מהעורך לאחר מכן.

הערה: קטע הקוד הזה הוא חלק מ-כלי בדיקת פורטים לכל סוגי התקשורת PowerShell.

<#
    .סקירה
    פונקציה זו בודקת פורטים פתוחים בTCP/UDP.
    .תיאור
    פונקציה זו בודקת פורט TCP/UDP כלשהו כדי לראות אם הוא פתוח או סגור.
    .הערות

    .פרמטר Computername
    שמות מחשבים מרוחקים אחד או יותר, מופרדים בפסיקים
    .פרמטר Port
    מספרי פורט אחד או יותר, מופרדים בפסיקים, שתרצה לבדוק.
    .פרמטר TcpTimeout
    מספר המילישניות שבהן הפונקציה תמתין עד להכרזה על סגירת הפורט TCP. ברירת מחדל היא 1000.
    .דוגמה
    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 מקבל את רשימת שמות המארחים, שמות המחשב המלאים או כתובות ה-IP של מכונת היעד.

הפרמטר -Port מקבל מערך של מספרי פורט אחד או יותר לבדיקה.

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

כפי שניתן לראות למטה, התוצאה מראה כי פורטים 22 ו-80 פתוחים (נכון), בעוד שפורט 443 לא (שקר).

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. גם למדת לבדוק אם פורט פתוח מתוך סקריפט של שורת פקודה ו-PowerShell. כעת, תוכל להשתמש באחת מהשיטות הללו כדי לבדוק אם פורט פתוח על המחשב שלך או על מחשב מרוחק כלשהו.

אל תעצר כאן, אף על פי כן. תבדוק כתבות אחרות לפתרון בעיות כדי להמשיך לשפר את מיומנויות מנהל המערכת שלך!

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