|
@@ -5,13 +5,10 @@ import (
|
|
|
"log"
|
|
|
"net"
|
|
|
"net/netip"
|
|
|
+ "strconv"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
-type AllAddress struct {
|
|
|
- Addr []net.IP `json:"addresses"`
|
|
|
-}
|
|
|
-
|
|
|
type NetworkInterfaceNotFound struct{ Passed string }
|
|
|
|
|
|
// Implementing error interface
|
|
@@ -19,40 +16,69 @@ func (n *NetworkInterfaceNotFound) Error() string {
|
|
|
return fmt.Sprintf("Interface: '%s' not found.", n.Passed)
|
|
|
}
|
|
|
|
|
|
-func getNextAddr(addr net.IP) (net.IP, error) {
|
|
|
- next, err := netip.ParseAddr(addr.String())
|
|
|
+type IpSubnetMapper struct {
|
|
|
+ Ipv4s []net.IP `json:"addresses"`
|
|
|
+ NetworkAddr net.IP
|
|
|
+ Current net.IP
|
|
|
+ Mask int
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+Get the next IPv4 address of the address specified in the 'addr' argument,
|
|
|
+
|
|
|
+ :param addr: the address to get the next address of
|
|
|
+*/
|
|
|
+func getNextAddr(addr string) string {
|
|
|
+ parsed, err := netip.ParseAddr(addr)
|
|
|
if err != nil {
|
|
|
- return nil, err
|
|
|
+ log.Fatal("failed while parsing address in getNextAddr() ", err, "\n")
|
|
|
}
|
|
|
- return net.ParseIP(next.Next().String()), nil
|
|
|
+ return parsed.Next().String()
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+get the network address of the ip address in 'addr' with the subnet mask from 'cidr'
|
|
|
+
|
|
|
+ :param addr: the ipv4 address to get the network address of
|
|
|
+ :param cidr: the CIDR notation of the subbet
|
|
|
+*/
|
|
|
+func getNetwork(addr string, cidr int) string {
|
|
|
+ addr = fmt.Sprintf("%s/%v", addr, cidr)
|
|
|
+ ip, net, err := net.ParseCIDR(addr)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatal("failed whilst attempting to parse cidr in getNetwork() ", err, "\n")
|
|
|
+ }
|
|
|
+ return ip.Mask(net.Mask).String()
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
Recursive function to get all of the IPv4 addresses for each IPv4 network that the host is on
|
|
|
|
|
|
- :param addr: the address to recursively find the next address for
|
|
|
- :param out: a pointer to a struct containing a list of addresses
|
|
|
+ :param ipmap: a pointer to an IpSubnetMapper struct which contains domain details such as
|
|
|
+ the subnet mask, the original network mask, and the current IP address used in the
|
|
|
+ recursive function
|
|
|
+ :param max: This is safety feature to prevent stack overflows, so you can manually set the depth to
|
|
|
+ call the function
|
|
|
*/
|
|
|
func addressRecurse(ipmap *IpSubnetMapper, max int) {
|
|
|
|
|
|
if len(ipmap.Ipv4s) > max {
|
|
|
return
|
|
|
}
|
|
|
- next, err := getNextAddr(ipmap.NetworkAddr)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return
|
|
|
- }
|
|
|
- ip, net, err := net.ParseCIDR(next.String())
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return
|
|
|
- }
|
|
|
- if ip.Mask(net.Mask).String() != ipmap.NetworkAddr.String() {
|
|
|
+
|
|
|
+ next := getNextAddr(ipmap.Current.String())
|
|
|
+
|
|
|
+ nextNet := getNetwork(next, ipmap.Mask)
|
|
|
+ currentNet := ipmap.NetworkAddr.String()
|
|
|
+
|
|
|
+ if nextNet != currentNet {
|
|
|
return
|
|
|
}
|
|
|
+ ipmap.Current = net.ParseIP(next)
|
|
|
|
|
|
- ipmap.Ipv4s = append(ipmap.Ipv4s, next)
|
|
|
+ ipmap.Ipv4s = append(ipmap.Ipv4s, net.ParseIP(next))
|
|
|
addressRecurse(ipmap, max)
|
|
|
}
|
|
|
|
|
@@ -75,81 +101,27 @@ func getAddressByInterface(name string) ([]net.Addr, error) {
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
-Utilized a recursive function to find all addresses in the address space that the host belongs.
|
|
|
-Returns a pointer to an AllAddresses struct who has a list of net.IP structs inside
|
|
|
-*/
|
|
|
-func GetAllAddresses(name string, maxDepth int) (*AllAddress, error) {
|
|
|
- addresses, err := getAddressByInterface(name)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- out := &AllAddress{}
|
|
|
- for idx := range addresses {
|
|
|
- ip := net.ParseIP(strings.Split(addresses[idx].String(), "/")[0])
|
|
|
- root, err := netip.ParseAddr(ip.Mask(ip.DefaultMask()).String())
|
|
|
- if err != nil {
|
|
|
- continue
|
|
|
- }
|
|
|
- if root.IsLoopback() {
|
|
|
- continue
|
|
|
- }
|
|
|
- // addressRecurse(ip, ip, out, maxDepth)
|
|
|
- }
|
|
|
- return out, nil
|
|
|
-}
|
|
|
+Get all of the IPv4 addresses in the network that 'addr' belongs to. YOU MUST PASS THE ADDRESS WITH CIDR NOTATION
|
|
|
+i.e. '192.168.50.1/24'
|
|
|
|
|
|
-/*
|
|
|
-Utilized a recursive function to find all addresses in the address space that the host belongs.
|
|
|
-Returns a pointer to an AllAddresses struct who has a list of net.IP structs inside
|
|
|
+ :param addr: the ipv4 address to use for subnet discovery
|
|
|
*/
|
|
|
-func GetAllRemoteAddresses(addrs []string, maxDepth int) (*AllAddress, error) {
|
|
|
- out := &AllAddress{}
|
|
|
- var addresses []net.IP
|
|
|
- for i := range addrs {
|
|
|
- ip, _, err := net.ParseCIDR(addrs[i])
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- addresses = append(addresses, ip)
|
|
|
- }
|
|
|
-
|
|
|
- for idx := range addresses {
|
|
|
-
|
|
|
- ip := net.ParseIP(strings.Split(addresses[idx].String(), "/")[0])
|
|
|
- root, err := netip.ParseAddr(ip.Mask(ip.DefaultMask()).String())
|
|
|
- if err != nil {
|
|
|
- continue
|
|
|
- }
|
|
|
- if root.IsLoopback() {
|
|
|
- continue
|
|
|
- }
|
|
|
- // addressRecurse(ip, ip, out, maxDepth)
|
|
|
-
|
|
|
- }
|
|
|
- return out, nil
|
|
|
-}
|
|
|
-
|
|
|
-type IpSubnetMapper struct {
|
|
|
- Ipv4s []net.IP
|
|
|
- NetworkAddr net.IP
|
|
|
- Mask net.IPMask
|
|
|
-}
|
|
|
-
|
|
|
-func RefactorGetAllRemAddr(addr string) (*AllAddress, error) {
|
|
|
- // out := &AllAddress{}
|
|
|
+func GetNetworkAddresses(addr string) (*IpSubnetMapper, error) {
|
|
|
ipmap := &IpSubnetMapper{Ipv4s: []net.IP{}}
|
|
|
+
|
|
|
ip, net, err := net.ParseCIDR(addr)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
+ mask, err := strconv.Atoi(strings.Split(addr, "/")[1])
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
ipmap.NetworkAddr = ip.Mask(net.Mask)
|
|
|
- ipmap.Mask = ip.DefaultMask()
|
|
|
- fmt.Printf("%+v\n", ip.Mask(net.Mask))
|
|
|
- fmt.Println(ip.DefaultMask())
|
|
|
- fmt.Printf("%s\n", net.IP.DefaultMask())
|
|
|
-
|
|
|
- addressRecurse(ipmap, 2000)
|
|
|
+ ipmap.Mask = mask
|
|
|
+ ipmap.Current = ip.Mask(net.Mask)
|
|
|
+ addressRecurse(ipmap, 65535)
|
|
|
|
|
|
- return nil, nil
|
|
|
+ return ipmap, nil
|
|
|
|
|
|
}
|