פתרון שמות מארחים ב-SOCKS5 בלקוח ה-HTTP של Go
מדוע socks5 ו-socks5h אינם בוחרים מצבי DNS שונים בתעבורת ה-HTTP הסטנדרטית של Go.
בתעבורת ה-HTTP הסטנדרטית של Go 1.27.3, socks5 ו-socks5h מטפלים בשמות היעד באותה דרך. יעד שמצוין בשם מארח נשלח לפרוקסי כשם מארח. החלפה בין הסכמות האלה אינה מחליפה בין DNS מקומי למרוחק כפי שקורה ב-curl.
package main
import (
"fmt"
"log"
"net/http"
"net/url"
"time"
)
func main() {
proxyURL, err := url.Parse("socks5://203.0.113.10:1080")
if err != nil {
log.Fatal(err)
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
defer transport.CloseIdleConnections()
client := &http.Client{
Transport: transport,
Timeout: 15 * time.Second,
}
response, err := client.Get("https://example.com/")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
fmt.Println(response.StatusCode)
}
החליפו את כתובת הדוגמה המיועדת לתיעוד בנקודת הקצה שלכם ל-SOCKS5; אפשר לעיין באפשרויות ברשימת שרתי הפרוקסי של SOCKS5. הדוגמה משתמשת במנגנון התעבורה של net/http עצמו; ספריית Go אחרת עשויה לממש התנהגות שונה.
עדיין יש להבחין בין שני שמות. כתובת מספרית של פרוקסי אינה דורשת חיפוש של שם מארח הפרוקסי; פרוקסי שמצוין בשם חייב להימצא מקומית לפני שאפשר לשלוח בקשת SOCKS. ליעד מספרי אין שם יעד לפתרון, ולכן הוא אינו יכול להדגים טיפול בשמות מארחים. כדי לבדוק את הבחירה בפועל ב-SOCKS, בדקו אם שדה היעד מכיל שם או כתובת.
מנגנון התעבורה הסטנדרטי תומך בסכמות הפרוקסי http, https, socks5 ו-socks5h. תווית כללית של SOCKS אינה מוכיחה שנקודת הקצה תומכת ב-SOCKS5. דוגמה זו שולחת HTTP על גבי TCP ואינה בודקת פקודות SOCKS אחרות או העברת UDP.