Elixir:验证特定范围内的IP

时间:2017-05-31 06:01:25

标签: elixir phoenix-framework

需要检查给定的IP是否存在于这些多个范围内

Given IP: 49.14.1.2
Ranges: 49.14.0.0 - 49.14.63.255, 106.76.96.0 - 106.76.127.255, and so on

我尝试过转换为整数并验证范围。在没有转换为整数

的情况下,在IP本身中还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

使用:inet.parse_address/1将地址转换为元组形式,并使用简单的元组比较进行比较。

iex(33)> a_ip = :inet.parse_address(a)
{:ok, {49, 14, 1, 2}}
iex(34)> low_ip = :inet.parse_address(low)
{:ok, {49, 14, 0, 0}}
iex(35)> high_ip = :inet.parse_address(high)
{:ok, {49, 14, 63, 255}}
iex(36)> a_ip < low_ip
false
iex(37)> a_ip > low_ip
true
iex(38)> a_ip < high_ip
true
iex(39)> a_ip > high_ip
false

答案 1 :(得分:2)

您可以使用尾递归函数来处理大型列表,并检查每个。有点像:

# First parameter: ip
# Second parameter the list of ranges in a tuple
# Third parameter the passed list, i.e. the ranges it does match
# It return the list of range(s) that the ip matched.
def ip_in_range(ip, [], match_list) do: match_list
def ip_in_range(ip, [{from_ip, to_ip} | rest], match_list) when ip > from_ip and ip < to_ip do: ip_in_range(ip, rest, [{from_ip, to_ip} | match_list])
def ip_in_range(ip, [{from_ip, to_ip} | rest], match_list) when ip < from_ip or ip > to_ip do: ip_in_range(ip, rest, match_list)

然后你可以用inet:parse_address / 1结果开始,例如:

ranges = [{{49, 14, 0, 0}, {49, 14, 63, 255}}, ...]
ip_in_range({49, 14, 1, 2}, ranges, [])

你可以随心所欲地塑造这个,即检查它属于多少个范围。甚至退出第一次检查成功。

答案 2 :(得分:1)

如果您知道CIDR IP notation,则可以使用以下方法检查特定的IP地址是否在IP范围内:

> cidr = InetCidr.parse("49.14.0.0/16")
{{49, 14, 0, 0}, {49, 14, 255, 255}, 16}

> address = InetCidr.parse_address!("49.14.1.2") 
{49, 14, 1, 2}

> InetCidr.contains?(cidr, address)
true

https://github.com/Cobenian/inet_cidr