diff options
author | 2018-11-13 18:25:30 -0500 | |
---|---|---|
committer | 2018-11-13 23:25:30 +0000 | |
commit | 7aafbe24cac838938a8fb0dbfe08d4870ae52d4b (patch) | |
tree | 7d8ee501a6dcc47ce950fb2d8620780fdf0ee6ea /plugin/kubernetes/xfr.go | |
parent | 4d52a71f0918eb6f5ebb9e2fc64a6473c1a6e72c (diff) | |
download | coredns-7aafbe24cac838938a8fb0dbfe08d4870ae52d4b.tar.gz coredns-7aafbe24cac838938a8fb0dbfe08d4870ae52d4b.tar.zst coredns-7aafbe24cac838938a8fb0dbfe08d4870ae52d4b.zip |
plugin/kubernetes: Validate transfers are allowed (#2292)
* check allowed transfers
* add tests for parsing, and comment about refactor
Diffstat (limited to 'plugin/kubernetes/xfr.go')
-rw-r--r-- | plugin/kubernetes/xfr.go | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/plugin/kubernetes/xfr.go b/plugin/kubernetes/xfr.go index eaf554c6a..c15831276 100644 --- a/plugin/kubernetes/xfr.go +++ b/plugin/kubernetes/xfr.go @@ -25,6 +25,10 @@ func (k *Kubernetes) MinTTL(state request.Request) uint32 { return 30 } // Transfer implements the Transferer interface. func (k *Kubernetes) Transfer(ctx context.Context, state request.Request) (int, error) { + if !k.transferAllowed(state) { + return dns.RcodeRefused, nil + } + // Get all services. rrs := make(chan dns.RR) go k.transfer(rrs, state.Zone) @@ -71,6 +75,26 @@ func (k *Kubernetes) Transfer(ctx context.Context, state request.Request) (int, return dns.RcodeSuccess, nil } +// transferAllowed checks if incoming request for transferring the zone is allowed according to the ACLs. +// Note: This is copied from zone.transferAllowed, but should eventually be factored into a common transfer pkg. +func (k *Kubernetes) transferAllowed(state request.Request) bool { + for _, t := range k.TransferTo { + if t == "*" { + return true + } + // If remote IP matches we accept. + remote := state.IP() + to, _, err := net.SplitHostPort(t) + if err != nil { + continue + } + if to == remote { + return true + } + } + return false +} + func (k *Kubernetes) transfer(c chan dns.RR, zone string) { defer close(c) |