我知道 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
所以我在这里看到了几个选项:
使用脚本将所有地址分别绑定到接口
将您想要的块路由到您的机器的单个地址,然后让该机器使用 pcap 接口拦截该块的所有流量(就好像它是一个路由器一样)并处理它。
您可以想象使用 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!"