Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

18.12.11.5. 자체 필터 작성

libvirt는 몇 가지 네트워킹 필터만 제공하므로 자체 작성을 고려할 수 있습니다. 이를 계획할 때 네트워크 필터링 하위 시스템과 내부적으로 작동하는 방법에 대해 알아야 할 몇 가지 사항이 있습니다. 확실히 당신은 또한 필터링하고 싶은 프로토콜을 잘 이해하고 있으므로 원하는 트래픽을 통과 할 수있는 것보다 더 이상 트래픽을 전달 할 수 없다는 것을 알고 있어야합니다.
네트워크 필터링 하위 시스템은 현재 Linux 호스트 물리적 시스템에서만 사용할 수 있으며 Qemu 및 KVM 유형의 가상 시스템에서만 작동합니다. Linux에서는 ebtables, iptables 및 ip6tables에 대한 지원을 기반으로 빌드되고 해당 기능을 사용합니다. 18.12.10절. “지원되는 프로토콜” 에 있는 목록을 고려할 때 ebtables를 사용하여 다음 프로토콜을 구현할 수 있습니다.
  • mac
  • STP(범위 트리 프로토콜)
  • VLAN(802.1Q)
  • ARP, rarp
  • ipv4
  • ipv6
IPv4에서 실행되는 모든 프로토콜은 iptables를 사용하여 지원되며 IPv6을 통한 프로토콜은 ip6tables를 사용하여 구현됩니다.
Linux 호스트 물리적 시스템을 사용하면 libvirt의 네트워크 필터링 하위 시스템에서 생성한 모든 트래픽 필터링 규칙이 먼저 ebtables 및 이후의 iptables 또는 ip6tables 필터를 통해 구현되는 필터링 지원을 통해 전달됩니다. 필터 트리에 프로토콜을 포함하는 규칙( mac, stp, vlan arp, ipv4 또는 ipv6)이 있는 경우 나열된 ebtable 규칙과 값이 자동으로 먼저 사용됩니다.
동일한 프로토콜을 위한 여러 체인을 생성할 수 있습니다. 체인 이름에는 이전에 열거된 프로토콜 중 하나의 접두사가 있어야 합니다. ARP 트래픽 처리를 위한 추가 체인을 만들려면 arp-test라는 체인을 지정할 수 있습니다.
예를 들어 IP 프로토콜 필터를 사용하여 소스 및 대상 포트별로 UDP 트래픽을 필터링하고 허용되는 UDP 패킷의 프로토콜, 소스 및 대상 IP 주소 및 포트의 속성을 지정할 수 있습니다. 이를 통해 ebtables를 사용하여 UDP 트래픽을 조기에 필터링할 수 있습니다. 그러나 UDP 패킷과 같은 IP 또는 IPv6 패킷은 ebtables 계층을 통과하면 iptables 또는 ip6tables 규칙을 인스턴스화하는 필터 트리에 하나 이상의 규칙이 있으면 해당 필터링 계층에 대해 UDP 패킷 전달을 허용하는 규칙도 필요합니다. 이는 적절한 udp 또는 udp-ipv6 트래픽 필터링 노드를 포함하는 규칙을 사용하여 수행할 수 있습니다.

예 18.11. 사용자 정의 필터 생성

다음 요구 사항을 충족하기 위해 필터가 필요하다고 가정합니다.
  • VM의 인터페이스가 MAC, IP 및 ARP 스푸핑을 사용하지 않음
  • VM 인터페이스의 TCP 포트 22 및 80만 열기
  • VM이 인터페이스에서 ping 트래픽을 보낼 수 있지만 인터페이스에서 VM을 ping하도록 허용하지 않습니다.
  • VM에서 DNS 조회(UDP to port 53)를 수행할 수 있습니다.
기존 스마트 트래픽 네트워크 필터에 의해 스푸핑을 방지해야 하므로 이 작업을 수행하는 방법은 사용자 정의 필터에서 참조하는 것입니다.
TCP 포트 22 및 80에 대한 트래픽을 활성화하기 위해 이러한 유형의 트래픽을 활성화하기 위해 두 개의 규칙이 추가됩니다. 게스트 가상 머신이 ping 트래픽을 보낼 수 있도록 하려면 ICMP 트래픽에 대한 규칙이 추가됩니다. 간단한 이유로, 일반 ICMP 트래픽을 게스트 가상 시스템에서 시작할 수 있으며 ICMP 에코 요청 및 응답 메시지에 지정되지 않습니다. 다른 모든 트래픽은 게스트 가상 머신에 도달하거나 시작할 수 없습니다. 이렇게 하려면 다른 모든 트래픽을 삭제하는 규칙이 추가됩니다. 게스트 가상 시스템이 test 이고 필터를 연결할 인터페이스가 eth0 이라고 가정하면 test- eth0 이라는 필터가 생성됩니다.
이러한 고려 사항의 결과는 다음과 같은 네트워크 필터 XML입니다.
<filter name='test-eth0'>
  <!- - This rule references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule enables TCP ports 22 (ssh) and 80 (http) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='22'/>
  </rule>

  <rule action='accept' direction='in'>
    <tcp dstportstart='80'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp/>
  </rule>>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>