由于公司經常需要異地辦公,在調試的時候需要用到內網環境,因此手動寫了個代理轉發服務器給兄弟們用:socks5proxy。

選型上,語言上就選擇了Go,簡單清晰,轉發協議選擇了socks5。
SOCKS5協議介紹
SOCKS是一種網絡傳輸協議,主要用于客戶端與外網服務器之間通訊的中間傳遞,SOCKS是"SOCKetS"的縮寫。 SOCKS5是SOCKS4的升級版,其主要多了鑒定、IPv6、UDP支持。
SOCKS5協議可以分為三個部分:
(1) 協議版本及認證方式
(2) 根據認證方式執行對應的認證
(3) 請求信息
(1)協議版本及認證方式
創建與SOCKS5服務器的TCP連接后客戶端需要先發送請求來協議版本及認證方式,
| VER | NMETHODS | METHODS | 
|---|---|---|
| 1 | 1 | 1-255 | 
服務器回復客戶端可用方法:
| VER | METHOD | 
|---|---|
| 1 | 1 | 
代碼實現:
type ProtocolVersion struct {
  VER uint8
  NMETHODS uint8
  METHODS []uint8
}
func (s *ProtocolVersion) handshake(conn net.Conn) error {
  b := make([]byte, 255)
  n, err := conn.Read(b)
  if err != nil {
    log.Println(err)
    return err
  }
  s.VER = b[0] //ReadByte reads and returns a single byte,第一個參數為socks的版本號
  s.NMETHODS = b[1] //nmethods是記錄methods的長度的。nmethods的長度是1個字節
  if n != int(2+s.NMETHODS) {
    return errors.New("協議錯誤, sNMETHODS不對")
  }
  s.METHODS = b[2:2+s.NMETHODS] //讀取指定長度信息,讀取正好len(buf)長度的字節。如果字節數不是指定長度,則返回錯誤信息和正確的字節數
  if s.VER != 5 {
    return errors.New("該協議不是socks5協議")
  }
  //服務器回應客戶端消息:
  //第一個參數表示版本號為5,即socks5協議,
  // 第二個參數表示服務端選中的認證方法,0即無需密碼訪問, 2表示需要用戶名和密碼進行驗證。 
  resp :=[]byte{5, 0} 
  conn.Write(resp)
  return nil
} 
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
                網站欄目:基于go手動寫個轉發代理服務的代碼實現-創新互聯
                
                文章源于:http://www.yijiale78.com/article32/ceihpc.html
            
成都網站建設公司_創新互聯,為您提供靜態網站、建站公司、網站營銷、云服務器、動態網站、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯
