mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-11-17 18:06:15 -05:00
afb8385a7e
Turn off fake DNS for request sent from Routing and Freedom outbound. Fake DNS now only apply to DNS outbound. This is important for Android, where VPN service take over all system DNS traffic and pass it to core. "UseIp" option can be used in Freedom outbound to avoid getting fake IP and fail connection. Co-authored-by: loyalsoldier <10487845+Loyalsoldier@users.noreply.github.com>
209 lines
5.2 KiB
Go
209 lines
5.2 KiB
Go
package router_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/golang/mock/gomock"
|
|
|
|
. "github.com/v2fly/v2ray-core/v4/app/router"
|
|
"github.com/v2fly/v2ray-core/v4/common"
|
|
"github.com/v2fly/v2ray-core/v4/common/net"
|
|
"github.com/v2fly/v2ray-core/v4/common/session"
|
|
"github.com/v2fly/v2ray-core/v4/features/dns"
|
|
"github.com/v2fly/v2ray-core/v4/features/outbound"
|
|
routing_session "github.com/v2fly/v2ray-core/v4/features/routing/session"
|
|
"github.com/v2fly/v2ray-core/v4/testing/mocks"
|
|
)
|
|
|
|
type mockOutboundManager struct {
|
|
outbound.Manager
|
|
outbound.HandlerSelector
|
|
}
|
|
|
|
func TestSimpleRouter(t *testing.T) {
|
|
config := &Config{
|
|
Rule: []*RoutingRule{
|
|
{
|
|
TargetTag: &RoutingRule_Tag{
|
|
Tag: "test",
|
|
},
|
|
Networks: []net.Network{net.Network_TCP},
|
|
},
|
|
},
|
|
}
|
|
|
|
mockCtl := gomock.NewController(t)
|
|
defer mockCtl.Finish()
|
|
|
|
mockDNS := mocks.NewDNSClient(mockCtl)
|
|
mockOhm := mocks.NewOutboundManager(mockCtl)
|
|
mockHs := mocks.NewOutboundHandlerSelector(mockCtl)
|
|
|
|
r := new(Router)
|
|
common.Must(r.Init(config, mockDNS, &mockOutboundManager{
|
|
Manager: mockOhm,
|
|
HandlerSelector: mockHs,
|
|
}))
|
|
|
|
ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2fly.org"), 80)})
|
|
route, err := r.PickRoute(routing_session.AsRoutingContext(ctx))
|
|
common.Must(err)
|
|
if tag := route.GetOutboundTag(); tag != "test" {
|
|
t.Error("expect tag 'test', bug actually ", tag)
|
|
}
|
|
}
|
|
|
|
func TestSimpleBalancer(t *testing.T) {
|
|
config := &Config{
|
|
Rule: []*RoutingRule{
|
|
{
|
|
TargetTag: &RoutingRule_BalancingTag{
|
|
BalancingTag: "balance",
|
|
},
|
|
Networks: []net.Network{net.Network_TCP},
|
|
},
|
|
},
|
|
BalancingRule: []*BalancingRule{
|
|
{
|
|
Tag: "balance",
|
|
OutboundSelector: []string{"test-"},
|
|
},
|
|
},
|
|
}
|
|
|
|
mockCtl := gomock.NewController(t)
|
|
defer mockCtl.Finish()
|
|
|
|
mockDNS := mocks.NewDNSClient(mockCtl)
|
|
mockOhm := mocks.NewOutboundManager(mockCtl)
|
|
mockHs := mocks.NewOutboundHandlerSelector(mockCtl)
|
|
|
|
mockHs.EXPECT().Select(gomock.Eq([]string{"test-"})).Return([]string{"test"})
|
|
|
|
r := new(Router)
|
|
common.Must(r.Init(config, mockDNS, &mockOutboundManager{
|
|
Manager: mockOhm,
|
|
HandlerSelector: mockHs,
|
|
}))
|
|
|
|
ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2fly.org"), 80)})
|
|
route, err := r.PickRoute(routing_session.AsRoutingContext(ctx))
|
|
common.Must(err)
|
|
if tag := route.GetOutboundTag(); tag != "test" {
|
|
t.Error("expect tag 'test', bug actually ", tag)
|
|
}
|
|
}
|
|
|
|
func TestIPOnDemand(t *testing.T) {
|
|
config := &Config{
|
|
DomainStrategy: Config_IpOnDemand,
|
|
Rule: []*RoutingRule{
|
|
{
|
|
TargetTag: &RoutingRule_Tag{
|
|
Tag: "test",
|
|
},
|
|
Cidr: []*CIDR{
|
|
{
|
|
Ip: []byte{192, 168, 0, 0},
|
|
Prefix: 16,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
mockCtl := gomock.NewController(t)
|
|
defer mockCtl.Finish()
|
|
|
|
mockDNS := mocks.NewDNSClient(mockCtl)
|
|
mockDNS.EXPECT().LookupIP(gomock.Eq("v2fly.org"), dns.IPOption{
|
|
IPv4Enable: true,
|
|
IPv6Enable: true,
|
|
FakeEnable: false,
|
|
}).Return([]net.IP{{192, 168, 0, 1}}, nil).AnyTimes()
|
|
|
|
r := new(Router)
|
|
common.Must(r.Init(config, mockDNS, nil))
|
|
|
|
ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2fly.org"), 80)})
|
|
route, err := r.PickRoute(routing_session.AsRoutingContext(ctx))
|
|
common.Must(err)
|
|
if tag := route.GetOutboundTag(); tag != "test" {
|
|
t.Error("expect tag 'test', bug actually ", tag)
|
|
}
|
|
}
|
|
|
|
func TestIPIfNonMatchDomain(t *testing.T) {
|
|
config := &Config{
|
|
DomainStrategy: Config_IpIfNonMatch,
|
|
Rule: []*RoutingRule{
|
|
{
|
|
TargetTag: &RoutingRule_Tag{
|
|
Tag: "test",
|
|
},
|
|
Cidr: []*CIDR{
|
|
{
|
|
Ip: []byte{192, 168, 0, 0},
|
|
Prefix: 16,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
mockCtl := gomock.NewController(t)
|
|
defer mockCtl.Finish()
|
|
|
|
mockDNS := mocks.NewDNSClient(mockCtl)
|
|
mockDNS.EXPECT().LookupIP(gomock.Eq("v2fly.org"), dns.IPOption{
|
|
IPv4Enable: true,
|
|
IPv6Enable: true,
|
|
FakeEnable: false,
|
|
}).Return([]net.IP{{192, 168, 0, 1}}, nil).AnyTimes()
|
|
|
|
r := new(Router)
|
|
common.Must(r.Init(config, mockDNS, nil))
|
|
|
|
ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2fly.org"), 80)})
|
|
route, err := r.PickRoute(routing_session.AsRoutingContext(ctx))
|
|
common.Must(err)
|
|
if tag := route.GetOutboundTag(); tag != "test" {
|
|
t.Error("expect tag 'test', bug actually ", tag)
|
|
}
|
|
}
|
|
|
|
func TestIPIfNonMatchIP(t *testing.T) {
|
|
config := &Config{
|
|
DomainStrategy: Config_IpIfNonMatch,
|
|
Rule: []*RoutingRule{
|
|
{
|
|
TargetTag: &RoutingRule_Tag{
|
|
Tag: "test",
|
|
},
|
|
Cidr: []*CIDR{
|
|
{
|
|
Ip: []byte{127, 0, 0, 0},
|
|
Prefix: 8,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
mockCtl := gomock.NewController(t)
|
|
defer mockCtl.Finish()
|
|
|
|
mockDNS := mocks.NewDNSClient(mockCtl)
|
|
|
|
r := new(Router)
|
|
common.Must(r.Init(config, mockDNS, nil))
|
|
|
|
ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.LocalHostIP, 80)})
|
|
route, err := r.PickRoute(routing_session.AsRoutingContext(ctx))
|
|
common.Must(err)
|
|
if tag := route.GetOutboundTag(); tag != "test" {
|
|
t.Error("expect tag 'test', bug actually ", tag)
|
|
}
|
|
}
|