Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I know that the ip tool lets you bind multiple addresses to an interface (eg, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/). 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
    
Yes, I know it works identically for ipv6. My point in linking that tutorial was to point out something that does not apply to what I'm trying to do, but is very similar. Again: linking up one address at a time (e.g., with "ip addr add") is a nonstarter, because I want to attach a lot of addresses to one machine efficiently. –  p-static Dec 5 '10 at 10:23

3 Answers 3

up vote 15 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

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 192.168.5.0/24 dev lo

And then do this:

$ 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

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/RedHat 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:

#!/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
share|improve this answer

Your Answer

 
discard

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.