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

我知道ip工具可以让你绑定多个地址到一个接口(例如http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ )。 不过,现在我正在尝试在IPv6之上构build一些东西,并且有一整块地址(比如说一个/ 64)是可用的,所以程序可以从这个范围中select任何地址,绑定到那个。 不用说,把这个范围内的每个IP连接到一个接口上需要一段时间。

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

Linux 2.6.37及以上版本通过一个称为AnyIP的function来支持这个function。 例如,如果我运行

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

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

是的,Linux支持将一个networking地址块绑定到一个networking接口上,但只能在回送接口上。 所以你可以这样做:

 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特性为接口明确分配多个地址。

所以我在这里看到一些select:

  1. 使用脚本将地址全部绑定到接口上

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

  3. 你可以使用NAT规则来巧妙地玩技巧,然后把一个路由到一台机器的Ips块重写成一台机器上的一个内部IP ……但是你仍然会得到一个你真正想要支付的IP的内部IP注意,这会让你回到解决scheme1。

如果我是你,我只需在选项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 

正如其他人所说,您可以使用AnyIP机制将到达整个子网的数据包路由到本地主机接口,但请记住,您还需要让上游路由器将所有需要的数据包路由到本机第一个地方。 这可以简单地通过路由器上的路由表项或通过BGP来完成。 鉴于您的机器将不得不单独为每个IP分配ARP,因此ARP并不适合。

上面描述的“Anyip”在我的centos 7上不起作用。我必须创build一个脚本来在启动时手动创buildipv6地址。 为此,我将以下内容添加到/ etc / crontab中:

 @reboot root /path/to/bashscript 

这里是bash脚本创build大约3000个ipv6地址:

 #!/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!"