🥤

RubyでIPアドレス範囲を確認する

2024/12/20に公開

これはRuby Advent Calendar 2024の8日目の記事です。書いたのは日本時間の20日で空いているスロットに潜り込ませてもらいます。前日分は「ActivityPub RelayというActivityPubリレーサーバをRails 8を使って作った」、翌日分は「Tips: ファイルの作成日時をファイル名のソート順と同じ順序になるように変換するRubyスクリプト」でした。

筆者はPaaSプロバイダのサポートとして働いていて、プライベートなネットワークどうしを接続するVPC PeeringやVPNの設定を確認することがあります。例えば、192.168.1.0/29と接続されてるはずなのに192.168.1.15と通信できないのはどうしてか調査を依頼されることがあります。

ここで、192.168.1.0/29Class Inter-Domain Routing (CIDR) 記法というものです。/のあとの数字(10進数)がネットワークのプレフィックス長で、/の左側のIPアドレスの最初の、プレフィックス長分のビット数が一致するIPアドレスの範囲をあらわします。この例では、32ビットのIPv4アドレスのうち、最初の29ビットが一致する、つまり最後の3ビットが任意のIPアドレス範囲、つまり192.168.1.0から192.168.1.7までのIPアドレス範囲をあらわすことになります。

ここまで考察すると、192.168.1.15と通信できない理由は、このIPアドレスが、192.168.1.0/29のIPアドレス範囲に含まれないことだとわかります。

が、即座に正確にここまでの考察をするのはたいへんですよね。こういう場合に便利なのが、Rubyです。

$ irb
> require 'ipaddr'
> IPAddr.new("192.168.1.0/29").include?(IPAddr.new("192.168.1.15"))
=> false

IPv6アドレスでも同様に確認できます。ありがたい。

$ irb
> require 'ipaddr'
> IPAddr.new("::ffff:192.168.1.0/125").include?(IPAddr.new("::ffff:192.168.1.15"))
=> false
GitHubで編集を提案

Discussion