【问题标题】:Convert IPv6 range in CIDR format to an IPv6 address range (start and end ips) in MySQL将 CIDR 格式的 IPv6 范围转换为 MySQL 中的 IPv6 地址范围(开始和结束 ips)
【发布时间】:2021-06-29 23:32:45
【问题描述】:

我正在尝试将 GeoLite2 ip 导入国家 csv 文件到我的 MySQL 数据库。我成功地做到了,但是,要使用它在我的查询中搜索 IP,我需要在 ipv4 和 ipv6 表中再创建两个字段,以存储给定的每个 CIDR 范围的 start_ip 和 end_ip 值(GeoLite csv 文件仅指定 CIDR 格式的范围)。

我能够使用此处给出的解决方案将其正确转换为 ipv4 地址范围 Importing MaxMind's GeoLite2 to MySQL

所以我用了

INET_ATON(SUBSTRING(network, 1, LOCATE('/', network) - 1))

对于 start_ip 和

INET_ATON(SUBSTRING(network, 1, LOCATE('/', network) - 1)) + (POW(2, (32-CONVERT(SUBSTRING(network, LOCATE('/', network) + 1), UNSIGNED INT)))-1)

对于 end_ip。 network 是存储 CIDR 范围的字段的名称。

但这不适用于 CIDR 格式的 IPv6 地址范围。我尝试使用 INET6_ATON 而不是 INET_ATON 但它给了我一个数值超出范围的错误。我对 IPv6 地址了解不多,所以自己找到公式并不容易。

任何帮助表示赞赏。

【问题讨论】:

    标签: mysql ipv6 cidr geolite2


    【解决方案1】:

    使用类型为 VARBINARY(16) 的列来存储值。 您可以将 INET6_ATON 用于 IPv4 和 IPv6 地址。

    参考:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton

    【讨论】:

    • 我的问题不是如何存储 IPv6 值。我特别询问了如何使用 MySQL 中的查询将 CIDR 转换为范围内的开始和结束 ips。我什至给出了我用来转换 ipv4 的查询。
    • 您描述的问题看起来像 溢出,在这里可以预料到,因为 IPv6 地址的大小是 128 位,而 UNSIGNED INT 只能容纳 4 字节( =32 位)整数值,最大值为 2147483647。请参阅Mysql Integer Type。这适用于 IPv4 地址,但不适用于 IPv6。 BIGINT 也不够,因为限制是 2^64 -1。这不足以处理 IPv6 地址。所以我建议在导入 Mysql 之前进行一些预处理。
    • 这个post 也可以提供帮助。
    • 发现转换 IPv6 CIDR 范围不像 IPv4 版本那样简单,它可以在单个查询或语句中运行,因此设法使用自定义函数来转换 CIDR 格式来解决这个问题到其对应的开始和结束IP
    • @AhmedShefeer,IPv6 更容易,因为地址分为两个 64 位部分(网络 ID 和接口 ID)。第一个地址是 64 位网络,后跟 ::,最后一个地址是 64 位网络,后跟 :ffff:ffff:ffff:ffff。 (与 IPv4 不同,全零和全一地址是有效的主机地址。) 第一个地址 = <network>::;最后地址 = <network>:ffff:ffff:ffff:ffff.
    【解决方案2】:

    您可以使用我的工具从 GitHub https://github.com/mbto/maxmind-geoip2-csv2sql-converter 将 MaxMind GeoLite2 国家/城市 CSV 转换为 MySQL/PostgreSQL/Microsoft SQL Server 2019

    您可以阅读examples,或按照以下步骤操作:

    1. https://support.maxmind.com/account-faq/license-keys/how-do-i-generate-a-license-key/ 获取 MaxMind API 的免费许可证密钥(如果您没有)
    2. adoptopenjdk.netgithub.com/raphw/raphw.github.iooracle.com/java 安装Java 11(如果未安装)
    3. releases(.zip 或 .tar)下载工具
    4. 解压到你的目录
    5. 使用您的个人资料名称复制/粘贴 .ini 模板 bin/GeoLite2-Country-CSV.mysql.default.ini,例如 bin/GeoLite2-Country-CSV.mysql.Your Project Name.ini 或使用默认值。
    6. 使用记事本打开 .ini 模板并更改 [windows_loader][unix_loader] 部分(设置 MySQL 主机:端口、用户和密码)。
    7. 对于 unix:执行 chmod +x maxmind-geoip2-csv2sql-converter
    8. 运行转换:maxmind-geoip2-csv2sql-converter.bat -c "GeoLite2-Country-CSV.mysql.Your Project Name.ini" -k Your_License_Key -i 4,6
    9. 转换后,脚本bin/converted/loader.batbin/converted/loader.sh将可用。
    10. 对于 unix:执行 chmod +x loader.sh
    11. 执行loader.batloader.sh 以导入架构。

    完成

    【讨论】:

      最近更新 更多