ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围?

标签 ruby-on-rails ruby ip ip-address cidr

我想做两件事:将 IP 地址输入转换为 CIDR 以下是一些示例输入:

1.1.1.1    
192.168.*.* #=> 192.168.0-255.0-255
192.168.1.2-20
1.1.1-10.1-100

检查给定的 IP 地址是否属于任何 CIDR。这一定是一个非常快速的查询,因为它是我的网络应用程序中非常常见的查找。我正在考虑做这样的事情:

def matches?(request)
  valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
  !valid.empty?
end

我认为将 IP 范围转换为 CIDR 将使查找速度比我们现在所做的更快,后者将 IP 分解为整数八位字节。然后我们索引前两组八位字节以部分匹配 IP。另一种选择可能是将所有内容都转换为整数并以这种方式进行比较。我会用这样的东西转换为整数 IPAddr.new("1.1.1.1").to_i 但是我需要为每个范围存储一个上限和下限 IP,而不是只存储一个CIDR。

如果我忽略了任何主流方法、流行的 gems 或 repo,请告诉我。谢谢!

最佳答案

好吧,要获得范围的 CIDR 表示法,您需要一个 IP 和网络位数(根据网络掩码计算)。

要枚举给定范围的地址,您可以使用 NetAddr (< 2.x) gem。

p NetAddr::CIDR.create('192.168.1.0/24').enumerate
  => ['192.168.1.0', '192.168.1.1', '192.168.1.2'... '192.168.1.255']

您还可以即时计算网络掩码中的位:

mask_int = NetAddr.netmask_to_i('255.255.255.0')
p NetAddr.mask_to_bits(mask_int)
  => 24

并创建一个基于两个 IP 的范围:

lower = NetAddr::CIDR.create('192.168.1.1')
upper = NetAddr::CIDR.create('192.168.1.10')
p NetAddr.range(lower, upper)
  => ['192.168.1.2', '192.168.1.3'... '192.168.1.9']

现在您可以创建一个 CIDR 范围,您可以检查 IP 是否是其中的一部分:

cidr = NetAddr::CIDR.create('192.168.1.0/24')
p cidr.contains?('192.168.1.10')
  => true

关于ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406603/

相关文章:

ruby-on-rails - 如何使用 Heroku 上的 Ruby on Rails 项目从开发转移到生产?

ruby-on-rails - 使用 Minitest 的 Rails,如何设置 RuboCop 在每次使用 rake 运行测试时自动运行?

string - 如何使用 Lua 将 IP 地址转换为整数?

ruby-on-rails - 缓存特定的部分 rails 3.0.x

ruby-on-rails - Brakeman:文件名警告中使用的模型属性

dns - DNS服务器可以有源IP吗?

tomcat - 在静态 IP 地址上运行我的应用程序

ruby-on-rails - 带有成员获取路由的 Controller 操作的 form_tag 问题

mysql - 如何让 Phusion Passenger、MySQL 和 Rails 在生产环境中良好运行

ruby - 使用 ruby​​ 的 Highline#ask 时使用现有答案预填充提示