HTTP CONNECT and friends

אחת השיטות (מתודות) שפרוטוקול HTTP/1.1 הגדיר היא CONNECT. השיטה הזו נועדה לבקש פתיחת מנהרה לשרת הרצוי משרת הפרוקסי. השימוש העיקרי הוא לפתיחת ערוץ תקשורת עם אתרים מאובטחי SSL\TLS, ולא ששרת הפרוקסי יעביר את הבקשות שלנו בשמנו. וכדי שהאבטחה והפרטיות באמת יתקבלו נרצה לדבר ישירות לאתר המרוחק (לפתוח ערוץ שיחה פרטי). ולכן נשתמש בשיטה זו, מה שכל דפדפן מודרני עושה בהקשר זה. כיוון ששרת הפרוקסי רק מתעל את התקשורת ביננו לאתר המרוחק. ובדרך כלל לא באמת בודק מה אנחנו מעבירים נוכל לנצל שיטה זו לדברים אחרים.

פרוייקט וותיק בשם corkscrew הוא כלי לפתיחת מנהרות דרך HTTP Proxy Server, וכמובן שאפשר לתעל דרכו כל דבר אם כי בדוגמא שניתן היא לגבי SSH ובפרט OpenSSH.

אופן השימוש ב corkscrew מאוד פשוט:

corkscrew proxyhost proxyport remotehost remoteport

לדוגמא אם שרת הפרוקסי בחברה שהמשתמש עובד בה נקרא httpproxy.company.com והוא מאזין בפורט 8080, והמשתמש רוצה לתעל לבית שלו להתחבר ב SSH. והכתובת בבית שלו היא myhome.no-ip.org אז הוא יעשה כך (בשורה אחת):

ssh -o ProxyCommand="corkscrew httpproxy.company.com 8080 myhome.no-ip.org 22" [email protected]

בדוגמא זו הנחתי שמשתמשים בלקוח SSH של OpenSSH. ואחת האפשריות שלו היא ProxyCommand, משמעות האפשרות הזאת היא לתת לתהליך אחר לפתוח את ההתקשרות מול השרת, ולהתממשק לתהליך הזה דרך הפלט\קלט הסטנדרטי.

כמובן שההנחה שלי שהפרוקסי ייתן לנו לפתוח מנהרה בפורט 22, שהוא הפורט הסטנדרטי ל SSH, היא מאוד בעייתית. כי רוב הפרוקסים מגבילים דבר זה לדוגמא:

$ corkscrew localhost 3128 localhost 22
Proxy could not open connnection to localhost:  Forbidden

כיוון שהורתי לשרת ה SSH במחשב שלי להאזין לפורט 443, שהוא הפורט הסטנדרטי ל SSL, אני מסוגל לעשות את הדבר הבא:

$ ncat localhost 3128
CONNECT localhost:443 HTTP/1.1
Host: localhost:443

HTTP/1.0 200 Connection established

SSH-2.0-OpenSSH_5.4

בדוגמא לעיל השתמשתי בכלי  ncat כדי להדגים את מה ש corkscrew עושה. ניתן לראות שאני מורה ל ncat להתחבר ל localhost לפורט 3128, שזה הפורט הסטנדרטי של Squid-Cahce שזה שרת הפרוקסי שאני מריץ כרגע על המחשב שלי. ואז לאחר שנפתחה התקשורות אני הקלדתי את הבקשה לפתיחת מנהרה ככה:

CONNECT localhost:443 HTTP/1.1
Host: localhost:443

שני מעברי השורה הם בכוונה, כי כך מסתיים מקטע הראש (HEAD) בבקשת HTTP.

ולאחר מכן את התשובה של הפרוקסי:

HTTP/1.0 200 Connection established

גם כאן שני מעברי השורה הם הכרחיים כי זה חלק מראש תשובה ב HTTP, לאחר מכן בא התוכן שבמקרה שלנו הוא פשוט התקשורת שמועברת במנהרה והיא ה HelloServer, של פורטוקול ה SSH, ששרת ה SSH , שלי עונה כך:

SSH-2.0-OpenSSH_5.4

שמכאן ניתן לראות שאני מריץ שרת OpenSSH, בגירסא 5.4, והוא רוצה לדבר בפרוטוקול SSH גירסא 2.

כיוון שאני לא יודע לכתוב באופן ידני SSH, אז הנה דוגמא עם שימוש ב ProxyCommand:

$ ssh -o ProxyCommand="corkscrew localhost 3128 localhost 443" [email protected]
[email protected]'s password:
Last login: Tue Jul 13 11:14:31 2010 from localhost
$

וולא!


Leave a Comment

האימייל לא יוצג באתר. שדות החובה מסומנים *

*
*