עודכן לפני חודש
ICMP הוא האופן שבו האינטרנט מדבר על עצמו.
TCP מעביר את הנתונים שלך. UDP מעביר את הזרמים שלך. אבל כשמשהו משתבש — יעד לא קיים, מנה רצה בלולאה לנצח, הודעה גדולה מדי לנתיב — הרשת צריכה דרך לספר לך על כך. זה ICMP: פרוטוקול הבקרה של האינטרנט.
אם השתמשת פעם ב-ping או ב-traceroute, ניהלת שיחה עם ICMP.
לולאת המשוב של הרשת
ICMP פועל בשכבת הרשת לצד IP. הוא לא מעביר נתוני אפליקציה. הוא מעביר מטא-נתונים על הרשת: דוחות שגיאה, תגובות אבחון, הצעות ניתוב.
כשנתב לא מצליח לגרום למנה להגיע ליעדה, הוא שולח הודעת ICMP שמסבירה מדוע. כשמארח רוצה לבדוק אם מארח אחר פעיל, הוא שולח בקשת echo של ICMP וממתין לתשובה. כשה-TTL של מנה פג, הנתב שהרג אותה שולח הודעת מוות בחזרה לשולח.
ללא ICMP, חיבורים כושלים היו פגים בשקט. מנהלי מערכת לא יכלו לבדוק נגישות בסיסית. נתבים לא יכלו לדווח על בעיות. הרשת הייתה אילמת לגבי כישלונותיה שלה.
סוגי הודעות שחשובים
ICMP מגדיר עשרות סוגי הודעות. כמה מהן נושאות את עיקר המשקל:
בקשת Echo ותשובת Echo (סוגים 8 ו-0) מניעות את פקודת ping. אתה שולח בקשה, היעד שולח בחזרה תשובה עם אותם נתונים. זה מוכיח קישוריות דו-כיוונית ומודד את זמן הלוך-חזור.
יעד לא ניתן להשגה (סוג 3) אומר שהמנה שלך לא יכלה להיות מועברת. הקודים מפרטים מדוע: הרשת אינה מושגת, המארח אינו מושג, הפורט אינו מושג, נדרש פיצול אך אסור. כשאתה מתחבר לפורט UDP סגור, היעד שולח ICMP "פורט לא ניתן להשגה" — כך UDP לומד שאף אחד לא מקשיב.
חריגת זמן (סוג 11) אומר שה-TTL של מנה הגיע לאפס. כל נתב מקטין את ה-TTL ב-1 לפני העברה. כשה-TTL מגיע לאפס, הנתב מוחק את המנה ושולח הודעה זו. המנגנון מונע ממנות לסייר לנצח בלולאות ניתוב. הוא גם מאפשר אחד מכלי האבחון האלגנטיים ביותר שתוכננו אי פעם.
הפניה מחדש (סוג 5) מאפשרת לנתבים להציע נתיבים טובים יותר. אם נתב מקבל מנה שהוא חייב להעביר לנתב אחר באותה רשת, הוא מעביר נכון אך אומר לשולח: בפעם הבאה, שלח ישירות לנתב הטוב יותר.
כיצד Ping עובד
Ping הוא שיחה פשוטה:
- המחשב שלך שולח בקשת echo של ICMP ליעד
- היעד שולח בחזרה תשובת echo של ICMP
- המחשב שלך מודד את זמן הלוך-חזור
כל בקשה כוללת מספר רצף כדי שניתן יהיה להתאים תשובות לבקשות ולזהות אובדן. Ping שולח בדרך כלל בקשה אחת בשנייה, ומגלה אובדן מנות, שינויים בזמן האחזור וקישוריות בסיסית.
ping מוצלח מוכיח שהנתיב קיים בשני הכיוונים. ping כושל מוכיח פחות ממה שאתה עשוי לחשוב — ICMP עלול להיות חסום בכל מקום לאורך הנתיב. רשתות רבות מסננות ping מטעמי אבטחה. מארח שקט אולי מושבת, או אולי פעיל ומתעלם ממך.
כיצד Traceroute עובד
Traceroute אלגנטי יותר ממה שנדמה במבט ראשון.
שדה ה-TTL קיים כמנגנון בטיחות. מנות מקטינות את ה-TTL שלהן בכל קפיצה; כשהוא מגיע לאפס, הן מתות. זה מונע ממנות נצחיות לסתום את הרשת.
Traceroute הופך את מנגנון הבטיחות הזה לנשק. הוא שולח בכוונה מנות שנועדו למות בנקודות מסוימות, ואז קורא את הודעות המוות כדי למפות את הנתיב.
הטכניקה: שלח מנה עם TTL=1. הנתב הראשון מקטין אותו לאפס, הורג את המנה, ושולח בחזרה הודעת "חריגת זמן" של ICMP. הודעה זו חושפת את כתובת הנתב הראשון.
שלח מנה עם TTL=2. היא שורדת את הנתב הראשון, מתה בשני. הודעת מוות נוספת, כתובת נוספת. המשך להגדיל. כל מנה מגיעה קפיצה אחת רחוק יותר לפני שמתה, כל הודעת מוות חושפת עוד נתב אחד בשרשרת.
כשמנה מגיעה סוף סוף ליעד עם TTL עדיין חיובי, היעד מגיב אחרת — תשובת echo או "פורט לא ניתן להשגה", בהתאם למה ש-traceroute שלח. זה מסמן שהנתיב הושלם.
מימושים שונים משתמשים בסוגי בדיקות שונים. traceroute ב-Unix שולח מסורתית UDP לפורטים גבוהים. tracert ב-Windows שולח בקשות echo של ICMP. גרסאות מודרניות תומכות ב-TCP. סוג הבדיקה פחות חשוב מהמנגנון: פקיעת TTL מעוררת הודעות "חריגת זמן" מכל נתב לאורך הדרך.
Traceroute שולח שלוש בדיקות לכל קפיצה כדי למדוד שינויים בזמן האחזור. אם נתב לא מגיב — מוגדר להשתקה או מסונן — אותה קפיצה מציגה כוכביות. הנתיב אינו שלם, אך למדת משהו: איפשהו בפער ההוא, ICMP חסום.
מדוע רשתות חוסמות ICMP
הכוח האבחוני של ICMP יוצר חששות אבטחה. סריקות ping מגלות אילו מארחים פעילים. הצפות ICMP יכולות להציף יעדים. תוקפים העבירו נתונים דרך רשתות שמאפשרות ICMP תוך חסימת פרוטוקולים אחרים.
חומות אש רבות מגבילות ICMP. חלקן חוסמות הכל. חלקן מאפשרות הודעות שגיאה אך חוסמות echo. חלקן מגבילות קצב כדי למנוע הצפות.
אבל חסימת ICMP לחלוטין שוברת דברים. גילוי Path MTU צריך הודעות ICMP "נדרש פיצול" כדי למצוא את גודל המנה הגדול ביותר שמתאים לנתיב. ללא הודעות אלה, מנות גדולות נעלמות בשקט — חיבורים נוצרים בהצלחה, ואז תוקעים כשהם מנסים לשלוח נתונים אמיתיים. הודעות "יעד לא ניתן להשגה" עוזרות ל-TCP להיכשל מהר במקום לפוג לאט. חסימה מלאה של ICMP מקריבה יכולת אבחון תמורת רווחי אבטחה שוליים.
הגישה הסבירה: אפשר "יעד לא ניתן להשגה" ו"חריגת זמן" (חיוניים לתפקוד הרשת), הגבל קצב echo (שימושי אך ניתן לניצול לרעה), חסום הפניות מחדש (לעתים נדירות נדרשות, עלולות להיות מנוצלות לרעה).
ICMPv6: יותר מאבחון
גרסת ה-ICMP של IPv6 עושה את כל מה ש-ICMPv4 עושה, ועוד. מכיוון ש-IPv6 ביטל את ARP, ICMPv6 קלט את תפקיד גילוי השכנים. מארחים משתמשים ב-ICMPv6 כדי למצוא נתבים, ללמוד כתובות ולגלות מי עוד נמצא ברשת המקומית.
זה הופך את ICMPv6 לחובה. השבת אותו ותשבור את פעולת IPv6 הבסיסית. מארחים לא יוכלו למצוא את שער ברירת המחדל שלהם. הם לא יוכלו לפתור כתובות link-local. הרשת פשוט תפסיק לפעול.
סינון ICMPv6 מחייב הבחנה עדינה. חסום את סוגי ההודעות הלא נכונים ותשבור את גילוי השכנים. הפרוטוקול משולב מדי כדי להתייחס אליו כאופציונלי.
קול הרשת
ICMP הוא תשתית אבחון. Ping בודק נגישות. Traceroute ממפה נתיבים. הודעות שגיאה מסבירות כשלים. ללא ICMP, רשתות היו כושלות בשקט ונשארות אטומות לפתרון בעיות.
הבנת ICMP מסבירה מדוע ping לפעמים עובד ולפעמים לא, מדוע traceroute מציג פערים, מדוע חסימת כל ICMP גורמת ליותר בעיות מאשר היא פותרת. לרשת יש קול. ICMP הוא האופן שבו היא מדברת.
שאלות נפוצות על ICMP
מדוע ping עובד לשרתים מסוימים אך לא לאחרים?
שרתים ורשתות רבים חוסמים בקשות echo של ICMP כאמצעי אבטחה. ping כושל לא אומר שהשרת מושבת — הוא אולי פעיל ומשרת תעבורה תוך התעלמות מ-ping. בדוק ישירות דרך השירות עצמו (HTTP, SSH) כדי לבחון זמינות אמיתית.
מה אומרות הכוכביות בפלט traceroute?
כוכביות מצביעות על קפיצה שלא הגיבה עם הודעת "חריגת זמן" של ICMP. הנתב מוגדר לא לשלוח תגובות ICMP, או שחומת אש חוסמת אותן. מנות עדיין עוברות דרך אותה קפיצה — אתה פשוט לא יכול לראות איזה נתב זה.
האם בטוח לחסום לחלוטין ICMP בחומת האש שלי?
לא. חסימה מלאה של ICMP שוברת את גילוי Path MTU, וגורמת לכשלים מסתוריים כשחיבורים עובדים עם מנות קטנות אך תוקעים כשמנסים לשלוח נתונים גדולים יותר. היא גם מונעת הודעות "יעד לא ניתן להשגה" שעוזרות לחיבורים להיכשל מהר. סינון סלקטיבי — אפשר הודעות שגיאה תוך הגבלת קצב echo — מספק אבטחה מבלי לשבור תפקודי רשת.
מה ההבדל בין ping ל-traceroute?
Ping בודק אם יעד ניתן להשגה ומודד זמן אחזור. Traceroute ממפה כל נתב לאורך הנתיב. Ping עונה "האם אני יכול להגיע לשם?" Traceroute עונה "כיצד אני מגיע לשם?" שניהם משתמשים ב-ICMP, אבל traceroute מנצל פקיעת TTL כדי לחשוף קפיצות ביניים ש-ping לעולם לא רואה.
האם דף זה היה מועיל?