해결책:

해결책:

내 서버에는 VM 간 방화벽 및 라우팅을 위해 간단한 L2 Linux 브리지를 통해 OPNsense VM에 연결된 여러 VM이 있습니다.

가상 머신은 OPNsense서버의 단일 인터페이스를 통해 연결됩니다. 가상 머신은 이 간단한 L2 브리지를 통해 가상 머신에 연결됩니다.macvtapenp3s0
vm01OPNsense

vm01가상 머신의 브리지 구성 hypervisor:

auto br_vm01
iface br_vm01 inet manual
    bridge_ports none

vm01브리지에 연결된 인터페이스 br_vm01: vnet2
브리지에 연결된 인터페이스:OPNsensebr_vm01vnet6

hypervisorIP 호스팅 가상 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

vm01OPNsense하이퍼바이저와 통신하려면 가상 머신에 필요한 방화벽 규칙이 있어야 합니다 . 또한 다른 모든 유형의 연결도 제대로 작동합니다.

이 문제를 더 자세히 진단하기 위해 vnet2및 인터페이스 vnet6에서 일부 tcpdump를 수행했습니다 .
IP 패킷은 정상적으로 해당 인터페이스로 들어오지 vnet2만 다시는 해당 인터페이스로 전송되지 않습니다 vnet6. 따라서 Linux 브리지는 어떻게든 이 패킷을 필터링합니다. 또한 가상 머신에서 패킷 캡처를 수행했지만 OPNsense패킷이 거기에 도달하지 못했습니다.

이는 하이퍼바이저에 연결하려고 할 때만 발생하며, 다른 항목에 연결하면 발생하지 않습니다.

내 질문: Linux에게 브리지를 멍청한 레이어 2 스위치로 취급하도록 지시하는 것이 가능합니까? OPNsense가상 머신에서 제공하는 필터링이므로 어떤 종류의 필터링도 필요하지 않습니다 .

나는 그것을 시도했고 효과가 있었습니다:
/sys/class/net/br_vm01/bridge/nf_call_iptables0으로 설정했습니다.
sysctl net.bridge.bridge-nf-call-iptables또한 0을 표시합니다.
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
브리지에서 VLAN 인식을 켜는 것도 도움이 되지 않습니다.
ebtables 규칙이 없습니다.

그리고 hypervisor커널과 함께 vm01실행Debian 115.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

관련 정보