Issue #14119 has been reported by k1LoW (Ken'ichiro Oyama).

----------------------------------------
Bug #14119: IPAdrr#include? does not seem to support the subnet mask
https://bugs.ruby-lang.org/issues/14119

* Author: k1LoW (Ken'ichiro Oyama)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin15]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
IPAdrr#include? において、引数のIPAddrオブジェクトのネットマスクが考慮された判定になっていないようです。

## 再現方法と得られた結果

~~~
irb(main):001:0> require 'ipaddr'
=> true
irb(main):002:0> IPAddr.new('10.5.0.0/24').include?('10.5.0.0/16')
=> true
irb(main):003:0> IPAddr.new('10.5.0.0/16').include?('10.5.0.0/24')
=> true
irb(main):004:0> IPAddr.new('10.5.0.0/24').include?(IPAddr.new('10.5.0.0/16'))
=> true
irb(main):005:0> IPAddr.new('10.5.0.0/16').include?(IPAddr.new('10.5.0.0/24'))
=> true
~~~

## 期待した結果と、それを期待した理由

~~~
irb(main):001:0> require 'ipaddr'
=> true
irb(main):002:0> IPAddr.new('10.5.0.0/24').include?('10.5.0.0/16')
=> true
irb(main):003:0> IPAddr.new('10.5.0.0/16').include?('10.5.0.0/24')
=> false
irb(main):004:0> IPAddr.new('10.5.0.0/24').include?(IPAddr.new('10.5.0.0/16'))
=> true
irb(main):005:0> IPAddr.new('10.5.0.0/16').include?(IPAddr.new('10.5.0.0/24'))
=> false
~~~

### 期待した理由

- IPAddrオブジェクトは `#include?` において、レシーバはIPアドレス範囲(集合)として動いている
- [るりま](https://docs.ruby-lang.org/ja/latest/class/IPAddr.html#I_--3D--3D--3D) によると、引数について「与えられた IPAddr オブジェクトが自身の範囲に入っているかを判定します」とある

上記の情報から、レシーバと引数とは集合同士の包含関係をチェックするのが直感的ではないか?と考えたからです。
(片方のIPAddrオブジェクトだけ集合で、片方のIPAddrオブジェクトだけ単一IPアドレスという点が直感的ではない)

### 期待される結果であった場合のユースケース

- iptablesなどで設定されているCIDR表記のIPアドレス範囲に対して、確認したいIPアドレス範囲が含まれているかどうかの確認

---

## 過去の議論のサーベイ

### 1905

#1905 のチケットの中において、`#==` の挙動についての議論の中にIPAddrについての説明ありました(ML側が抜け落ちているので [リンク ruby-dev:39381](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39381))

整形して引用:

```
> > IPAddr.new("192.168.2.0/24") == IPAddr.new("192.168.2.0/32")
> >
> > が true から false に変わるという仕様変更なのですが、どうでしょうか?
>
> というのがまずいでしょうか。

 これは受け入れられません。IPAddrはネットマスクも保持するため
ネットワークもできますが、第一義はIPアドレスなので、ネット
マスクの違いで等しくなくなるのはまずいです。
```

上記から、IPAddrは、まず単一のIPアドレスとして動くことが求められていることは理解しました。

その後、ネットマスクを考慮した拡張についての議論が [ruby-dev:39391](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39391) であるようなのですが、
こちらは文字化けがあり、まだしっかりと確認・理解できていません。すみません。

### 1275

#1275 のチケットにおいてネットマスクでIPアドレスの情報が消される問題についての議論がありました。

### 過去の議論をふまえて

- 「`IPAdrr#include?` においてはIPアドレス範囲同士の包含関係を見るようにする」のみの修正であれば、IPAddrの第一義に反していないと言えるのでは?と考えています(`IPAdrr#include?`のタイミングではレシーバはネットマスクを考慮するため)。
- #1275 のパッチが入った場合は、本チケットについての修正内容も変更されると思います。
- 上記より踏み込んだ修正は、[ruby-dev:39391](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39391) にある(であろう)流れの拡張になろうだろうと考えています。



-- 
https://bugs.ruby-lang.org/