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

26

Eu sei que a ferramenta ip permite vincular vários endereços a uma interface (por exemplo, link ). No momento, porém, estou tentando construir algo sobre o IPv6, e seria realmente útil ter um bloco inteiro de endereços (digamos, um / 64) disponível, para que os programas pudessem escolher qualquer endereço do intervalo e ligar a isso. Escusado será dizer que anexar todos os IPs deste intervalo a uma interface levaria algum tempo.

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

    
por p-static 05.12.2010 / 01:27

5 respostas

30

O Linux 2.6.37 e superior suporta isso através 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.

    
por 21.04.2011 / 22:30
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 isso:

$ 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ê quiser ... para endereços IPv4. Você perguntou sobre o IPv6 e eu não tenho nenhuma experiência com o IPv6, mas há uma boa chance de que ele funcione da mesma maneira.

Li originalmente sobre este aqui (na parte inferior do artigo). Observe que este artigo também discute como atribuir explicitamente vários endereços a uma interface usando recursos do Red Hat / CentOS dos quais eu não sabia anteriormente.

    
por 07.12.2010 / 17:44
2

Então, 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 então faça com que a máquina use a interface pcap para interceptar todo o tráfego do referido bloco (como se fosse um roteador) e manuseá-lo.

  3. Você pode reproduzir truques com regras de NAT 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 você realmente quer prestar atenção, o que o leva de volta à solução 1.

Se eu fosse você, escreveria o pequeno script na opção 1. Ou usaria o de aqui :

#!/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
    
por 07.12.2010 / 17:25
2

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

    
por 05.10.2015 / 21:12
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 eu 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!"
    
por 24.01.2016 / 12:57

Tags