sample socks proxy

This commit is contained in:
V2Ray committed 2015-09-11 14:12:09 +02:00
1 parent 0a96b8fb1d
commit 262eb4f985
10 files changed
+184 -31

No files matched your search

+32 -4
View File
@@ -3,7 +3,9 @@ package socks
import (
"errors"
"io"
"log"
"net"
"strconv"
"github.com/v2ray/v2ray-core"
socksio "github.com/v2ray/v2ray-core/io/socks"
@@ -26,8 +28,8 @@ func NewSocksServer(vp *core.VPoint) *SocksServer {
return server
}
func (server *SocksServer) Listen(port uint8) error {
listener, err := net.Listen("tcp", ":"+string(port))
func (server *SocksServer) Listen(port uint16) error {
listener, err := net.Listen("tcp", ":"+strconv.Itoa(int(port)))
if err != nil {
return err
}
@@ -40,6 +42,7 @@ func (server *SocksServer) AcceptConnections(listener net.Listener) error {
for server.accepting {
connection, err := listener.Accept()
if err != nil {
log.Print(err)
return err
}
go server.HandleConnection(connection)
@@ -52,10 +55,14 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error {
auth, err := socksio.ReadAuthentication(connection)
if err != nil {
log.Print(err)
return err
}
log.Print(auth)
if auth.HasAuthMethod(socksio.AuthNotRequired) {
if !auth.HasAuthMethod(socksio.AuthNotRequired) {
// TODO send response with FF
log.Print(ErrorAuthenticationFailed)
return ErrorAuthenticationFailed
}
@@ -64,15 +71,33 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error {
request, err := socksio.ReadRequest(connection)
if err != nil {
log.Print(err)
return err
}
response := socksio.NewSocks5Response()
if request.Command == socksio.CmdBind || request.Command == socksio.CmdUdpAssociate {
response := socksio.NewSocks5Response()
response.Error = socksio.ErrorCommandNotSupported
socksio.WriteResponse(connection, response)
log.Print(ErrorCommandNotSupported)
return ErrorCommandNotSupported
}
response.Error = socksio.ErrorSuccess
response.Port = request.Port
response.AddrType = request.AddrType
switch response.AddrType {
case socksio.AddrTypeIPv4:
copy(response.IPv4[:], request.IPv4[:])
case socksio.AddrTypeIPv6:
copy(response.IPv6[:], request.IPv6[:])
case socksio.AddrTypeDomain:
response.Domain = request.Domain
}
socksio.WriteResponse(connection, response)
ray := server.vPoint.NewInboundConnectionAccepted(request.Destination())
input := ray.InboundInput()
@@ -90,7 +115,9 @@ func (server *SocksServer) dumpInput(conn net.Conn, input chan<- []byte, finish
for {
buffer := make([]byte, 256)
nBytes, err := conn.Read(buffer)
log.Printf("Reading %d bytes, with error %v", nBytes, err)
if err == io.EOF {
close(input)
finish <- true
break
}
@@ -105,7 +132,8 @@ func (server *SocksServer) dumpOutput(conn net.Conn, output <-chan []byte, finis
finish <- true
break
}
conn.Write(buffer)
nBytes, _ := conn.Write(buffer)
log.Printf("Writing %d bytes", nBytes)
}
}
+39
View File
@@ -0,0 +1,39 @@
package socks
import (
"bytes"
"testing"
"github.com/v2ray/v2ray-core"
"github.com/v2ray/v2ray-core/testing/mocks"
"github.com/v2ray/v2ray-core/testing/unit"
)
func TestSocksTcpConnect(t *testing.T) {
t.Skip("Not ready yet.")
assert := unit.Assert(t)
port := 12384
uuid := "2418d087-648d-4990-86e8-19dca1d006d3"
vid, err := core.UUIDToVID(uuid)
assert.Error(err).IsNil()
config := VConfig{
port,
[]core.VUser{VUser{vid}},
"",
[]core.VNext{}}
och := new(FakeOutboundConnectionHandler)
och.Data2Send = bytes.NewBuffer(make([]byte, 1024))
och.Data2Return = []byte("The data to be returned to socks server.")
vpoint, err := NewVPoint(&config, SocksServerFactory{}, och)
assert.Error(err).IsNil()
err = vpoint.Start()
assert.Error(err).IsNil()
}
+2 -2
View File
@@ -7,6 +7,6 @@ import (
type SocksServerFactory struct {
}
func (factory *SocksServerFactory) Create(vp *core.VPoint) *SocksServer {
return NewSocksServer(vp)
func (factory SocksServerFactory) Create(vp *core.VPoint) (core.InboundConnectionHandler, error) {
return NewSocksServer(vp), nil
}