def get_interface_to_target(dst): if sys.platform == "win32": s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect((dst, 1)) ip_to_dst = s.getsockname()[0] except KeyError: ip_to_dst = '127.0.0.1' finally: s.close() return ip_to_dst else: # based on scapy implementation def atol(x): ip = socket.inet_aton(x) return struct.unpack("!I", ip)[0] routes = get_routes() dst = atol(dst) paths = [] for d, m, gw, i, a in routes: aa = atol(a) if aa == dst: paths.append((0xffffffff, ("lo", a, "0.0.0.0"))) if (dst & m) == (d & m): paths.append((m, (i, a, gw))) if not paths: return None paths.sort() ret = paths[-1][1] return ret[1]
def get_interface_to_target(dst): if sys.platform == "win32": ips = local_ips() matches = get_close_matches(dst, ips) return matches[0] if (len(matches) > 0) else ips[0] else: # based on scapy implementation def atol(x): ip = socket.inet_aton(x) return struct.unpack("!I", ip)[0] routes = get_routes() dst = atol(dst) pathes = [] for d, m, gw, i, a in routes: aa = atol(a) if aa == dst: pathes.append((0xffffffff, ("lo", a, "0.0.0.0"))) if (dst & m) == (d & m): pathes.append((m, (i, a, gw))) if not pathes: return None pathes.sort() ret = pathes[-1][1] return ret[1]
def get_interface_to_target(dst): """ :param dst: destination IP address string without port. E.G. '192.168.1.1.' :return: IP address string of an interface that can connect to the target. E.G. '192.168.1.4.' """ if sys.platform == "win32": s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect((dst, 1)) ip_to_dst = s.getsockname()[0] except KeyError: LOG.debug( "Couldn't get an interface to the target, presuming that target is localhost." ) ip_to_dst = '127.0.0.1' finally: s.close() return ip_to_dst else: # based on scapy implementation def atol(x): ip = socket.inet_aton(x) return struct.unpack("!I", ip)[0] routes = get_routes() dst = atol(dst) paths = [] for d, m, gw, i, a in routes: aa = atol(a) if aa == dst: paths.append((0xffffffff, ("lo", a, "0.0.0.0"))) if (dst & m) == (d & m): paths.append((m, (i, a, gw))) if not paths: return None paths.sort() ret = paths[-1][1] return ret[1]