Posso ligar um bloco (grande) de endereços a uma interface?

26

Eu sei que a ferramenta ip permite vincular vários endereços a uma interface (por exemplo, http://www.linuxplanet.com/linuxplanet/tutorials/6553/1/ ). No momento, estou tentando criar algo sobre o IPv6, e seria realmente útil ter um bloco inteiro de endereços (por exemplo, um / 64) disponível, para que os programas pudessem escolher qualquer endereço do intervalo e vincular a isso. Desnecessário dizer que a conexão de todos os IP desse intervalo a uma interface levaria um tempo.

O Linux suporta a ligação de um bloco inteiro de endereços a uma interface?

estático
fonte
Distros diferentes têm maneiras diferentes de lidar com isso. Escolha um.
Ignacio Vazquez-Abrams
Ubuntu agora, mas soluções que funcionam em distribuições são preferidas, é claro.
p-static
Este tutorial vincula um único endereço dentro de um bloco (/ 24). O / 24 apenas especifica em qual bloco ele está. Ele deve funcionar de forma idêntica para o IPv6.
BillThor
A distribuição cruzada seria escrever um script que use "ip addr add". Red Hat, Ubuntu e SuSE tem diferentes scripts de rede ...
Sean Reifschneider
1
@ChandraNakka É este útil para você?
kasperd

Respostas:

31

O Linux 2.6.37 e superior suporta isso por meio de um recurso chamado AnyIP . Por exemplo, se eu correr

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

em uma máquina Ubuntu 11.04, ele aceitará conexões em qualquer endereço na rede 2001: db8 :: / 32.

Gerald Combs
fonte
1
Existe alguma solução AnyIP para ipv4?
Coaku
É um trabalho no Ubuntu 14.04?
Chandra Nakka
Isso parece funcionar e posso executar ping no intervalo de endereços, mas quando corro ip route listou ip -6 route lista rota adicionada não é visível. Como você enumeraria um bloco de endereço AnyIP?
Colton
Isso funciona para os endereços localmente, mas não consigo executar ping ou acessar esses IPs de fontes externas. Alguma maneira de consertar isso? (Eu tentei substituindo lo com eth0, mas então nada é alcançável)
BrainStone
@BrainStone você precisa instalar ndppd para isso, ou obter um prefixo encaminhadas de seu provedor
Arya
6

Sim, o Linux suporta a ligação de um bloco de endereços de rede a uma interface de rede ... mas apenas na interface de loopback. Então você pode fazer isso:

ip addr add 192.168.5.0/24 dev lo

E então faça o seguinte:

$ 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

Com as rotas apropriadas, isso fará o que você deseja ... para endereços IPv4. Você perguntou sobre IPv6 e eu não tenho nenhuma experiência com IPv6, mas há uma boa chance de que funcione da mesma maneira.

Eu li originalmente sobre isso aqui (no final do artigo). Observe que este artigo também discute como atribuir explicitamente vários endereços a uma interface usando os recursos do CentOS / Red Hat que eu não conhecia anteriormente.

larsks
fonte
Legal! Eu tentei isso com o IPv6 no Ubuntu (Lucid & Hardy) sem sorte. Eu acho que esse seria um recurso essencial para o IPv6 - você poderia mapear endereços para fazer objetos de banco de dados ou usar endereços como IDs de sessão.
Gerald Combs
2
Não, você não deve adicionar um endereço a lo. Em vez disso, adicionar uma rota: ip -6 route add local <ip> dev lo.
Navin
2

Então, eu vejo algumas opções aqui:

  1. use um script para vincular todos os endereços à interface individualmente

  2. direcione o bloco que você deseja para o endereço único da sua máquina e faça com que a máquina use a interface pcap para interceptar todo o tráfego desse bloco (como se fosse um roteador) e manipulá-lo.

  3. Você pode fazer truques com regras NAT de maneira fácil, para reescrever um bloco de Ips que foram roteados para uma máquina em um único IP interno nessa máquina ... mas você ainda terá um IP interno por IP que realmente deseja pagar. atenção, o que leva você de volta à solução 1.

Se eu fosse você, escreveria o pequeno script na opção 1. Ou use o daqui :

#!/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
pjz
fonte
onde esse script seria nomeado?
Skaperen
2

Como já foi dito, você pode usar o mecanismo AnyIP para rotear pacotes de chegada de uma sub-rede inteira para a interface localhost, mas lembre-se de que você também precisará que seu roteador upstream direcione todos os pacotes desejados para esta máquina em o primeiro lugar. Isso pode ser feito simplesmente com entradas da tabela de roteamento no roteador ou via BGP. O ARP não é realmente apropriado, uma vez que sua máquina precisaria ARP para cada IP individualmente.

Kyle Rose
fonte
1

O "Anyip" descrito acima não funcionou para mim no centos 7. Eu tive que criar um script para criar manualmente endereços IPv6 na inicialização. Para fazer isso, adicionei o seguinte ao / etc / crontab:

@reboot root /path/to/bashscript

Aqui está o script bash para criar aproximadamente 3000 endereços 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!"
Nicolas Guérinet
fonte
Este método só funciona até você atingir cerca de 4000 endereços. Se você tentar configurar mais endereços do que isso, não funcionará. Existem cenários em que é desejável atribuir um / 96 ou / 64 inteiro a um único host, não há como o seu método escalar tão longe.
kasperd
@kasperd onde você pode fazer com que o chamado mecanismo anyip "descrito" por Gerald Combs acima funcione no Centos 7 ou no Debian 8?
Nicolas Guérinet
1
Sim, isso funciona. Mas há mais algumas etapas além das mencionadas nessa resposta. Veja minha resposta para uma pergunta semelhante.
kasperd