|
@@ -12,6 +12,7 @@ import (
|
|
|
|
|
|
|
|
type NameServerConfig struct {
|
|
type NameServerConfig struct {
|
|
|
Address *Address
|
|
Address *Address
|
|
|
|
|
+ ClientIP *Address
|
|
|
Port uint16
|
|
Port uint16
|
|
|
Domains []string
|
|
Domains []string
|
|
|
ExpectIPs StringList
|
|
ExpectIPs StringList
|
|
@@ -26,12 +27,14 @@ func (c *NameServerConfig) UnmarshalJSON(data []byte) error {
|
|
|
|
|
|
|
|
var advanced struct {
|
|
var advanced struct {
|
|
|
Address *Address `json:"address"`
|
|
Address *Address `json:"address"`
|
|
|
|
|
+ ClientIP *Address `json:"clientIp"`
|
|
|
Port uint16 `json:"port"`
|
|
Port uint16 `json:"port"`
|
|
|
Domains []string `json:"domains"`
|
|
Domains []string `json:"domains"`
|
|
|
ExpectIPs StringList `json:"expectIps"`
|
|
ExpectIPs StringList `json:"expectIps"`
|
|
|
}
|
|
}
|
|
|
if err := json.Unmarshal(data, &advanced); err == nil {
|
|
if err := json.Unmarshal(data, &advanced); err == nil {
|
|
|
c.Address = advanced.Address
|
|
c.Address = advanced.Address
|
|
|
|
|
+ c.ClientIP = advanced.ClientIP
|
|
|
c.Port = advanced.Port
|
|
c.Port = advanced.Port
|
|
|
c.Domains = advanced.Domains
|
|
c.Domains = advanced.Domains
|
|
|
c.ExpectIPs = advanced.ExpectIPs
|
|
c.ExpectIPs = advanced.ExpectIPs
|
|
@@ -87,12 +90,20 @@ func (c *NameServerConfig) Build() (*dns.NameServer, error) {
|
|
|
return nil, newError("invalid IP rule: ", c.ExpectIPs).Base(err)
|
|
return nil, newError("invalid IP rule: ", c.ExpectIPs).Base(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ var myClientIP []byte
|
|
|
|
|
+ if c.ClientIP != nil {
|
|
|
|
|
+ if !c.ClientIP.Family().IsIP() {
|
|
|
|
|
+ return nil, newError("not an IP address:", c.ClientIP.String())
|
|
|
|
|
+ }
|
|
|
|
|
+ myClientIP = []byte(c.ClientIP.IP())
|
|
|
|
|
+ }
|
|
|
return &dns.NameServer{
|
|
return &dns.NameServer{
|
|
|
Address: &net.Endpoint{
|
|
Address: &net.Endpoint{
|
|
|
Network: net.Network_UDP,
|
|
Network: net.Network_UDP,
|
|
|
Address: c.Address.Build(),
|
|
Address: c.Address.Build(),
|
|
|
Port: uint32(c.Port),
|
|
Port: uint32(c.Port),
|
|
|
},
|
|
},
|
|
|
|
|
+ ClientIp: myClientIP,
|
|
|
PrioritizedDomain: domains,
|
|
PrioritizedDomain: domains,
|
|
|
Geoip: geoipList,
|
|
Geoip: geoipList,
|
|
|
OriginalRules: originalRules,
|
|
OriginalRules: originalRules,
|