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


26

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

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


不同的发行版有不同的处理方式。选一个。
伊格纳西奥·巴斯克斯

目前,Ubuntu是首选,但跨发行版工作的解决方案是首选。
p静态2010年

本教程在一个块(/ 24)中绑定一个地址。/ 24只是指定它位于哪个块中。对于IPv6,它应该完全相同。
BillThor,2010年

跨发行版将是编写使用“ ip addr add”的脚本。Red Hat,Ubuntu和SuSE具有不同的网络脚本...
Sean Reifschneider 2010年

1
@ChandraNakka 对您有用吗?
kasperd '16

Answers:


31

Linux 2.6.37及更高版本通过称为AnyIP的功能支持此功能。例如,如果我跑步

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

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


1
ipv4是否有AnyIP解决方案?
2015年

在Ubuntu 14.04上可以使用吗?
Chandra Nakka

这似乎确实可行,我可以ping通地址范围,但是当我运行ip route listip -6 route list添加的路由不可见时。您将如何枚举AnyIP地址块?
科尔顿

这适用于本地地址,但是我无法从外部来源ping或访问这些IP。有什么办法解决吗?(我尝试用eth0代替lo,但是
无法

@BrainStone,您需要为此安装ndppd,或从您的提供商那里获取一个前缀
Arya

6

是的,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功能将多个地址显式分配给接口。


凉!我在Ubuntu(Lucid&Hardy)上使用IPv6进行了尝试,但没有任何运气。我认为这将是IPv6的杀手级功能-您可以将地址映射为数据库对象,也可以将地址用作会话ID。
Gerald Combs 2010年

2
不,您不应在lo中添加地址。而是添加一条路线:ip -6 route add local <ip> dev lo
纳文

2

所以我在这里看到一些选择:

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

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

  3. 您可以轻松地使用NAT规则来欺骗,然后将路由到一台计算机的Ips块重写为该计算机上的单个内部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

这样的脚本在哪里命名?
Skaperen'5

2

正如其他人所说,您可以使用AnyIP机制将到达整个子网的数据包路由到localhost接口,但是请记住,您还需要使上游路由器将所有所需的数据包路由到该计算机中。第一名。这可以简单地通过路由器上的路由表条目或通过BGP完成。鉴于您的计算机必须为每个IP分别使用ARP,因此ARP并不是很合适。


1

上面描述的“ 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!"

该方法仅在达到约4000个地址之前有效。如果您尝试配置更多的地址,则将无法使用。在某些情况下,希望将整个/ 96或/ 64分配给单个主机,您的方法无法扩展到这么远。
卡巴斯德(Kasperd)'16

@kasperd,在哪里可以使Gerald Combs在Centos 7或Debian 8上的工作中“描述”所谓的anyip机制?
NicolasGuérinet'16

1
是的,那行得通。但是比该答案中提到的步骤要多一些。看到对类似问题的回答。
kasperd '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.