Как связать enp0s3 с пэром вет?

1249
TorosFanny

Мой круг: Ubuntu 15.10. И у меня есть проводной NIC enp0s3. Я хочу, чтобы создать пару Veth veth0и 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, но это не помогает.

1

2 ответа на вопрос

1
MariusMatutiae

There are two mistakes in the above. First, by bridging the veth IF with enp0s3, you will be sending the pings outside your pc, while your intention is to communicate with another part of your own pc. Second, the syntax of the command establishing the veth interface is wrong.

You should bridge the veth interface with another virtual interface, tap0; then you will see your pings coming back. Try it as follows:

 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 

I have added the lo interface only because you will find it useful in the future. Now you can ping,

 ping -c1 10.0.0.2 

and you will see the pings coming back.

EDIT:

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

There is no way to expose the two veth's to your ISP. Still, the following ought to work just fine:

  1. The following, for some reason I do not understand, must be done before all of the previous commands:

    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 

This will give you DNS resolution. But remember, this must be done before the commands above!

  1. On your host, allow IPv4 forwarding and MASQUERADING:

    echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE 
  2. Add a gateway to your new network namespace:

    ip netns exec $NNS ip route add default via 10.0.0.1 
  3. Now enter your new network namespace, I do it by creating an xterm and then typing within it commands which are necessarily in the new NNS:

    ip netns exec $NNS su -c xterm YourName & 

If you do not like xterm's, you can use whatever kind of terminals you like (if you do not have an xterm, just install it, apt-get install xterm).

This should work.

Спасибо за прекрасный ответ. Это работает, и вы дали мне полезные советы. TorosFanny 8 лет назад 0
@ TorosFanny Всегда пожалуйста! MariusMatutiae 8 лет назад 0
Я не очень разбираюсь в `ip tuntap`, но не могли бы вы рассказать, как я могу получить доступ к Интернету:` veth-b $ NNS` и MAC `veth-b $ NNS` должны быть видны моему провайдеру. TorosFanny 8 лет назад 0
@TorosFanny Просьба прочитать мой Edit. MariusMatutiae 8 лет назад 0
Может быть, я не четко выразил свои потребности. Я должен предоставить сетевой адаптер в пространстве имен шлюзу моего провайдера. TorosFanny 8 лет назад 0
@TorosFanny Я говорил вам, что это невозможно сделать с помощью сетевых пространств имен. Если вы скажете мне, чего вы хотите достичь (в конце концов, вы ** уже подключены к Интернету, так зачем нужен другой интерфейс? Для чего это нужно?), Я мог бы помочь. MariusMatutiae 8 лет назад 0
@ TorosFanny Хорошо, вы можете сделать это с помощью `proxy-arp`. Вы должны задать другой вопрос, чтобы другие могли извлечь из этого пользу. MariusMatutiae 8 лет назад 0
Мы, сокурсники, должны использовать клиента, чтобы получить доступ к Интернету. У клиента много ограничений. Для входа в систему требуется ваша учетная запись, и вы должны предоставить MAC своего сетевого адаптера шлюзу интернет-провайдера, а затем получить IP-адрес. У каждой учетной записи есть ограничение на пропускную способность. Я хочу создать сервер с множеством учетных записей, чтобы мы могли делиться пропускной способностью. Ключевым шагом является запуск нескольких клиентов в соответствующих им сетевых пространствах имен, поэтому мне нужно предоставить адрес канального уровня для каждого пространства имен. Вы сказали, что использование veth невозможно, поэтому, возможно, macvlan может помочь. TorosFanny 8 лет назад 0
@TorosFanny macvlan - один из способов сделать это. Но, пожалуйста, задайте новый вопрос. MariusMatutiae 8 лет назад 0
Да я пишу TorosFanny 8 лет назад 0
Пожалуйста, помогите мне. http://superuser.com/questions/1024723/how-to-add-virtual-nics-to-my-linux-pc-so-that-they-expose-their-macs-to-isps TorosFanny 8 лет назад 0
-1
user606000
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 
Может быть, это правильно, может быть, это работает, я не знаю. Я проголосовал против, потому что: (1) ответ является необработанным блоком кода без объяснения того, что он делает; (2) нет объяснения, как и почему это решение отличается от другого ответа или лучше его. Kamil Maciorowski 7 лет назад 0