nftables를 사용하여 Tap 인터페이스를 보호하는 방법

nftables를 사용하여 Tap 인터페이스를 보호하는 방법

Qemu VM이 LAN에 연결하는 두 가지 주요 방법은 type=user다음과 같습니다 type=tap. 이 user모드는 개인 네트워크의 가상 머신을 완전히 격리하여 NAT를 통해 기본 네트워크 스택에 호스팅합니다. 사용하기가 더 복잡하며 물리적 인터페이스( ) 및 가상 인터페이스( )의 마스터가 tap되려면 가상이 필요합니다 . bridge이는 외부 세계와 호스트 시스템에서 가상 시스템으로 데이터가 흐르는 파이프와 같습니다. 나는 호스트 측 인터페이스에서 네트워크 트래픽을 조절하고 모든 http 요청을 일부 내부 IP 주소로 리디렉션하는 데 많은 시간을 보냈지만 성공하지 못했습니다. 모든 조언, 포럼 및 위키는 수많은 솔루션을 권장하지만 한 가지 주된 이유 때문에 작동하지 않습니다. VM 게스트의 패킷이 호스트 커널 네트워크 스택에 도달하지 않습니다. IP 호스트 주소가 목적지가 아닌 경우 브리지 수준에서 자체 방식을 선택하고 패킷 필터 체인에 의해 중재되는 방화벽 규칙을 충족하지 않습니다. 간단히 호스트 전역 정책을 (호스트 XYtables 사용)로 설정하여 이를 시도할 수 있으며 호스트 네트워크가 완전히 작동하지 않지만 게스트는 네트워크를 통해 계속해서 패킷을 보내고 받을 수 있음을 확인할 수 있습니다.eth0tap0tap0tap0iptablesnftablesDROP

문제는 VM 게스트를 호스트 가상 네트워크 인터페이스에 가상으로 연결하는 다른 방법이 있습니까? 더 나은 이해를 위해 다이어그램은 다음과 같습니다.

     General virtual connections for host/VM guest
    +---------------------------------------------+
    |    +-----------------------------+          |
    |    |    iptables    host kernel  |          |
    |    |    nftables   network stack |          |
    |    +-------+---------------------+          |
    |            |                                |
    |    +-------+---------+      +-----------+   |
---eth0--+    virtual      |      |    VM     |   |
    |    |    bridge       +-tap-eth0 guest   |   |
---eth1--+      br0        |      |           |   |
    |    +-----------------+      +-----------+   |
    +---------------------------------------------+


       Host became a router for VM guest
    +-------------------------------------+
    |    +----------------+  +---------+  |
---eth0-->  host kernel   |  |    VM   |  |
    |    |                <-vppp guest |  |
---eth1-->  network stack |  |         |  |
    |    +----------------+  +---------+  |
    +-------------------------------------+

내 문제를 해결하려면 가상 브리지 자체의 트래픽을 제어하는 ​​방법(예: nftables 사용)을 찾거나 가상 와이어를 통해 VM 게스트 네트워크 인터페이스를 호스트의 가상 네트워크 인터페이스에 연결하는 방법을 찾아야 합니다. PPPoE 네트워크와 유사합니다.

그러나 마지막이자 가장 명확한 방법은 호스트 루프백을 포함하여 특정 포트(서비스)를 선택된 대상 주소로 강제 리디렉션할 수 있도록 Qemu 사용자 모드 네트워킹에 더 많은 매개변수를 추가하는 것입니다. 네, Qemu 팀에 그런 소망을 보냈고 답변을 받았습니다. 이것은 가장 중요한 기능이 아닙니다.

답변1

가능한 해결책은 두 가지가 있습니다.

  • nftables bridge제품군을 사용하고 레이어 3 아래에 필터를 적용하세요.
  • 호스트를 라우터로 사용하십시오.

첫 번째 솔루션은 보다 효율적인 옵션이지만 이더넷 프레임의 속성을 필터링하도록 제한됩니다. 브리지는 그러한 데이터를 처리하지 않기 때문에 레이어 3 이상의 IP 주소, 포트 또는 기타 항목을 필터링할 수 없습니다.

두 번째 솔루션을 사용하면 여기서 원하는 작업을 수행할 수 있습니다. 이것은 실제로매우두 가지 구체적인 이유 때문에 간단합니다.

  • 다른 네트워크 장치 유형과 마찬가지로 브리지 인터페이스에서 직접 IP 주소를 할당할 수 있습니다.
  • 브리지 인터페이스에 물리적 네트워크 장치를 연결할 필요가 없습니다.

이를 고려하여 수행하려는 "일반적인" 설정은 다음과 같습니다.

  1. 호스트 시스템에 브리지 인터페이스를 설정합니다. 고정 IP를 할당하되 물리적 인터페이스에 연결하지 마세요.
  2. 시스템이 1단계의 브리지 인터페이스와 외부 인터페이스 간의 라우팅을 처리하도록 nftables를 구성합니다.
  3. VM을 시작할 때 1단계의 브리지 인터페이스에 연결합니다.

그런 다음 경계 방화벽 역할을 하는 시스템과 다르지 않은 nftables에 있는 내용을 필터링하면 됩니다. 가상 머신에 정적 네트워크 구성을 제공할 필요가 없도록 호스트 시스템에 DHCP 서버를 설정하고 DNS 확인자를 캐싱하면 이 프로세스를 더 쉽게 만들 수 있습니다.

관련 정보