RubyでIPアドレス範囲を確認する
これは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/29
はClass 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
Discussion