브리지 및 Veth 쌍을 통해 네임스페이스를 물리적 인터페이스에 연결하는 방법

브리지 및 Veth 쌍을 통해 네임스페이스를 물리적 인터페이스에 연결하는 방법

내 시도는 모방하는 것이 었습니다이 튜토리얼.

물리적 인터페이스가 브리지에 할당되지 않은 경우 네임스페이스에서 네트워크를 ping할 수 있습니다.

# Create namespace
ip netns add namespace1

# Create veth pair.
ip link add veth1 type veth peer name br-veth1

# Associate the non `br-` side with the namespace.
ip link set veth1 netns namespace1

# Give namespace-side veth ip addresses.
ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth1

# Create a bridge device naming it `br1` and set it up.
ip link add name br1 type bridge

# Turn up the bridge.
ip link set br1 up

# Set the bridge veth from the default namespace up.
ip link set br-veth1 up

# Set the veth from the namespace up too.
ip netns exec namespace1 ip link set veth1 up

# Add the br-veth1 interface to the bridge by setting the bridge device as their master.
ip link set br-veth1 master br1

# Add the physical interface to the bridge
ip link set enp3s0 master br1

# Set the address of the `br1` interface (bridge device) to 192.168.1.10/24 and also set the broadcast address to 192.168.1.255 (the `+` symbol sets  the host bits to 255).
ip addr add 192.168.1.10/24 brd + dev br1

# add the default gateway in all the network namespace.
ip netns exec namespace1 ip route add default via 192.168.1.10

# Set us up to have responses from the network.
# -t specifies the table to which the commands should be directed to. By default, it's `filter`.
# -A specifies that we're appending a rule to the chain that we tell the name after it.
# -s specifies a source address (with a mask in this case).
# -j specifies the target to jump to (what action to take).
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
sysctl -w net.ipv4.ip_forward=1

답변1

veth+bridge를 사용하지 마세요! 맥블란을 사용해보세요!

나도 요즘 너처럼 veth+bridge 때문에 고생했는데 다행히 찾았어이 링크오늘 밤에는 다음과 같습니다.

MACVLAN 이전에는 가상 머신이나 네임스페이스에서 물리적 네트워크에 연결하려면 TAP/VETH 장치를 생성하고 한쪽을 브리지에 연결하는 동시에 물리적 인터페이스를 호스트의 브리지에 연결해야 했습니다. 다음과 같습니다.

이제 MACVLAN을 사용하면 브리징 없이도 MACVLAN과 연결된 물리적 인터페이스를 네임스페이스에 직접 바인딩할 수 있습니다.

이것이 내가 한 일입니다:

$ sudo ip netns add ns0
$ sudo ip netns exec ns0 ip link set lo up
$ sudo ip link add macvlan0 link eth0 type macvlan mode bridge
$ sudo ip link set macvlan0 netns ns0
$ sudo ip netns exec ns0 ip link set macvlan0 up
$ sudo ip netns exec ns0 ip addr add 172.29.6.123/21 dev macvlan0
$ sudo ip netns exec ns0 ping 172.29.0.1
PING 172.29.0.1 (172.29.0.1) 56(84) bytes of data.
64 bytes from 172.29.0.1: icmp_seq=1 ttl=64 time=0.360 ms
64 bytes from 172.29.0.1: icmp_seq=2 ttl=64 time=0.412 ms

이건 일이야!

답변2

마지막 두 명령(네트워크 네임스페이스의 기본 게이트웨이 + 기본 네임스페이스의 masquerade)까지는 모든 것이 괜찮아 보입니다.

이 두 가지를 건너뛰는 경우 물리적 인터페이스가 두 개의 내부 인터페이스에 브리지되는 구성이 있어야 합니다. 하나는 192.168.1.10기본 네임스페이스에 있는 브리지의 내부 인터페이스이고 다른 하나는 기본 네임스페이스 192.168.1.11에 있습니다 namespace1.

따라서 이는 두 개의 물리적 네트워크 인터페이스를 동일한 서브넷에 연결하는 것과 같습니다(하나는 기본 네임스페이스에서, 다른 하나는 veth-pair 대신 사용하여 동일한 효과를 얻을 namespace수 있음 ).macvlan

192.168.1.10전달이나 매스커레이딩이 필요하지 않으며 기본 네임스페이스의 기본 경로가 잘못되었습니다.

두 네임스페이스의 라우팅이 올바른 경우(확인) 다른 인터페이스는 물론 물리적 인터페이스에 연결된 모든 항목을 ping할 수 있어야 합니다.

xterm테스트 목적으로 등을 시작하는 것이 좋습니다 . namespace1그러면 항상 입력할 필요 없이 모든 것을 직접 구성할 수 있습니다 ip netns exec namespace1 ip ....

관련 정보