Advertisement
Guest User

client / reverse proxy

a guest
Aug 17th, 2016
435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.50 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "net"
  5.     "fmt"
  6.     "./socks5"
  7.     "golang.org/x/net/context"
  8.     "io"
  9.     "time"
  10.     "flag"
  11. )
  12.  
  13. type DNSResolverSimple struct {
  14.    
  15. }
  16.  
  17. func (d DNSResolverSimple) Resolve(ctx context.Context, name string) (context.Context, net.IP, error) {
  18.     addr, err := net.ResolveIPAddr("ip", name)
  19.     if err != nil {
  20.         return ctx, nil, err
  21.     }
  22.     return ctx, addr.IP, err
  23. }
  24.  
  25.  
  26. func Socks5Server(socksHost string){
  27.  
  28.     // Create a SOCKS5 server
  29.     drslv := DNSResolverSimple{}
  30.     conf := &socks5.Config{
  31.         Resolver: drslv,
  32.     }
  33.     server, err := socks5.New(conf)
  34.     if err != nil {
  35.         fmt.Println(err)
  36.         return
  37.     }
  38.  
  39.     // Create SOCKS5 proxy on localhost port 8000
  40.     if err := server.ListenAndServe("tcp", socksHost); err != nil {
  41.         fmt.Println(err) // panic(err)
  42.         return
  43.     }
  44.  
  45. }
  46.  
  47. func Forward(dst net.Conn, src net.Conn) {
  48.     for {
  49.         fmt.Println("*** Start forwarding ***")
  50.        
  51.         go func() {
  52.             written, err := io.Copy(src, dst)
  53.             if err != nil || written <= 0{
  54.                 fmt.Println("*** Forwarding copy error ***")
  55.                 src.Close()
  56.                 return
  57.             }
  58.         }()
  59.         written, err := io.Copy(dst, src)
  60.  
  61.         if err != nil || written <= 0{
  62.             fmt.Println("*** Forwarding copy error ***")
  63.             return
  64.         }        
  65.         fmt.Println("*** Finished forwarding ***")
  66.     }
  67. }
  68.  
  69. func main() {  
  70.        
  71.     flgRemoteHost := flag.String("r", "", "Address of remote host")
  72.     flgLocalSocks5 := flag.String("s", "", "Port / Address of local SOCKS proxy")
  73.     flag.Parse()
  74.  
  75.     if *flgRemoteHost == "" {
  76.         fmt.Println("Invalid remote host")
  77.         return
  78.     }
  79.  
  80.     if *flgLocalSocks5 == "" {
  81.         fmt.Println("Invalid local SOCKS5 server address")
  82.         return
  83.     }
  84.     fmt.Println("*** Start SOCKS5 server ***")
  85.     go Socks5Server(*flgLocalSocks5)    
  86.    
  87.     // Wait for the socks5 server to start...
  88.     time.Sleep(3 * time.Second)
  89.  
  90.     fmt.Println("*** Connect to remote server ***")
  91.     connRemote, errConnRemote := net.Dial("tcp", *flgRemoteHost)
  92.     connLocalSocks, errConnSocks := net.Dial("tcp", *flgLocalSocks5)
  93.    
  94.     if errConnSocks != nil {
  95.         fmt.Println(errConnSocks)
  96.         return
  97.     }
  98.     if errConnRemote != nil {
  99.         fmt.Println(errConnRemote)
  100.         return
  101.     }
  102.    
  103.     for {
  104.         Forward(connLocalSocks, connRemote)
  105.         time.Sleep(5 * time.Second)
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement