Como ligar enp0s3 com um par de veth?

1

Meu colo: Ubuntu 15.10. E eu tenho um NIC enp0s3 com fio. Eu quero criar um par veth veth0 e veth1 e conectá-los com enp0s3 e definir veth1 para um novo netns ns1 , para que os processos em ns1 possam acessar a Internet através da camada de link.

Mas é estranho que veth1 não consiga pingar enp0s3 . O seguinte é meus passos.

root@qs-vs:~# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:62:3c:59 brd ff:ff:ff:ff:ff:ff
root@qs-vs:~# ip netns add ns1
root@qs-vs:~# ip link add type veth
root@qs-vs:~# ip link set veth1 netns ns1
root@qs-vs:~# ip link add bridge type bridge
root@qs-vs:~# ip link set enp0s3 master bridge
root@qs-vs:~# ip link set veth0 master bridge
root@qs-vs:~# ip link set up veth0
root@qs-vs:~# ip link set up enp0s3
root@qs-vs:~# ip link set up bridge
root@qs-vs:~# ip netns exec ns1 ip link set up veth1
root@qs-vs:~# ip addr add 192.168.222.1/24 dev enp0s3
root@qs-vs:~# ip netns exec ns1 ip addr add 192.168.222.101/24 dev veth1
root@qs-vs:~# ping 192.168.222.101
PING 192.168.222.101 (192.168.222.101) 56(84) bytes of data.
From 192.168.222.1 icmp_seq=1 Destination Host Unreachable
From 192.168.222.1 icmp_seq=2 Destination Host Unreachable
From 192.168.222.1 icmp_seq=3 Destination Host Unreachable
From 192.168.222.1 icmp_seq=4 Destination Host Unreachable
From 192.168.222.1 icmp_seq=5 Destination Host Unreachable
From 192.168.222.1 icmp_seq=6 Destination Host Unreachable
^C
--- 192.168.222.101 ping statistics ---
7 packets transmitted, 0 received, +6 errors, 100% packet loss, time 6028ms
pipe 3

Eu também tentei ativar o promisc com enp0s3, mas isso não ajuda.

    
por TorosFanny 11.01.2016 / 12:45

2 respostas

1

Existem dois erros nos itens acima. Primeiro, fazendo a ponte entre veth IF com enp0s3 , você estará enviando os pings para fora do seu computador, enquanto sua intenção é se comunicar com outra parte do seu próprio computador. Segundo, a sintaxe do comando que estabelece a interface veth está errada.

Você deve vincular a interface veth a outra interface virtual, tap0 ; então você verá seus pings voltando. Experimente da seguinte forma:

    NNS=WhateverYouWantToCallTheNewNetworkNameSpace
    ip netns add $NNS
    ip link add veth-a$NNS type veth peer name veth-b$NNS
    ip link set veth-a$NNS up
    ip tuntap add tap$NNS mode tap user root
    ip link set tap$NNS up
    ip link add br$NNS type bridge
    ip link set tap$NNS master br$NNS
    ip link set veth-a$NNS master br$NNS
    ip addr add 10.0.0.1/24 dev br$NNS
    ip link set br$NNS up
    ip link set veth-b$NNS netns $NNS
    ip netns exec $NNS ip addr add 10.0.0.2/24 dev veth-b$NNS
    ip netns exec $NNS ip link set veth-b$NNS up
    ip netns exec $NNS ip link set dev lo up

Eu adicionei a interface lo apenas porque você a achará útil no futuro. Agora você pode pingar,

    ping -c1 10.0.0.2

e você verá os pings voltando.

EDITAR:

how I can access the Internet throw veth-b$NNS and the veth-b$NNS's MAC have to be visible to my ISP

Não há como expor os dois veth ao seu ISP. Ainda assim, o seguinte deve funcionar bem:

  1. O seguinte, por algum motivo, eu não entendo, deve ser feito antes de todos os comandos anteriores:

    NNS=WhateverYouWantToCallTheNewNetworkNameSpace
    /bin/mkdir -p /etc/netns/$NNS
    echo "nameserver 8.8.8.8" > /etc/netns/$NNS/resolv.conf
    echo "nameserver 8.8.4.4" >> /etc/netns/$NNS/resolv.conf
    

Isso lhe dará resolução de DNS. Mas lembre-se, isso deve ser feito antes dos comandos acima!

  1. No seu host, permita o encaminhamento IPv4 e o MASQUERADING:

    echo 1 > /proc/sys/net/ipv4/ip_forward 
    iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
    
  2. Adicione um gateway ao seu novo namespace de rede:

    ip netns exec $NNS ip route add default via 10.0.0.1
    
  3. Agora, insira seu novo espaço de rede, eu faço isso criando um xterm e digitando os comandos que estão necessariamente no novo NNS:

    ip netns exec $NNS su -c xterm YourName &
    

Se você não gosta do xterm, você pode usar qualquer tipo de terminal que desejar (se você não tiver um xterm, apenas instale-o, apt-get install xterm ).

Isso deve funcionar.

    
por 11.01.2016 / 13:07
-1
ip netns add mynetns
ip netns exec mynetns ip link list
ip netns exec mynetns ip link set dev lo up
#  ip netns exec mynetns ping 127.0.0.1
ip link add veth0 type veth peer name veth1
ip link set veth1 netns mynetns
ip netns exec mynetns ifconfig veth1 10.1.1.1/24 up
ifconfig veth0 10.1.1.2/24 up
#ping 10.1.1.1
#ip netns exec mynetns ping 10.1.1.2

ip netns exec mynetns route
ip netns exec mynetns iptables -L

ip netns exec mynetns bash
    
por 14.06.2016 / 10:24