Compare commits

...

7 Commits

Author SHA1 Message Date
5a7c784680 moved log to ResponseWrapper 2022-04-03 22:37:22 +02:00
fb818b86a2 removed debug line 2022-04-03 16:15:08 +02:00
8dc088ffde improved README 2022-04-03 16:14:48 +02:00
6ff47b2a29 fixed rules parsing & debug 2022-04-03 01:44:37 +02:00
03b3375f8c parse config 2022-04-03 01:33:41 +02:00
81ce0257c4 move overide rr into func 2022-04-03 01:33:22 +02:00
f6b13f423a implemented README 2022-04-03 01:33:05 +02:00
3 changed files with 63 additions and 18 deletions

View File

@@ -0,0 +1,24 @@
A plugin to override A and AAAA records with a custom value.
I made this to override the public IP address of my server with its VPN IP address.
There is probably a better way to do this, but I couldn't find it.
# Usage
Add this to your `plugin.cfg` beetween `minimal` and `template` :
```
override:git.kapelle.org/niklas/coredns-override
```
In your `Corefile`:
```
. {
override {
12.34.56.78 10.0.0.1
98.76.54.32 10.0.0.2
}
forward . 1.1.1.1
}
```

View File

@@ -7,7 +7,7 @@ import (
"github.com/miekg/dns" "github.com/miekg/dns"
) )
var log = clog.NewWithPlugin("overide") var log = clog.NewWithPlugin("override")
type Rule struct { type Rule struct {
Search net.IP Search net.IP
@@ -22,6 +22,18 @@ type ResponseWrapper struct {
func (r *ResponseWrapper) WriteMsg(res *dns.Msg) error { func (r *ResponseWrapper) WriteMsg(res *dns.Msg) error {
for _, r := range r.Rules { for _, r := range r.Rules {
for _, rr := range res.Answer { for _, rr := range res.Answer {
overideRR(r, rr)
}
for _, rr := range res.Extra {
overideRR(r, rr)
}
}
return r.ResponseWriter.WriteMsg(res)
}
func overideRR(r Rule, rr dns.RR) {
if rr.Header().Rrtype == dns.TypeA { if rr.Header().Rrtype == dns.TypeA {
a := rr.(*dns.A) a := rr.(*dns.A)
if a.A.Equal(r.Search) { if a.A.Equal(r.Search) {
@@ -33,10 +45,6 @@ func (r *ResponseWrapper) WriteMsg(res *dns.Msg) error {
a.AAAA = r.Override a.AAAA = r.Override
} }
} }
}
}
return r.ResponseWriter.WriteMsg(res)
} }
func (r *ResponseWrapper) Write(buf []byte) (int, error) { func (r *ResponseWrapper) Write(buf []byte) (int, error) {

View File

@@ -13,8 +13,6 @@ func init() {
} }
func setup(c *caddy.Controller) error { func setup(c *caddy.Controller) error {
c.Next()
rules, err := parseRules(c) rules, err := parseRules(c)
if err != nil { if err != nil {
@@ -31,10 +29,25 @@ func setup(c *caddy.Controller) error {
func parseRules(c *caddy.Controller) ([]Rule, error) { func parseRules(c *caddy.Controller) ([]Rule, error) {
var rules []Rule var rules []Rule
rules = append(rules, Rule{ for c.Next() {
Search: net.ParseIP("45.9.63.244"), for c.NextBlock() {
Override: net.ParseIP("10.0.0.1"), searchIP := net.ParseIP(c.Val())
}) if searchIP == nil {
return nil, c.Errf("invalid search IP: %s", c.Val())
}
if !c.NextArg() {
return nil, c.ArgErr()
}
overrideIP := net.ParseIP(c.Val())
if overrideIP == nil {
return nil, c.Errf("invalid override IP: %s", c.Val())
}
rules = append(rules, Rule{Search: searchIP, Override: overrideIP})
}
}
return rules, nil return rules, nil
} }