Compare commits
7 Commits
511fae1dc6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a7c784680 | |||
| fb818b86a2 | |||
| 8dc088ffde | |||
| 6ff47b2a29 | |||
| 03b3375f8c | |||
| 81ce0257c4 | |||
| f6b13f423a |
24
README.md
24
README.md
@@ -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
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,23 +22,31 @@ 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 {
|
||||||
if rr.Header().Rrtype == dns.TypeA {
|
overideRR(r, rr)
|
||||||
a := rr.(*dns.A)
|
}
|
||||||
if a.A.Equal(r.Search) {
|
|
||||||
a.A = r.Override
|
for _, rr := range res.Extra {
|
||||||
}
|
overideRR(r, rr)
|
||||||
} else if rr.Header().Rrtype == dns.TypeAAAA {
|
|
||||||
a := rr.(*dns.AAAA)
|
|
||||||
if a.AAAA.Equal(r.Search) {
|
|
||||||
a.AAAA = r.Override
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return r.ResponseWriter.WriteMsg(res)
|
return r.ResponseWriter.WriteMsg(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func overideRR(r Rule, rr dns.RR) {
|
||||||
|
if rr.Header().Rrtype == dns.TypeA {
|
||||||
|
a := rr.(*dns.A)
|
||||||
|
if a.A.Equal(r.Search) {
|
||||||
|
a.A = r.Override
|
||||||
|
}
|
||||||
|
} else if rr.Header().Rrtype == dns.TypeAAAA {
|
||||||
|
a := rr.(*dns.AAAA)
|
||||||
|
if a.AAAA.Equal(r.Search) {
|
||||||
|
a.AAAA = r.Override
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *ResponseWrapper) Write(buf []byte) (int, error) {
|
func (r *ResponseWrapper) Write(buf []byte) (int, error) {
|
||||||
log.Warning("ResponseWrapper called with Write: not ensuring overide")
|
log.Warning("ResponseWrapper called with Write: not ensuring overide")
|
||||||
return r.ResponseWriter.Write(buf)
|
return r.ResponseWriter.Write(buf)
|
||||||
|
|||||||
25
setup.go
25
setup.go
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user