我可以将(大)块地址绑定到接口吗?

我可以将(大)块地址绑定到接口吗?

我知道 ip 工具允许你将多个地址绑定到一个接口(例如,http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/)。不过,现在我正在尝试在 IPv6 之上构建一些东西,拥有一整块地址(例如 /64)非常有用,这样程序就可以从该范围内选择任何地址并绑定到该地址。不用说,将此范围内的每个 IP 附加到接口需要一段时间。

Linux 是否支持将整个地址块绑定到接口?

答案1

Linux 2.6.37 及以上版本通过一个名为任何IP。例如如果我运行

ip route add local 2001:db8::/32 dev lo

在 Ubuntu 11.04 机器上,它将接受 2001:db8::/32 网络中任何地址的连接。

答案2

是的,Linux 支持将一组网络地址绑定到网络接口……但仅限于环回接口。因此,您可以这样做:

ip addr add 192.168.5.0/24 dev lo

然后执行以下操作:

$ nmap -sP -oG - 192.168.5.0/24

# Nmap 5.21 scan initiated Tue Dec  7 11:38:28 2010 as: nmap -sP -oG - 192.168.5.0/24 
Host: 192.168.5.0 ()    Status: Up
Host: 192.168.5.1 ()    Status: Up
Host: 192.168.5.2 ()    Status: Up
[...]
Host: 192.168.5.254 ()  Status: Up
Host: 192.168.5.255 ()  Status: Up
# Nmap done at Tue Dec  7 11:38:46 2010 -- 256 IP addresses (256 hosts up) scanned in 0.11 seconds

有了适当的路由,这将满足您的要求……适用于 IPv4 地址。您问的是 IPv6,而我没有 IPv6 方面的经验,但很有可能它会以相同的方式工作。

我最初读到过这里(在文章底部)。请注意,本文还讨论了如何使用我以前不知道的 CentOS/Red Hat 功能明确地为接口分配多个地址。

答案3

所以我在这里看到了几个选项:

  1. 使用脚本将所有地址分别绑定到接口

  2. 将您想要的块路由到您的机器的单个地址,然后让该机器使用 pcap 接口拦截该块的所有流量(就好像它是一个路由器一样)并处理它。

  3. 您可以想象使用 NAT 规则来玩弄花招,然后将路由到一台机器的 IP 块重写为该机器上的单个内部 IP...但您仍然会得到每个您真正想要关注的 IP 的一个内部 IP,这会让您回到解决方案 1。

如果我是你,我会直接写选项 1 中的小脚本。或者使用这里

#!/bin/sh
if [ "$#" -ne "4" ]; then
        echo Usage:
        echo " $0 interface ip range netmask"
        echo " examples:"
        echo "  1) Assuming you want to bind the IP range 192.168.0.1..192.168.0.254 to eth0 with netmask 255.255.255.0:"
        echo "  $0 eth0 192.168.0. 1..254 255.255.255.0"
        echo "  2) Assuming you want to bind the IPv6 range 2001:41d0:1:5000::1-2001:41d0:1:5000::254 to eth0 with netmask /56"
        echo "  $0 eth0 2001:41d0:1:5000:: 1..254 56"
else
        echo "Attempting to assign the IP range $2($3) to interface $1 with netmask $4"
        for ip in $(eval echo "{$3}"); do ifconfig -v $1 add $2$ip netmask $4; done
fi

答案4

上面描述的“Anyip”在 centos 7 上对我不起作用。我不得不创建一个脚本来在启动时手动创建 ipv6 地址。为此,我在 /etc/crontab 中添加了以下内容:

@reboot root /path/to/bashscript

以下是创建大约 3000 个 ipv6 地址的 bash 脚本:

#!/bin/bash
INETP="2a00:xxxx:xxxx:xxxx::"
PRE="64"
INTE="eth0"
IP1=/sbin/ip
echo -n "Adding IPv6 addresses..."
for i in {3..3000}
do
$IP1 -6 addr add ${INETP}$(printf '%x\n' $i)/${PRE} dev ${INTE}
done
echo "Done!"

相关内容