1

Мой круг: Ubuntu 15.10. И у меня есть проводной сетевой enp0s3 . Я хочу создать пару veth0 veth1 и veth1 и связать их с enp0s3 , а также установить veth1 для новой netns ns1 , чтобы процессы в ns1 могли получить доступ к Интернету через канальный уровень.

Но странно, что veth1 не может enp0s3 . Ниже приведены мои шаги.

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

Я также попытался включить Promisc с enp0s3, но это не помогает.

2 ответа2

1

В вышесказанном есть две ошибки. Во-первых, veth IF с enp0s3 , вы будете отправлять эхо -запросы за пределы своего ПК, в то время как вы намерены установить связь с другой частью вашего собственного ПК. Во-вторых, синтаксис команды, устанавливающей интерфейс veth неверен.

Вы должны связать интерфейс veth с другим виртуальным интерфейсом, tap0 ; тогда ты увидишь, как твои пины возвращаются. Попробуйте это следующим образом:

    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

Я добавил интерфейс lo только потому, что вы найдете его полезным в будущем. Теперь вы можете пинговать,

    ping -c1 10.0.0.2

и вы увидите, что пинг возвращается.

РЕДАКТИРОВАТЬ:

как я могу получить доступ к Интернету, чтобы выбросить veth-b $ NNS и MAC-адрес veth-b $ NNS должны быть видны моему провайдеру

Нет никакого способа выставить эти два veth вашему провайдеру. Тем не менее, следующее должно работать просто отлично:

  1. Следующее, по какой-то причине я не понимаю, должно быть выполнено перед всеми предыдущими командами:

    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
    

Это даст вам разрешение DNS. Но помните, это должно быть сделано до того, как команды выше!

  1. На вашем хосте разрешите пересылку IPv4 и MASQUERADING:

    echo 1 > /proc/sys/net/ipv4/ip_forward 
    iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
    
  2. Добавьте шлюз в новое сетевое пространство имен:

    ip netns exec $NNS ip route add default via 10.0.0.1
    
  3. Теперь введите новое сетевое пространство имен, я делаю это, создав xterm а затем набрав в нем команды, которые обязательно находятся в новом NNS:

    ip netns exec $NNS su -c xterm YourName &
    

Если вам не нравятся xterm, вы можете использовать любые терминалы, которые вам нравятся (если у вас нет xterm, просто установите его, apt-get install xterm).

Это должно работать.

-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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .