Linux 인터페이스 모드 MACVLAN 및 개인 모드가 광고된 대로 작동하지 않는 것 같습니다(Ubuntu)

Linux 인터페이스 모드 MACVLAN 및 개인 모드가 광고된 대로 작동하지 않는 것 같습니다(Ubuntu)

인터페이스 간의 모든 통신이 호스트에서 영구 기본 게이트웨이로 전송되도록 가상 인터페이스(MACVLAN 유형)를 생성하려고 합니다. "비공개" 모드를 설명하는 기사가 많이 있습니다.여기

개인: 인터페이스에 바인딩된 MAC VLAN이 서로 통신할 수 없도록 들어오는 모든 패킷을 필터링합니다(소스 MAC 주소가 MAC VLAN 인터페이스 중 하나와 일치하는 인터페이스를 통해 들어오는 모든 패킷을 삭제함).

몇 가지 인터페이스를 구성했는데 "개인" 모드가 광고된 대로 작동하지 않는 것 같습니다. 내가 뭐 잘못 했어요? 호스트는 Ubuntu 18.04 Bionic 버전입니다.

"모드별" 명령을 무시하고 호스트 내에서 패킷이 교환됩니다. 단 4개의 명령으로 쉽게 재현할 수 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.

root@ubnt-bkp:/home/super# uname -a
Linux ubnt-bkp 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1A ens160.3 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.3 up
root@ubnt-bkp:/home/super# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:4f:a9:99:99:02 brd ff:ff:ff:ff:ff:ff
...
...
18: ens160.3@ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP **mode** **DEFAULT** group default qlen 1000
    link/ether 38:94:ed:99:99:1a brd ff:ff:ff:ff:ff:ff

문제를 재현하라는 명령

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.5 up
root@ubnt-bkp:/home/super# dhclient ens160.5
root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.6 up
root@ubnt-bkp:/home/super# dhclient ens160.6

그런 다음 옵션을 ping사용하십시오 -I.

root@ubnt-bkp:/home/super#ping -I <IP address of ens160.5> <IP address of ens160.6>

( ens160재현하려고 할 때 이더넷 인터페이스 이름(예: eth0)으로 바꾸십시오.)

답변1

MACVLAN 인터페이스를 생성하는 데 사용한 명령이 정확합니다.

그러나 을 사용해도 ping -I이를 확인하는 데 도움이 되지 않습니다. 이는 소스 및 대상 인터페이스가 동일한 호스트(및 귀하의 경우와 같이 동일한 네임스페이스)에 있는 경우 ping항상 성공합니다 .

그러면 이것을 어떻게 테스트합니까? MACVLAN 인터페이스를 기본이 아닌 다른 네임스페이스에 배치합니다. 그런 다음 ping네임스페이스에서 실행합니다.

ens160IP 주소가 있는 물리적 인터페이스()로 시작한다고 가정합니다 192.0.2.2/24. 또한 귀하의 라우터 게이트웨이 주소가 이라고 가정합니다 192.0.2.1.

지금:

# Create namespace named "ns5"
ip netns add ns5

# Create the macvlan interface as usual
ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private

# Move the just-created macvlan interface into the "ns5" namespace
ip link set ens160.5 netns ns5

# Set the link up. Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip link set ens160.5 up

# Set the IP address for the macvaln interface.  Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip address add dev ens160.5 192.0.2.205/24


# Repeat above for another macvlan interface, this one in another namespace
# called "ns6"

ip netns add ns6
ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
ip link set ens160.6 netns ns6
ip netns exec ns6 ip link set ens160.6 up
ip netns exec ns6 ip address add dev ens160.6 192.0.2.206/24

이 시점부터 두 macvtap 인터페이스 모두 성공적으로 게이트웨이를 ping할 수 있습니다.

ip netns exec ns5 ping 192.0.2.1
ip netns exec ns6 ping 192.0.2.1

게이트웨이 장치에 액세스할 수 있는 경우 192.0.2.205 및 192.0.2.6에 대한 ARP 항목에 macvlan 인터페이스의 MAC 주소가 표시되는지 확인할 수 있어야 합니다.

그러나 macvlan 인터페이스가 private모드에 있으므로 다음 명령은 모두 실패합니다.

# Try to reach ens160.6 from ens160.5
ip netns exec ns5 ping 192.0.2.206

# Try to reach ens160.5 from ens160.6
ip netns exec ns6 ping 192.0.2.205

bridge대신 실험을 반복하면 private마지막 두 개의 ping 명령이 성공하는 것을 볼 수 있습니다.

관련 정보