import ipaddress import socket from urllib.parse import urlparse class IpUtils: @staticmethod def is_ipv4(ip): """ 判断是不是ipv4 """ try: socket.inet_pton(socket.AF_INET, ip) except AttributeError: # no inet_pton here,sorry try: socket.inet_aton(ip) except socket.error: return False return ip.count('.') == 3 except socket.error: # not a valid ip return False return True @staticmethod def is_ipv6(ip): """ 判断是不是ipv6 """ try: socket.inet_pton(socket.AF_INET6, ip) except socket.error: # not a valid ip return False return True @staticmethod def is_internal(hostname): """ 判断一个host是内网还是外网 """ hostname = urlparse(hostname).hostname if IpUtils.is_ip(hostname): return IpUtils.is_private_ip(hostname) else: return IpUtils.is_internal_domain(hostname) @staticmethod def is_ip(addr): """ 判断是不是ip """ try: socket.inet_aton(addr) return True except socket.error: return False @staticmethod def is_internal_domain(domain): """ 判断域名是否为内部域名 """ # 获取域名对应的 IP 地址 try: ip = socket.gethostbyname(domain) except socket.error: return False # 判断 IP 地址是否属于内网 IP 地址范围 return IpUtils.is_private_ip(ip) @staticmethod def is_private_ip(ip_str): """ 判断是不是内网ip """ try: return ipaddress.ip_address(ip_str.strip()).is_private except Exception as e: print(str(e)) return False