Самым простым решением, вероятно, является использование macvlans
. Сходными решениями являются macvtap и ipvlan, которые лишь минимально отличаются от приведенных выше; трудно выбрать один, а не другой, без множества дополнительных деталей. Но следующее обязательно сработает.
Для каждого сетевого пространства имен назначьте интерфейс macvlan следующим образом:
NNS=TheNameOfYourNetworkNamespace
ip netns add $NNS
ip link add link eth0 mac$NNS address 56:61:4f:7c:77:db type macvlan mode bridge
ip link set dev mac$NNS netns $NNS
Я использовал конкретный MAC-адрес, вы можете просто отбросить адрес детали address 56:61:4f:7c:77:db
если вы не заинтересованы в его указании, оставляя это на волю случая.
Теперь войдите в пространство имен сети и настройте сеть:
ip netns exec $NNS xterm
и из открытого xterm
выполните:
ip link set dev $NAME_OF_MAC_INTERFACE up
ip link set dev lo up
ip addr add 127.0.0.1 dev lo
dhclient -v mac$NNS
и вы сделали.
Последний комментарий: mode bridge
использованный выше, позволяет всем сетевым пространствам имен напрямую общаться друг с другом, то есть без прохождения через коммутатор. Однако, используете ли вы такую опцию или нет, ваш хост не сможет общаться с сетевыми пространствами имен, если вы не создадите macvlan для самого хоста, и в этом случае он сможет взаимодействовать с другими NNS, как если бы он сам были одним из них.
РЕДАКТИРОВАТЬ:
это не работает, потому что я должен был помнить, что, оказавшись внутри NNS, переменные окружения, такие как $ NNS, больше не определяются, поэтому я должен исправить строку выше. На самом деле, в моей системе,
# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether e8:e0:b7:be:72:6a brd ff:ff:ff:ff:ff:ff
inet 192.168.73.55/24 brd 192.168.73.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::eae0:b7ff:febe:726a/64 scope link
valid_lft forever preferred_lft forever
# NNS=ns1
# ip netns add $NNS
# ip link add link eth0 mac$NNS address 56:61:4f:7c:77:db type macvlan
# ip link set dev mac$NNS netns $NNS
# ip netns exec $NNS /bin/bash
# ip link set dev macns1 up
# ip link set dev lo up
# ip addr add 127.0.0.1 dev lo
# dhclient -v macns1
Internet Systems Consortium DHCP Client 4.2.4
Copyright 2004-2012 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/macns1/56:61:4f:7c:77:db
Sending on LPF/macns1/56:61:4f:7c:77:db
Sending on Socket/fallback
DHCPDISCOVER on macns1 to 255.255.255.255 port 67 interval 3 (xid=0x473d2846)
DHCPREQUEST of 192.168.73.48 on macns1 to 255.255.255.255 port 67 (xid=0x46283d47)
DHCPOFFER of 192.168.73.48 from 192.168.73.1
DHCPACK of 192.168.73.48 from 192.168.73.1
bound to 192.168.73.48 -- renewal in 21288 seconds.
# ping -c1 superuser.com
PING superuser.com (104.16.127.192) 56(84) bytes of data.
64 bytes from 104.16.127.192: icmp_seq=1 ttl=53 time=12.9 ms
--- superuser.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.927/12.927/12.927/0.000 ms
Как видите, он отлично работает на моей системе. Вы можете проверить, что IP-адрес, который я получаю в NNS (192.168.73.48), отличается от IP-адреса на хосте, 192.168.73.55.
Если это не работает в вашей системе, мне нужно что-то большее, чем просто не работает, потому что я не могу воспроизвести вашу ошибку.