cleanup: move bogon checking code in netxlite (#562)
I develop this diff while working on https://github.com/ooni/probe/issues/1803#issuecomment-957323297. While there, make sure we don't have duplicate bogon code and always use the code inside netxlite.
This commit is contained in:
parent
ffdafaf351
commit
f91de2ecd6
|
@ -2,53 +2,10 @@ package resolver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"net"
|
|
||||||
|
|
||||||
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
||||||
"github.com/ooni/probe-cli/v3/internal/runtimex"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var privateIPBlocks []*net.IPNet
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
for _, cidr := range []string{
|
|
||||||
"0.0.0.0/8", // "This" network (however, Linux...)
|
|
||||||
"10.0.0.0/8", // RFC1918
|
|
||||||
"100.64.0.0/10", // Carrier grade NAT
|
|
||||||
"127.0.0.0/8", // IPv4 loopback
|
|
||||||
"169.254.0.0/16", // RFC3927 link-local
|
|
||||||
"172.16.0.0/12", // RFC1918
|
|
||||||
"192.168.0.0/16", // RFC1918
|
|
||||||
"224.0.0.0/4", // Multicast
|
|
||||||
"::1/128", // IPv6 loopback
|
|
||||||
"fe80::/10", // IPv6 link-local
|
|
||||||
"fc00::/7", // IPv6 unique local addr
|
|
||||||
} {
|
|
||||||
_, block, err := net.ParseCIDR(cidr)
|
|
||||||
runtimex.PanicOnError(err, "net.ParseCIDR failed")
|
|
||||||
privateIPBlocks = append(privateIPBlocks, block)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func isPrivate(ip net.IP) bool {
|
|
||||||
if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, block := range privateIPBlocks {
|
|
||||||
if block.Contains(ip) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsBogon returns whether if an IP address is bogon. Passing to this
|
|
||||||
// function a non-IP address causes it to return bogon.
|
|
||||||
func IsBogon(address string) bool {
|
|
||||||
ip := net.ParseIP(address)
|
|
||||||
return ip == nil || isPrivate(ip)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BogonResolver is a bogon aware resolver. When a bogon is encountered in
|
// BogonResolver is a bogon aware resolver. When a bogon is encountered in
|
||||||
// a reply, this resolver will return an error.
|
// a reply, this resolver will return an error.
|
||||||
//
|
//
|
||||||
|
@ -64,7 +21,7 @@ type BogonResolver struct {
|
||||||
func (r BogonResolver) LookupHost(ctx context.Context, hostname string) ([]string, error) {
|
func (r BogonResolver) LookupHost(ctx context.Context, hostname string) ([]string, error) {
|
||||||
addrs, err := r.Resolver.LookupHost(ctx, hostname)
|
addrs, err := r.Resolver.LookupHost(ctx, hostname)
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
if IsBogon(addr) {
|
if netxlite.IsBogon(addr) {
|
||||||
return nil, netxlite.ErrDNSBogon
|
return nil, netxlite.ErrDNSBogon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,21 +9,6 @@ import (
|
||||||
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
"github.com/ooni/probe-cli/v3/internal/netxlite"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestResolverIsBogon(t *testing.T) {
|
|
||||||
if resolver.IsBogon("antani") != true {
|
|
||||||
t.Fatal("unexpected result")
|
|
||||||
}
|
|
||||||
if resolver.IsBogon("127.0.0.1") != true {
|
|
||||||
t.Fatal("unexpected result")
|
|
||||||
}
|
|
||||||
if resolver.IsBogon("1.1.1.1") != false {
|
|
||||||
t.Fatal("unexpected result")
|
|
||||||
}
|
|
||||||
if resolver.IsBogon("10.0.1.1") != true {
|
|
||||||
t.Fatal("unexpected result")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBogonAwareResolverWithBogon(t *testing.T) {
|
func TestBogonAwareResolverWithBogon(t *testing.T) {
|
||||||
r := resolver.BogonResolver{
|
r := resolver.BogonResolver{
|
||||||
Resolver: resolver.NewFakeResolverWithResult([]string{"127.0.0.1"}),
|
Resolver: resolver.NewFakeResolverWithResult([]string{"127.0.0.1"}),
|
||||||
|
|
|
@ -175,7 +175,7 @@ func (r *resolverDB) computeOddityLookupHost(addrs []string, err error) Oddity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
if isBogon(addr) {
|
if netxlite.IsBogon(addr) {
|
||||||
return OddityDNSLookupBogon
|
return OddityDNSLookupBogon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package measurex
|
package netxlite
|
||||||
|
|
||||||
//
|
//
|
||||||
// Bogon
|
// Bogon
|
||||||
|
@ -14,9 +14,9 @@ import (
|
||||||
"github.com/ooni/probe-cli/v3/internal/runtimex"
|
"github.com/ooni/probe-cli/v3/internal/runtimex"
|
||||||
)
|
)
|
||||||
|
|
||||||
// isBogon returns whether if an IP address is bogon. Passing to this
|
// IsBogon returns whether if an IP address is bogon. Passing to this
|
||||||
// function a non-IP address causes it to return true.
|
// function a non-IP address causes it to return true.
|
||||||
func isBogon(address string) bool {
|
func IsBogon(address string) bool {
|
||||||
ip := net.ParseIP(address)
|
ip := net.ParseIP(address)
|
||||||
return ip == nil || isPrivate(ip)
|
return ip == nil || isPrivate(ip)
|
||||||
}
|
}
|
18
internal/netxlite/bogon_test.go
Normal file
18
internal/netxlite/bogon_test.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package netxlite
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestIsBogon(t *testing.T) {
|
||||||
|
if IsBogon("antani") != true {
|
||||||
|
t.Fatal("unexpected result")
|
||||||
|
}
|
||||||
|
if IsBogon("127.0.0.1") != true {
|
||||||
|
t.Fatal("unexpected result")
|
||||||
|
}
|
||||||
|
if IsBogon("1.1.1.1") != false {
|
||||||
|
t.Fatal("unexpected result")
|
||||||
|
}
|
||||||
|
if IsBogon("10.0.1.1") != true {
|
||||||
|
t.Fatal("unexpected result")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user