ip_conversion.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network
  2. IPV4_NETWORKS = [
  3. IPv4Network('91.224.148.0/24'),
  4. IPv4Network('91.224.149.0/24'),
  5. IPv4Network('89.234.156.0/24'),
  6. IPv4Network('89.234.157.0/24'),
  7. IPv4Network('185.119.168.0/24'),
  8. IPv4Network('185.119.169.0/24'),
  9. IPv4Network('185.119.170.0/24'),
  10. IPv4Network('185.119.171.0/24'),
  11. ]
  12. IPV6_NETWORKS = [
  13. IPv6Network('2a03:7220:8080::/48'),
  14. IPv6Network('2a03:7220:8081::/48'),
  15. IPv6Network('2a03:7220:8083::/48'),
  16. IPv6Network('2a03:7220:8084::/48'),
  17. IPv6Network('2a03:7220:8085::/48'),
  18. IPv6Network('2a03:7220:8086::/48'),
  19. IPv6Network('2a03:7220:8087::/48'),
  20. IPv6Network('2a03:7220:8088::/48'),
  21. ]
  22. def ipv4_to_ipv6(ipv4):
  23. ipv4_network = IPv4Network((ipv4, 24), strict=False)
  24. ipv6_network = IPV6_NETWORKS[IPV4_NETWORKS.index(ipv4_network)]
  25. return list(ipv6_network.subnets(8))[ipv4.packed[3]]
  26. def ipv6_to_ipv4(ipv6):
  27. ipv6_network = IPv6Network((ipv6, 48), strict=False)
  28. ipv4_network = IPV4_NETWORKS[IPV6_NETWORKS.index(ipv6_network)]
  29. return ipv4_network[ipv6.packed[6]]
  30. if __name__ == '__main__':
  31. ipv4_to_ipv6_tests = {
  32. IPv4Address('91.224.148.0'): IPv6Network('2a03:7220:8080::/56'),
  33. IPv4Address('91.224.149.170'): IPv6Network('2a03:7220:8081:aa00::/56'),
  34. IPv4Address('89.234.156.195'): IPv6Network('2a03:7220:8083:c300::/56'),
  35. IPv4Address('89.234.157.255'): IPv6Network('2a03:7220:8084:ff00::/56'),
  36. }
  37. for ipv4, ipv6 in ipv4_to_ipv6_tests.items():
  38. if ipv4_to_ipv6(ipv4) != ipv6:
  39. raise AssertionError('ipv4_to_ipv6(%s) = %s ≠ %s' \
  40. % (ipv4, ipv4_to_ipv6(ipv4), ipv6))
  41. ipv6_to_ipv4_tests = {
  42. IPv6Address('2a03:7220:8080:ff0d:35ac:3820::23'): IPv4Address('91.224.148.255'),
  43. IPv6Address('2a03:7220:8081:aa0d:35ac:3820::23'): IPv4Address('91.224.149.170'),
  44. IPv6Address('2a03:7220:8083:000d:35ac:3820::0'): IPv4Address('89.234.156.0'),
  45. IPv6Address('2a03:7220:8084:220d:35ac:3820::1'): IPv4Address('89.234.157.34'),
  46. IPv6Address('2a03:7220:8085:800d:35ac:3820::ff'): IPv4Address('185.119.168.128'),
  47. IPv6Address('2a03:7220:8086:2a0d:35ac:3820::f'): IPv4Address('185.119.169.42'),
  48. IPv6Address('2a03:7220:8087:f00d:35ac:3820::a'): IPv4Address('185.119.170.240'),
  49. IPv6Address('2a03:7220:8088:f59d:35ac:abcd:dead:beaf'): IPv4Address('185.119.171.245'),
  50. }
  51. for ipv6, ipv4 in ipv6_to_ipv4_tests.items():
  52. if ipv6_to_ipv4(ipv6) != ipv4:
  53. raise AssertionError('iv6_to_ipv4(%s) = %s ≠ %s' \
  54. % (ipv6, ipv6_to_ipv4(ipv6), ipv4))