내 서버에는 VM 간 방화벽 및 라우팅을 위해 간단한 L2 Linux 브리지를 통해 OPNsense VM에 연결된 여러 VM이 있습니다.
가상 머신은 OPNsense
서버의 단일 인터페이스를 통해 연결됩니다. 가상 머신은 이 간단한 L2 브리지를 통해 가상 머신에 연결됩니다.macvtap
enp3s0
vm01
OPNsense
vm01
가상 머신의 브리지 구성 hypervisor
:
auto br_vm01
iface br_vm01 inet manual
bridge_ports none
vm01
브리지에 연결된 인터페이스 br_vm01
: vnet2
브리지에 연결된 인터페이스:OPNsense
br_vm01
vnet6
hypervisor
IP 호스팅 가상 vm0
머신 OPNsense
:10.1.0.8
나는 다음을 시도합니다. 예를 들어 간단한 netcat을 수행하여 vm01
가상 머신에서 연결을 시도합니다 hypervisor
.
root@vm01:~# nc -vzw 2 10.1.0.8 8080
10.1.0.8: inverse host lookup failed: Unknown host
(UNKNOWN) [10.1.0.8] 8080 (http-alt) : Connection timed out
vm01
OPNsense
하이퍼바이저와 통신하려면 가상 머신에 필요한 방화벽 규칙이 있어야 합니다 . 또한 다른 모든 유형의 연결도 제대로 작동합니다.
이 문제를 더 자세히 진단하기 위해 vnet2
및 인터페이스 vnet6
에서 일부 tcpdump를 수행했습니다 .
IP 패킷은 정상적으로 해당 인터페이스로 들어오지 vnet2
만 다시는 해당 인터페이스로 전송되지 않습니다 vnet6
. 따라서 Linux 브리지는 어떻게든 이 패킷을 필터링합니다. 또한 가상 머신에서 패킷 캡처를 수행했지만 OPNsense
패킷이 거기에 도달하지 못했습니다.
이는 하이퍼바이저에 연결하려고 할 때만 발생하며, 다른 항목에 연결하면 발생하지 않습니다.
내 질문: Linux에게 브리지를 멍청한 레이어 2 스위치로 취급하도록 지시하는 것이 가능합니까? OPNsense
가상 머신에서 제공하는 필터링이므로 어떤 종류의 필터링도 필요하지 않습니다 .
나는 그것을 시도했고 효과가 있었습니다:
/sys/class/net/br_vm01/bridge/nf_call_iptables
0으로 설정했습니다.
sysctl net.bridge.bridge-nf-call-iptables
또한 0을 표시합니다.
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
브리지에서 VLAN 인식을 켜는 것도 도움이 되지 않습니다.
ebtables 규칙이 없습니다.
그리고 hypervisor
커널과 함께 vm01
실행Debian 11
5.10.0-11
답변1
해결책:
답을 찾았습니다. 문제는 매개변수를 테스트하는 방식입니다 /proc/sys/net/bridge/bridge-nf-call-iptables
.
테스트를 해보니, 변경한 것뿐만 /proc/sys/net/bridge/bridge-nf-call-iptables
아니라 다른 변수도 많이 변경했습니다. 불행히도 이것은 작동하지 않습니다. 결국 0
이렇게 설정하면 문제가 해결될 수 있다는 것을 알게 되었습니다 .
이유
그러나 이것이 왜 문제를 일으키는지 아직 설명하지 못합니다.
문제는 브리지와 혼동되는 것처럼 보이는 docker의 iptables 규칙으로 인해 발생합니다. 이 문제는 docker가 연 하이퍼바이저의 열린 포트에 연결하려고 할 때만 발생합니다. 따라서 이것은 열리지 않은 것에서는 발생하지 않습니다.nc -l -p 8081