..png)
인터페이스 간의 모든 통신이 호스트에서 영구 기본 게이트웨이를 향해 전송되도록 가상 인터페이스(MACVLAN 유형)를 생성하려고 합니다. 다음과 같이 "개인" 모드를 설명하는 글이 많이 있습니다.여기
개인: 인터페이스에 바인딩된 MAC VLAN이 서로 통신할 수 없도록 들어오는 모든 패킷을 필터링합니다(MAC VLAN 인터페이스 중 하나와 일치하는 소스 MAC 주소가 있는 인터페이스를 통해 들어오는 모든 패킷을 삭제합니다).
인터페이스 몇 개를 구성했는데 "비공개" 모드가 광고한 대로 작동하지 않는 것 같습니다. 내가 뭔가 잘못하고 있는 걸까요? 호스트는 Ubuntu 18.04 Bionic 릴리스입니다.
"mode private" 명령을 무시하고 호스트 내에서 패킷이 전환됩니다. 단 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
네임스페이스에서 실행합니다 .
ens160
IP 주소가 있는 물리적 인터페이스( )로 시작한다고 가정해 보겠습니다 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 명령이 성공하는 것을 볼 수 있습니다.