Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I know that the ip tool lets you bind multiple addresses to an interface (eg, Right now, though, I'm trying to build something on top of IPv6, and it would be really useful to have an entire block of addresses (say, a /64) available, so that programs could pick any address from the range and bind to that. Needless to say, attaching every IP from this range to an interface would take a while.

Does Linux support binding a whole block of addresses to an interface?

share|improve this question
Different distros have different ways of handling this. Pick one. – Ignacio Vazquez-Abrams Dec 5 '10 at 0:34
Ubuntu right now, but solutions that work across distros are preferred, of course. – p-static Dec 5 '10 at 1:43
This tutorial binds a single address within a block (/24). The /24 just specifies which block it is in. It should work identically for IPv6. – BillThor Dec 5 '10 at 3:18
Cross-distro would be to write a script that uses "ip addr add". Red Hat, Ubuntu and SuSE have different networking scripts... – Sean Reifschneider Dec 5 '10 at 3:27
@ChandraNakka Is this useful to you? – kasperd Feb 26 at 17:08
up vote 23 down vote accepted

Linux 2.6.37 and above supports this via a feature called AnyIP. For instance if I run

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

on an Ubuntu 11.04 machine it will accept connections on any address in the 2001:db8::/32 network.

share|improve this answer
Thanks, this is exactly what I was looking for! – p-static Apr 22 '11 at 5:42
Is there any AnyIP solution for ipv4? – Coaku Nov 26 '15 at 13:55
Is it work on Ubuntu 14.04 ? – Chandra Nakka Jan 13 at 6:38

Yes, Linux supports binding a block of network addresses to a network interface... but only on the loopback interface. So you can do this:

ip addr add dev lo

And then do this:

$ nmap -sP -oG -

# Nmap 5.21 scan initiated Tue Dec  7 11:38:28 2010 as: nmap -sP -oG - 
Host: ()    Status: Up
Host: ()    Status: Up
Host: ()    Status: Up
Host: ()  Status: Up
Host: ()  Status: Up
# Nmap done at Tue Dec  7 11:38:46 2010 -- 256 IP addresses (256 hosts up) scanned in 0.11 seconds

With the appropriate routes in place this will do what you want... for IPv4 addresses. You've asked about IPv6, and I don't have any experience with IPv6, but there's a good chance it will work the same way.

I originally read about this here (towards the bottom of the article). Note that this article also discusses how to explicitly assign multiple addresses to an interface using CentOS/Red Hat features I hadn't previously known about.

share|improve this answer
Cool! I tried this with IPv6 on Ubuntu (Lucid & Hardy) without any luck. I think this would be a killer feature for IPv6 — you could map addresses do database objects or use addresses as session IDs. – Gerald Combs Dec 22 '10 at 22:44

So I see a few options here:

  1. use a script to bind the addresses all to the interface individually

  2. route the block you want to the single address of your machine, and then have that machine use the pcap interface to intercept all traffic for said block (as if it was a router) and handle it.

  3. You could concievably play tricks with NAT rules to then rewrite a block of Ips that were routed to one machine into a single internal IP on that machine... but you'll still end up with one internal IP per IP you really want to pay attention to, which gets you back to solution 1.

If I were you, I'd just write the small script in option 1. Or use the one from here:

if [ "$#" -ne "4" ]; then
        echo Usage:
        echo " $0 interface ip range netmask"
        echo " examples:"
        echo "  1) Assuming you want to bind the IP range to eth0 with netmask"
        echo "  $0 eth0 192.168.0. 1..254"
        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"
        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
share|improve this answer
where would such a script be named? – Skaperen May 6 '15 at 9:20

As others have said, you can use the AnyIP mechanism to route arriving packets for an entire subnet to the localhost interface, but keep in mind that you'll also need to get your upstream router to route all of the desired packets to this machine in the first place. This can be done simply with routing table entries on the router, or via BGP. ARP is not really appropriate given that your machine would have to ARP for each IP individually.

share|improve this answer

The "Anyip" described above didn't work for me on centos 7. I had to create a script to manually create ipv6 addresses at boot. To do so i have added the following to /etc/crontab:

@reboot root /path/to/bashscript

Here is the bash script to create roughly 3000 ipv6 addresses:

echo -n "Adding IPv6 addresses..."
for i in {3..3000}
$IP1 -6 addr add ${INETP}$(printf '%x\n' $i)/${PRE} dev ${INTE}
echo "Done!"
share|improve this answer
This method only works until you reach about 4000 addresses. If you try to configure more addresses than that it won't work. There are scenarios where it is desirable to assign an entire /96 or /64 to a single host, there is no way your method will scale that far. – kasperd Jan 24 at 12:22
@kasperd where you able to make the so called anyip mechanism "described" by Gerald Combs above work on Centos 7 or Debian 8? – Nicolas Guérinet Jan 24 at 13:28
Yes, that works. But there are a few more steps than mentioned in that answer. See my answer to a similar question. – kasperd Jan 24 at 13:52

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.