Go/GoLang で、IP アドレスが特定の範囲内にあるかどうかを確認する最速の方法は何ですか?
たとえば、 から までの範囲が指定216.14.49.184
され216.14.49.191
た場合、指定された入力 IP アドレスがその範囲内にあるかどうかを確認するにはどうすればよいでしょうか?
Go/GoLang で、IP アドレスが特定の範囲内にあるかどうかを確認する最速の方法は何ですか?
たとえば、 から までの範囲が指定216.14.49.184
され216.14.49.191
た場合、指定された入力 IP アドレスがその範囲内にあるかどうかを確認するにはどうすればよいでしょうか?
IP アドレスは go (タイプ) では bigendian[]byte
スライスとして表されるIP
ため、 を使用して正しく比較されbytes.Compare
ます。
例 (遊び)
package main
import (
"bytes"
"fmt"
"net"
)
var (
ip1 = net.ParseIP("216.14.49.184")
ip2 = net.ParseIP("216.14.49.191")
)
func check(ip string) bool {
trial := net.ParseIP(ip)
if trial.To4() == nil {
fmt.Printf("%v is not an IPv4 address\n", trial)
return false
}
if bytes.Compare(trial, ip1) >= 0 && bytes.Compare(trial, ip2) <= 0 {
fmt.Printf("%v is between %v and %v\n", trial, ip1, ip2)
return true
}
fmt.Printf("%v is NOT between %v and %v\n", trial, ip1, ip2)
return false
}
func main() {
check("1.2.3.4")
check("216.14.49.185")
check("1::16")
}
生産する
1.2.3.4 is NOT between 216.14.49.184 and 216.14.49.191
216.14.49.185 is between 216.14.49.184 and 216.14.49.191
1::16 is not an IPv4 address
これは、「net」パッケージの stdlib に、net.Contains という関数として既に含まれています。既存のコードを書き直す必要はありません。
こちらのドキュメントを参照してください。
それを使用するには、目的のサブネットを解析するだけです
network := "192.168.5.0/24"
clientips := []string{
"192.168.5.1",
"192.168.6.0",
}
_, subnet, _ := net.ParseCIDR(network)
for _, clientip := range clientips {
ip := net.ParseIP(clientip)
if subnet.Contains(ip) {
fmt.Println("IP in subnet", clientip)
}
}
上記のコードが意味をなさない場合は、ここにgolang play リンクがあります
IPAddress Go ライブラリは、IPv4 と IPv6 の両方のアドレスを使用して、ポリモーフィックな方法でこれを迅速に行うことができます。 ここにリポジトリがあります。免責事項: 私はプロジェクト マネージャーです。
isInRange("216.14.49.184", "216.14.49.191", "216.14.49.190")
isInRange("2001:0db8:85a3::8a2e:0370:7334", "2001:0db8:85a3::8a00:ff:ffff",
"2001:0db8:85a3::8a03:a:b")
func getAddress(str string) *ipaddr.IPAddress {
return ipaddr.NewIPAddressString(str).GetAddress()
}
func isInRange(range1Str, range2Str, addrStr string) {
range1, range2, addr :=
getAddress(range1Str), getAddress(range2Str), getAddress(addrStr)
rng := range1.SpanWithRange(range2)
result := rng.Contains(addr)
fmt.Printf("%v contains %v %t\n", rng, addr, result)
return
}
出力:
216.14.49.184 -> 216.14.49.191 contains 216.14.49.190 true
2001:db8:85a3::8a00:ff:ffff -> 2001:db8:85a3::8a2e:370:7334 contains 2001:db8:85a3::8a03:a:b true