Como usar namespaces de rede virtual adicionados à rede de caixa virtual

2

Esta questão está muito relacionada. Eu uso a resposta aceita para criar 10 namespaces de rede adicionados à minha rede de caixa virtual ( vboxnet0 ). No entanto, ao tentar efetuar ping nos novos endereços ( 192.168.56.13X ) da máquina host na qual os namespaces de rede são criados, não consigo alcançá-los. Ao tentar fazer o ping de uma VM adicionada a essa rede, posso alcançá-la. Quando pingar os hosts vboxnet0 IP 192.168.56.1 do host, eu posso alcançá-lo. O ping para um dos namespaces, no entanto, funciona assim que eu executo o comando ping dentro do namespace correspondente, mas apenas para esse IP.

Eu preciso ser capaz de alcançar os IPs de espaço de nomes de rede da máquina host, pois quero executar scripts naqueles que precisam ser alimentados com dados. O que estou fazendo de errado?

O script que eu uso para criar os namespaces é adicionado abaixo. (Eu costumava usar esse script em uma VM sem problemas, mas devido à restrição de recursos tive que movê-lo para meu host onde os problemas agora surgem)

#!/bin/bash

ROUTER=0.0.0.0

function create_vlan {
        # echo 1
    ip netns add "ns$1"
        # echo 2
    ip link add link ${networkinterface} "ipvl$1" type ipvlan mode l2
        # echo 3
    ip link set dev "ipvl$1" netns "ns$1"
        # echo 4
    ip netns exec "ns$1" ip link set dev "ipvl$1" up
        # echo 5
    ip netns exec "ns$1" ip link set dev lo up
        # echo 6
    ip netns exec "ns$1" ip -4 addr add 127.0.0.1 dev lo
        # echo 7
    ip netns exec "ns$1" ip -4 addr add $2 dev "ipvl$1"
        # echo 8
    ip netns exec "ns$1" ip -4 route add default via ${ROUTER} dev "ipvl$1"
}


networkinterface=$1

declare -i metab amount
amount=$2
amount+=30

echo $amount

for i in 'seq 30 ${amount}';
do
    declare -i metab counter
    counter='expr $i - 30'
    ip="192.168.56.1$i"
    echo "creating vlan ns${i} with ip $ip"
    create_vlan ${i} ${ip}
    echo "created vlan ns${i} with ip $ip"
done

É chamado com os parâmetros vboxnet0 e 10

Conforme solicitado pelo comentário (por anonimato):

ip route
default via 134.A.B.129 dev eno1  proto static  metric 100 
134.A.B.33 via 134.A.B.129 dev eno1  proto dhcp  metric 100 
134.A.B.128/27 dev eno1  proto kernel  scope link  src 134.A.B.132  metric 100 
169.E.F.0/16 dev eno1  scope link  metric 1000 
192.168.56.0/24 dev vboxnet0  proto kernel  scope link  src 192.168.56.1
    
por Sim 16.01.2018 / 11:16

1 resposta

1

Não há tempo para testá-lo agora com uma imagem de caixa virtual, mas suponho que o seguinte funcione:

Minha suspeita é que o ipvlan não funciona bem no adaptador de rede da caixa virtual, porque é, bem, virtual.

Então faça do jeito antigo, e use uma ponte real, e veth-pares dos namespaces. Então, algo nas seguintes linhas (não testado):

addr=192.168.56
ip link add br0 type bridge
ip addr add $addr.250/24 dev br0

Em seguida, para cada namespace $1 começando por, digamos, 1:

ip netns add "ns$1"
ip link add "vetha$1" type veth peer name "vethb$1" netns "ns$1"
ip -n "ns$1" link set lo up
ip -n "ns$1" link set "vethb$1" up
ip -n "ns$1" addr add 127.0.0.1 dev lo
ip -n "ns$1" addr add "$addr.$1/24" dev "vethb$1"
ip -n "ns$1" route add default via "$addr.250" dev "vethb$1"
ip link set "vetha$1" master br0
ip link set "vetha$1" up

e finalmente

ip link set vboxnet0 master br0
ip link set br0 up

Agora, a ponte com o endereço 192.168.56.250 está voltada para o host, os endereços 192.168.56.1 , 192.168.56.2 etc. são atribuídos ao namespace e você deve garantir que os clientes do virtualbox obtenham IPs diferentes (ou altere o endereçamento esquema). Os namespaces têm o host como gateway.

Se algo não funcionar, você pode usar ip -n ns0 addr show etc. para verificar as atribuições de endereço, tcpdump -ni vetha0 etc em uma janela diferente, enquanto ping ing para ver o que funciona e o que não funciona etc. também pode iniciar um xterm no namespace para depurar coisas mais diretamente.

Se o acima funcionar, você também pode tentar um macvlan (muito semelhante ao ipvlan ) ou ipvlan no modo l3 - estes são um pouco mais eficientes, se a eficiência for necessária, se pode ser feito para trabalhar com o adaptador de rede da caixa virtual. A instalação para ambos está muito próxima do seu script original.

    
por 22.01.2018 / 21:06