트래픽이 로컬에서 발생하는지 여부에 따라 nftables를 사용하여 브리지를 통한 트래픽을 필터링(속도 제한)하려면 어떻게 해야 합니까?

트래픽이 로컬에서 발생하는지 여부에 따라 nftables를 사용하여 브리지를 통한 트래픽을 필터링(속도 제한)하려면 어떻게 해야 합니까?

이것이 특히 로컬에서 발생하는 패킷/이더넷 프레임의 경우 브리지에서 트래픽 필터링이 작동하는 방식을 이해하는 데 도움이 되었기를 바랍니다. 이를 설명하기 위해 지금까지의 상황과 목표, 진행한 조치, 실패한 부분에 대해 간략하게 설명하겠습니다.

상태

Linux 호스트(debian Buster x64)에는 Windows Server 2019를 실행하는 가상 머신(Qemu/KVM)이 있습니다. 어떤 이유로든 모든 네트워크 트래픽의 속도를 제한해야 합니다.입력하다그 가상 머신호스트 이외의 모든 소스에서(즉, 다른 물리적 머신에서). 이에 비해 모든 네트워크 트래픽은호스트 자체에서 발생해당 가상 머신으로 이동하세요.아니요속도 제한이 적용됩니다.

Windows 자체는 QoS 메커니즘을 제공하지만 이는 아웃바운드 트래픽에만 작동하거나 문제 해결에 적합하지 않습니다. 그래서 호스트 측에서 속도 제한을 구현해 보기로 결정했습니다.

VM은 브리지를 통해 호스트 네트워크에 연결됩니다.

root@cerberus /var/log # brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.002590fb7105       no              enp1s0f1
                                                        garak0

garak0, 두 번째 브리지 포트는 VM의 가상 네트워크 어댑터이고, enp1s0f1첫 번째 브리지 포트는 물리적 네트워크 어댑터입니다. enp1s0f1외부에 연결된 이 호스트의 유일한 물리적 네트워크 어댑터입니다. 즉, 다른 컴퓨터에서 이 호스트로의 모든 트래픽이 를 통해 전달됩니다 enp1s0f1.

MAC 주소는 다음과 같습니다(여기서 관련 없는 줄과 관심 없는 여러 인터페이스 생략).

root@cerberus /var/log # ifconfig -a
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.20.10  netmask 255.255.255.0  broadcast 192.168.20.255
        ether 00:25:90:fb:71:05  txqueuelen 1000  (Ethernet)
        ...
enp1s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:25:90:fb:71:05  txqueuelen 1000  (Ethernet)
        ...
garak0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether b6:89:d8:4e:fa:2c  txqueuelen 1000  (Ethernet)
        ...

VM의 가상 NIC 반대편에 있는 MAC 주소(즉, VM의 O/S가 실제로 보고 VM에 연결된 컴퓨터의 arp 캐시에 있는 MAC 주소) 02:01:01:01:16:01.

표적

nftables를 사용하여 계층 2에서 브리지 트래픽을 필터링하여 가상 머신으로 들어오는 트래픽의 속도를 제한하고 싶습니다. 제한은 호스트 외부에서 들어오는 트래픽에만 적용되어야 하며 들어오는 트래픽에는 아무것도 적용되어서는 안 된다는 점을 명심하세요. 호스트에서. 가상 머신에 자신을 호스팅하세요.

거의 다 왔는데 쇼를 멈추게 하는 세부 사항 때문에 어려움을 겪고 있습니다(아래 참조).

내가 한 일과 효과가 있었던 일

어제 나는 nftables의 몇 가지 개념을 배우고(처음 사용함) 다음 규칙 세트를 만들었습니다.

root@cerberus /var/log # nft list ruleset
table bridge filter1 {
        chain test {
                type filter hook forward priority 0; policy accept;
                ether daddr 02:01:01:01:16:01 limit rate over 10 mbytes/second drop
        }
}

이는 가파른 학습 곡선입니다. 주로 제가 본 모든 예는 테이블과 체인이 아닌 규칙을 만드는 방법만 보여주거나 ether daddr분명히 작동하지 않는 입력 후크를 사용하기 때문입니다.

그럼에도 불구하고 이는 VM에 대한 트래픽 속도를 평균 10MB/s로 제한하므로 작동합니다.

작동하지 않는 것/실제 질문

위에 표시된 규칙 세트에 따르면,모두호스트 자체의 트래픽을 포함하여 가상 머신에 대한 트래픽은 속도가 제한됩니다. 규칙 세트를 변경하여 이 문제를 해결하려고 했습니다.

root@cerberus /var/log # nft list ruleset
table bridge filter1 {
        chain test {
                type filter hook forward priority 0; policy accept;
                ether daddr 02:01:01:01:16:01 ether saddr 00:25:90:fb:71:05 limit rate over 10 mbytes/second drop
        }
}

의심이 들었지만 이제 가상 머신으로의 트래픽이 더 이상 속도 제한이 없는 것을 보고 실망했습니다. 다른 물리적 시스템의 이더넷 프레임이 브리지 포트 1(즉, 물리적 네트워크 어댑터)의 MAC 주소를 이더넷 소스 주소로 전달하길 원합니다. 왜냐하면 이것이 브리지에 들어가는 포트이기 때문입니다. 그러나 (당연히도) 그렇지 않습니다. 송신 PC의 물리적 네트워크 어댑터의 MAC 주소를 소스 주소로 전달할 수 있습니다.

그래서 내 질문은 다음과 같습니다

가상 머신의 MAC 주소로 향하는 트래픽과 일치하지만 로컬에서 발생하는 부분은 일치하지 않도록 규칙(설정)을 어떻게 변경합니까? 호스트에서 생성된 트래픽은 MAC 주소가 없는 루프백 어댑터에서 발생할 수 있으므로 ether saddr !<MAC of loopback>.

ingress대신 bridge이 문제를 해결해 보거나 기기별 필터링을 사용해볼까 하는 생각도 들었습니다 . 그러나 가능한 조합과 함정의 수는 끝이 없으므로 시작점을 갖는 것이 작업을 더 쉽게 만듭니다.

관련 정보