Skip to content

Commit f933aca

Browse files
authored
fix: support dns lookup local hosts file (#12)
1 parent 11a5f3d commit f933aca

File tree

9 files changed

+55
-31
lines changed

9 files changed

+55
-31
lines changed

cmd/local.go

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func init() {
3939
localCmd.Flags().StringVarP(&cfg.Local.MixedAddr, "mixed", "M", "", "mixed proxy for SOCKS and HTTP")
4040
localCmd.Flags().StringSliceVar(&cfg.Local.TCPTunAddr, "tcp-tun", nil, "simple tcp tun listening address (format: \"local:port=remote:port\")")
4141
localCmd.Flags().BoolVar(&cfg.Local.SystemProxy, "system-proxy", false, "enable system proxy settings")
42+
localCmd.Flags().BoolVar(&cfg.Local.LookupHostsFile, "lookup-hostsfile", false, "dns lookup local hosts file")
4243

4344
// ssr
4445
localCmd.Flags().StringVarP(&cfg.Server[0].Type, "type", "T", "", "enable shadowsocksr")

config/config.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,17 @@ type MitmOption struct {
110110
}
111111

112112
type LocalConfig struct {
113-
SocksAddr string `yaml:"socks_addr,omitempty" json:"socks_addr,omitempty"`
114-
HTTPAddr string `yaml:"http_addr,omitempty" json:"http_addr,omitempty"`
115-
SocksAuth string `yaml:"socks_auth,omitempty" json:"socks_auth,omitempty"`
116-
HTTPAuth string `yaml:"http_auth,omitempty" json:"http_auth,omitempty"`
117-
MixedAddr string `yaml:"mixed_addr,omitempty" json:"mixed_addr,omitempty"`
118-
TCPTunAddr []string `yaml:"tcp_tun_addr,omitempty" json:"tcp_tun_addr,omitempty"`
119-
SystemProxy bool `yaml:"system_proxy,omitempty" json:"system_proxy,omitempty"`
120-
Mitm *MitmOption `yaml:"mitm,omitempty" json:"mitm,omitempty"`
121-
Tun *TunOption `yaml:"tun,omitempty" json:"tun,omitempty"`
122-
DNS *DnsOption `yaml:"dns,omitempty" json:"dns,omitempty"`
113+
SocksAddr string `yaml:"socks_addr,omitempty" json:"socks_addr,omitempty"`
114+
HTTPAddr string `yaml:"http_addr,omitempty" json:"http_addr,omitempty"`
115+
SocksAuth string `yaml:"socks_auth,omitempty" json:"socks_auth,omitempty"`
116+
HTTPAuth string `yaml:"http_auth,omitempty" json:"http_auth,omitempty"`
117+
MixedAddr string `yaml:"mixed_addr,omitempty" json:"mixed_addr,omitempty"`
118+
TCPTunAddr []string `yaml:"tcp_tun_addr,omitempty" json:"tcp_tun_addr,omitempty"`
119+
SystemProxy bool `yaml:"system_proxy,omitempty" json:"system_proxy,omitempty"`
120+
LookupHostsFile bool `yaml:"lookup_hostsfile,omitempty" json:"lookup_hostsfile,omitempty"`
121+
Mitm *MitmOption `yaml:"mitm,omitempty" json:"mitm,omitempty"`
122+
Tun *TunOption `yaml:"tun,omitempty" json:"tun,omitempty"`
123+
DNS *DnsOption `yaml:"dns,omitempty" json:"dns,omitempty"`
123124
}
124125

125126
type Domain struct {
@@ -468,6 +469,10 @@ func (cfg *Config) BuildLocalOptions() []ss.SSOption {
468469
opts = append(opts, ss.WithSystemProxy())
469470
}
470471

472+
if cfg.Local.LookupHostsFile {
473+
opts = append(opts, ss.WithLookupHostsFile())
474+
}
475+
471476
return opts
472477
}
473478

example-configs/simple-client-config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ local:
1212
mixed_addr: :10088
1313
# socks_auth: "123:123"
1414
# http_auth: '123:123'
15+
lookup_hostsfile: true
1516
log:
1617
color: true
1718
log_level: trace

resolver/resolver.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ type nameserverExt struct {
3737
type Resolver struct {
3838
*fakeIPResolver
3939
// UDP/TCP/DoT/DoH
40-
nameservers []nameserverExt
41-
clients map[string]*DnsClient
42-
lookupGroup singleflight.Group
40+
nameservers []nameserverExt
41+
clients map[string]*DnsClient
42+
lookupGroup singleflight.Group
43+
lookupHostPref bool
4344
}
4445

4546
func parseNameserver(nameservers []string) []nameserverExt {
@@ -112,7 +113,7 @@ func parseNameserver(nameservers []string) []nameserverExt {
112113
return list
113114
}
114115

115-
func NewDnsResolver(nameservers []string) *Resolver {
116+
func NewDnsResolver(nameservers []string, lookupHostsFile bool) *Resolver {
116117
nameserver := parseNameserver(nameservers)
117118
// default system config dns
118119
fallback := parseNameserver(dnsutil.GetLocalDnsList())
@@ -121,8 +122,9 @@ func NewDnsResolver(nameservers []string) *Resolver {
121122
}
122123

123124
resolver := &Resolver{
124-
clients: make(map[string]*DnsClient),
125-
nameservers: append(nameserver, fallback...),
125+
clients: make(map[string]*DnsClient),
126+
nameservers: append(nameserver, fallback...),
127+
lookupHostPref: lookupHostsFile,
126128
}
127129

128130
for _, ns := range resolver.nameservers {
@@ -157,6 +159,12 @@ func (r *Resolver) LookupHost(ctx context.Context, host string) netip.Addr {
157159
}
158160

159161
func (r *Resolver) LookupIP(ctx context.Context, host string) ([]netip.Addr, error) {
162+
if r.lookupHostPref {
163+
ip := hostsutil.LookupIP(host)
164+
if ip.IsValid() {
165+
return []netip.Addr{ip}, nil
166+
}
167+
}
160168
ipsCh := make(chan []netip.Addr, 1)
161169
// lookup ipv6 address
162170
go func() {

resolver/resolver_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestDnsResolver(t *testing.T) {
2424
"https://dns.alidns.com/dns-query",
2525
}
2626
logger.Logger = logger.LogContext.Copy().WithCaller(false, true, false, true).BuildConsoleLogger(logx.LevelTrace)
27-
r := NewDnsResolver(nameservers)
27+
r := NewDnsResolver(nameservers, false)
2828

2929
for _, ns := range nameservers {
3030
for i := 0; i < 2; i++ {

ss/option.go

+17-10
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,17 @@ type serverOptions struct {
2828
}
2929

3030
type localOptions struct {
31-
socksAddr string
32-
httpAddr string
33-
mixedAddr string
34-
socksAuth *Auth
35-
httpAuth *Auth
36-
tcpTunAddr [][]string
37-
systemProxy bool
38-
enableTun bool
39-
enhancerConfig enhancer.EnhancerConfig
40-
mitmConfig proxy.MimtOption
31+
socksAddr string
32+
httpAddr string
33+
mixedAddr string
34+
socksAuth *Auth
35+
httpAuth *Auth
36+
tcpTunAddr [][]string
37+
systemProxy bool
38+
enableTun bool
39+
lookupHostsFile bool
40+
enhancerConfig enhancer.EnhancerConfig
41+
mitmConfig proxy.MimtOption
4142
}
4243

4344
type ssOptions struct {
@@ -257,6 +258,12 @@ func WithSystemProxy() SSOption {
257258
})
258259
}
259260

261+
func WithLookupHostsFile() SSOption {
262+
return ssOptionFunc(func(so *ssOptions) {
263+
so.localOpts.lookupHostsFile = true
264+
})
265+
}
266+
260267
func WithSocksUserInfo(username, password string) SSOption {
261268
return ssOptionFunc(func(so *ssOptions) {
262269
so.localOpts.socksAuth = NewAuth(username, password)

ss/ss_client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func NewShadowsocksClient(opts ...SSOption) *ShadowsocksClient {
5858
}
5959

6060
// init the global default dns resolver
61-
resolver.DefaultResolver = resolver.NewDnsResolver(resolver.DefaultDnsNameservers)
61+
resolver.DefaultResolver = resolver.NewDnsResolver(resolver.DefaultDnsNameservers, s.Opts.localOpts.lookupHostsFile)
6262

6363
// only one proxy node with command line
6464
if len(s.Opts.serverOpts) == 1 && s.Opts.serverOpts[0].name == "" && rule.MatchRuler.GlobalTo == "" {

ss/ss_server.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func NewShadowsocksServer(opts ...SSOption) *ShadowsocksServer {
3333
if len(s.Opts.serverOpts) == 0 {
3434
logger.Logger.Fatal("ss-server need configuration")
3535
}
36-
resolver.DefaultResolver = resolver.NewDnsResolver(nil)
36+
resolver.DefaultResolver = resolver.NewDnsResolver(nil, false)
3737
for _, opt := range s.Opts.serverOpts {
3838
if err := s.initServerHandler(&opt); err != nil {
3939
logger.Logger.Error("init server failed", logx.Error("error", err))

util/hostsutil/hosts.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ func initHostsMap() {
2323
}
2424
for ip, hosts := range mp {
2525
for _, host := range hosts {
26-
logger.Logger.Infof("read hosts record: [%s]->[%s]", ip, host)
27-
hostsMap[host] = append(hostsMap[host], netip.MustParseAddr(ip))
26+
if addr, err := netip.ParseAddr(ip); err == nil {
27+
logger.Logger.Infof("read hosts record: [%s]->[%s]", host, ip)
28+
hostsMap[host] = append(hostsMap[host], addr)
29+
}
2830
}
2931
}
3032
}

0 commit comments

Comments
 (0)