From 2a486c6b9eebf878ee83771fb083751e23f78c1d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 8 Feb 2017 00:26:40 +0100 Subject: [PATCH] ipv6 test --- common/net/address.go | 3 + testing/scenarios/vmess_test.go | 116 ++++++++++++++++++++++++++++++++ testing/servers/tcp/tcp.go | 7 +- 3 files changed, 125 insertions(+), 1 deletion(-) diff --git a/common/net/address.go b/common/net/address.go index 342406b1..e3138410 100644 --- a/common/net/address.go +++ b/common/net/address.go @@ -16,6 +16,9 @@ var ( // LocalHostDomain is a constant value for localhost domain. LocalHostDomain = DomainAddress("localhost") + + // LocalHostIPv6 is a constant value for localhost IP in IPv6. + LocalHostIPv6 = IPAddress([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}) ) type AddressFamily int diff --git a/testing/scenarios/vmess_test.go b/testing/scenarios/vmess_test.go index 433825fb..846d130d 100644 --- a/testing/scenarios/vmess_test.go +++ b/testing/scenarios/vmess_test.go @@ -658,3 +658,119 @@ func TestVMessKCP(t *testing.T) { CloseAllServers() } + +func TestVMessIPv6(t *testing.T) { + assert := assert.On(t) + + tcpServer := tcp.Server{ + MsgProcessor: xor, + Listen: v2net.LocalHostIPv6, + } + dest, err := tcpServer.Start() + assert.Error(err).IsNil() + defer tcpServer.Close() + + userID := protocol.NewID(uuid.New()) + serverPort := pickPort() + serverConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: v2net.SinglePortRange(serverPort), + Listen: v2net.NewIPOrDomain(v2net.LocalHostIPv6), + }), + ProxySettings: serial.ToTypedMessage(&inbound.Config{ + User: []*protocol.User{ + { + Account: serial.ToTypedMessage(&vmess.Account{ + Id: userID.String(), + AlterId: 64, + }), + }, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&freedom.Config{}), + }, + }, + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + } + + clientPort := pickPort() + clientConfig := &core.Config{ + Inbound: []*proxyman.InboundHandlerConfig{ + { + ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ + PortRange: v2net.SinglePortRange(clientPort), + Listen: v2net.NewIPOrDomain(v2net.LocalHostIPv6), + }), + ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ + Address: v2net.NewIPOrDomain(dest.Address), + Port: uint32(dest.Port), + NetworkList: &v2net.NetworkList{ + Network: []v2net.Network{v2net.Network_TCP}, + }, + }), + }, + }, + Outbound: []*proxyman.OutboundHandlerConfig{ + { + ProxySettings: serial.ToTypedMessage(&outbound.Config{ + Receiver: []*protocol.ServerEndpoint{ + { + Address: v2net.NewIPOrDomain(v2net.LocalHostIPv6), + Port: uint32(serverPort), + User: []*protocol.User{ + { + Account: serial.ToTypedMessage(&vmess.Account{ + Id: userID.String(), + AlterId: 64, + SecuritySettings: &protocol.SecurityConfig{ + Type: protocol.SecurityType_AES128_GCM, + }, + }), + }, + }, + }, + }, + }), + }, + }, + App: []*serial.TypedMessage{ + serial.ToTypedMessage(&log.Config{ + ErrorLogLevel: log.LogLevel_Debug, + ErrorLogType: log.LogType_Console, + }), + }, + } + + assert.Error(InitializeServerConfig(serverConfig)).IsNil() + assert.Error(InitializeServerConfig(clientConfig)).IsNil() + + conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ + IP: v2net.LocalHostIPv6.IP(), + Port: int(clientPort), + }) + assert.Error(err).IsNil() + + payload := make([]byte, 1024) + rand.Read(payload) + + nBytes, err := conn.Write([]byte(payload)) + assert.Error(err).IsNil() + assert.Int(nBytes).Equals(len(payload)) + + response := readFrom(conn, time.Second, 1024) + assert.Bytes(response).Equals(xor([]byte(payload))) + assert.Error(conn.Close()).IsNil() + + CloseAllServers() +} diff --git a/testing/servers/tcp/tcp.go b/testing/servers/tcp/tcp.go index 2ff8c02a..cf675614 100644 --- a/testing/servers/tcp/tcp.go +++ b/testing/servers/tcp/tcp.go @@ -11,13 +11,18 @@ type Server struct { Port v2net.Port MsgProcessor func(msg []byte) []byte SendFirst []byte + Listen v2net.Address accepting bool listener *net.TCPListener } func (server *Server) Start() (v2net.Destination, error) { + listenerAddr := server.Listen + if listenerAddr == nil { + listenerAddr = v2net.LocalHostIP + } listener, err := net.ListenTCP("tcp", &net.TCPAddr{ - IP: []byte{127, 0, 0, 1}, + IP: listenerAddr.IP(), Port: int(server.Port), Zone: "", })