从 JS 中的子网生成随机 IP 地址

blu*_*ren 3 javascript ip-address ipv4 subnet npm

我正在尝试在给定 IP 地址子网的情况下生成随机 IP 地址。有很多资源可用于生成随机 IP,但我要求它从特定子网内生成。

我使用了一个名为netmask的 npm 模块- 但是实现绝对不优雅。任何人都可以为此提供一些巧妙的指针吗?

var netmask = require("netmask").Netmask
var block = new netmask('10.0.0.0/24')
console.log(block) // gives block details

var blockSize = block.size - 1 ;
var randomIndex = Math.floor(Math.random() * blockSize ) +1; // generate a random number less than the size of the block

console.log("randomIndex is: " + randomIndex);

block.forEach(function(ip, long, index){

    if(index == randomIndex){
        console.log('IP: ' + ip)
    console.log('INDEX: ' + index)
    // cannot break! this is a forEach :(
    }
});
Run Code Online (Sandbox Code Playgroud)

emi*_*mix 8

这很容易,没有任何额外的依赖,虽然我没有给你一个确切的答案,但我想知道IP 的一般工作原理以及如何解决你的问题。如果你自己做这件事,这个教训会更有价值。

我们以10.0.0.0/20 CIDR为例。让我们转换10.0.0.0为位:

00001010.00000000.00000000.00000000

我们去掉了 20 位,因为这是从左边开始的网络,所以我们留下0000.00000000了主机(.这里的点只是为了便于阅读):

00001010.00000000.00000000.00000000 Network
XXXXXXXX.XXXXXXXX.XXXX0000.00000000 Strip 20 bits of the subnet
Run Code Online (Sandbox Code Playgroud)

以任何你想要的方式用剩余的位打乱每个八位字节,例如我们可以得到0101.10001010. 避免使用1s only ( 1111.11111111)的主机,因为它是广播 IP,它仍然是一个有效的 IP,但不适用于主机。将子网部分与主机部分连接起来。我们得到:

// S=Subnet, H=Host
SSSSSSSS.SSSSSSSS.SSSSHHHH.HHHHHHHH
00001010.00000000.00000101.10001010
Run Code Online (Sandbox Code Playgroud)

这是1010 = 100101 = 510001010=138因此最终地址10.0.5.138


因为写起来很有趣,我可以给你我自己的实现,它不涉及任何字符串操作。如您所见,IPv4 地址是一个2^32无符号整数。因此我们可以应用基础数学:

00001010.00000000.00000000.00000000 Network
XXXXXXXX.XXXXXXXX.XXXX0000.00000000 Strip 20 bits of the subnet
Run Code Online (Sandbox Code Playgroud)