dnsforward/ipset: add support for wildcard subdomain ipset matches
This matches dnsmasq behavior and the alternative is not really useful. See http://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=blob;f=src/forward.c;hb=f60fea1fb0a288011f57a25dfb653b8f6f8b46b9#l588
This commit is contained in:
@@ -89,6 +89,31 @@ func (c *ipsetCtx) getIP(rr dns.RR) net.IP {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find the ipsets for a given host (accounting for subdomain wildcards)
|
||||||
|
func (c *ipsetCtx) getIpsetNames(host string) ([]string, bool) {
|
||||||
|
var ipsetNames []string
|
||||||
|
var found bool
|
||||||
|
|
||||||
|
// search for matching ipset hosts starting with most specific subdomain
|
||||||
|
i := 0
|
||||||
|
for i != -1 {
|
||||||
|
host = host[i:]
|
||||||
|
|
||||||
|
ipsetNames, found = c.ipsetList[host]
|
||||||
|
if found {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// move slice up to the parent domain
|
||||||
|
i = strings.Index(host, ".")
|
||||||
|
if i != -1 {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ipsetNames, found
|
||||||
|
}
|
||||||
|
|
||||||
func addToIpset(host string, ipsetName string, ipStr string) {
|
func addToIpset(host string, ipsetName string, ipStr string) {
|
||||||
code, out, err := util.RunCommand("ipset", "add", ipsetName, ipStr)
|
code, out, err := util.RunCommand("ipset", "add", ipsetName, ipStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -115,7 +140,7 @@ func (c *ipsetCtx) processMembers(ctx *dnsContext, addMember func(string, string
|
|||||||
host := req.Question[0].Name
|
host := req.Question[0].Name
|
||||||
host = strings.TrimSuffix(host, ".")
|
host = strings.TrimSuffix(host, ".")
|
||||||
host = strings.ToLower(host)
|
host = strings.ToLower(host)
|
||||||
ipsetNames, found := c.ipsetList[host]
|
ipsetNames, found := c.getIpsetNames(host)
|
||||||
if !found {
|
if !found {
|
||||||
return resultDone
|
return resultDone
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,6 +158,22 @@ func TestIpsetSubdomainOverride(t *testing.T) {
|
|||||||
assert.Equal(t, 1, len(b))
|
assert.Equal(t, 1, len(b))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIpsetSubdomainWildcard(t *testing.T) {
|
||||||
|
setup()
|
||||||
|
|
||||||
|
ctx.proxyCtx.Req = makeReqA("sub.host.com.")
|
||||||
|
ctx.proxyCtx.Res = &dns.Msg{
|
||||||
|
Answer: []dns.RR{
|
||||||
|
makeA("sub.host.com.", net.IPv4(127, 0, 0, 1)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
doProcess(t)
|
||||||
|
|
||||||
|
assert.Equal(t, 1, b[Binding{"sub.host.com", "name", "127.0.0.1"}])
|
||||||
|
assert.Equal(t, 1, len(b))
|
||||||
|
}
|
||||||
|
|
||||||
func TestIpsetCnameThirdParty(t *testing.T) {
|
func TestIpsetCnameThirdParty(t *testing.T) {
|
||||||
setup()
|
setup()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user