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:
Simone Basso 2021-11-02 12:20:04 +01:00 committed by GitHub
parent ffdafaf351
commit f91de2ecd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 63 deletions

View File

@ -2,53 +2,10 @@ package resolver
import (
"context"
"net"
"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
// 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) {
addrs, err := r.Resolver.LookupHost(ctx, hostname)
for _, addr := range addrs {
if IsBogon(addr) {
if netxlite.IsBogon(addr) {
return nil, netxlite.ErrDNSBogon
}
}

View File

@ -9,21 +9,6 @@ import (
"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) {
r := resolver.BogonResolver{
Resolver: resolver.NewFakeResolverWithResult([]string{"127.0.0.1"}),

View File

@ -175,7 +175,7 @@ func (r *resolverDB) computeOddityLookupHost(addrs []string, err error) Oddity {
}
}
for _, addr := range addrs {
if isBogon(addr) {
if netxlite.IsBogon(addr) {
return OddityDNSLookupBogon
}
}

View File

@ -1,4 +1,4 @@
package measurex
package netxlite
//
// Bogon
@ -14,9 +14,9 @@ import (
"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.
func isBogon(address string) bool {
func IsBogon(address string) bool {
ip := net.ParseIP(address)
return ip == nil || isPrivate(ip)
}

View 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")
}
}