
מדריך מעשי למנהרות SSH: הפניית פורטים מקומית ומרוחקת
מדריך מעשי למנהרות SSH מ-iximiuz Labs: איך הפניית פורטים מקומית (-L) מגיעה לשירותים מאחורי bastion, איך -R חושף שירות מקומי החוצה ואיך -D הופך את לקוח ה-SSH לפרוקסי SOCKS.
SSH היא טכנולוגיה ותיקה שמסרבת להיעלם, והמנהרות שלה עדיין עושות בפקודה אחת מה שכלים חדשים מתקשים להשוות: להגיע לשירות פנימי ב-VPC דרך bastion ציבורי, לפתוח פורט localhost של מכונת פיתוח מרוחקת בדפדפן, או לחשוף שרת מקומי לעולם החיצון. המדריך המעשי של איוון וליצ'קו ב-iximiuz Labs מסביר הפניית פורטים מקומית, מרוחקת ודינמית; המעבדות רצות על סביבה של ארבעה מארחים ושלוש רשתות.
הפניית פורטים מקומית
הדגל -L מתחיל את ההפניה בצד הלקוח: לקוח ה-SSH מאזין לפורט מקומי, והתעבורה שמגיעה אליו מועברת אל remote_addr:remote_port, כפי שהוא נגיש מהמכונה שאליה התחברתם. התחביר הוא ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr, ו-ssh -f -N -L מריץ את הסשן ברקע. במעבדה הראשונה שרת ווב שמאזין ל-127.0.0.1:80 של המארח המרוחק אינו נגיש מהרשת; אחרי ssh -f -N -L 8080:localhost:80 203.0.113.30 אותו עמוד עונה בפורט המקומי 8080.
הפקודה יכולה להפנות גם אל מכונה שאינה שרת ה-SSH. ב-ssh -L 8081:172.16.0.40:80 203.0.113.30 ה-bastion מקבל את החיבור ופותח קפיצה שנייה אל מארח ה-VPC הפרטי. פורטים שמאזינים ל-loopback דורשים טריק נוסף, כי ההפניה נפתרת ב-bastion והוא אינו רואה את 127.0.0.1 של היעד. הדגל -J קופץ דרך ה-bastion ומסיים את הסשן על היעד עצמו: ssh -f -N -J 203.0.113.30 -L 8082:localhost:9000 172.16.0.40 חושף מקומית פורט דיבאג בלתי נראה לרשת.
הפניית פורטים מרוחקת
המקרה ההפוך — חשיפת שירות מקומי דרך שער ציבורי — משתמש ב-ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr, שבו דווקא שרת ה-sshd פותח את הפורט הנוסף. המלכודת: כברירת מחדל המנהרה נקשרת רק ל-localhost של השער, כך שהשירות נגיש רק מתוך השער עצמו; פרסום בכל הממשקים דורש GatewayPorts yes ב-sshd_config. עם ההגדרה הזו, ssh -f -N -R 0.0.0.0:8080:localhost:80 203.0.113.30 חושף לרשת שרת ווב של מחשב נייד שהיה נגיש רק ל-localhost. וריאציה מאפשרת ללקוח ה-SSH לשמש כ-jump host ולחשוף התקן ברשת ביתית שהשער עצמו אינו מגיע אליו.
הפניה דינמית: SSH כפרוקסי SOCKS
במקום לחבר פורט מקומי אחד ליעד אחד, ssh -D [local_addr:]local_port הופך את לקוח ה-SSH לפרוקסי SOCKS מקומי. כל חיבור מציין את היעד שלו, ושרת ה-SSH פותר אותו, כך שפורט מקומי אחד מגיע לכל מארח ופורט מאחורי ה-bastion: די ב-curl --socks5-hostname localhost:1080 172.16.0.40:80, בתנאי שהלקוח מדבר SOCKS. הסרת היעד מ-R משקפת את הרעיון בצד השרת: sshd עצמו הופך לפרוקסי SOCKS, ומצב זה דורש OpenSSH 7.6 ואילך בצד הלקוח.
איך לזכור את הדגלים
הסיכום של וליצ'קו קצר: -L חושף שירות מרוחק בפורט מקומי, -R חושף שירות מקומי בפורט מרוחק, -D הוא פרוקסי SOCKS מקומי, ו-R בלי יעד הוא פרוקסי על השרת. התזכורת: ssh -L local:remote ו-ssh -R remote:local — ותמיד הצד השמאלי הוא שפותח פורט חדש.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.