17.14.11.5. 자체 필터 작성
libvirt는 몇 가지 예제 네트워킹 필터만 제공하므로 자체 작성을 고려할 수 있습니다. 이렇게 할 때 네트워크 필터링 하위 시스템과 내부적으로 작동하는 방법에 대해 알아야 할 몇 가지 사항이 있습니다. 물론 당신은 또한 당신이 원하는 것 보다 더 이상 트래픽과 허용하려는 트래픽이 통과 할 수 있도록 필터링하려는 프로토콜을 매우 잘 이해하고 이해해야합니다.
네트워크 필터링 하위 시스템은 현재 Linux 호스트 물리적 머신에서만 사용할 수 있으며 QEMU 및 KVM 유형의 가상 머신에서만 작동합니다. Linux에서는 ebtables, iptables, ip6tables에 대한 지원을 기반으로 하며 해당 기능을 사용합니다. 17.14.10절. “지원되는 프로토콜” 에서 찾은 목록을 고려할 때 ebtables를 사용하여 다음 프로토콜을 구현할 수 있습니다.
- mac
- STP (spanning tree protocol)
- VLAN(802.1Q)
- arp, rarp
- ipv4
- ipv6
IPv4를 통해 실행되는 모든 프로토콜은 iptables를 사용하여 지원되며, IPv6을 통한 이러한 프로토콜은 ip6tables를 사용하여 구현됩니다.
Linux 호스트 물리적 시스템을 사용하면 libvirt의 네트워크 필터링 하위 시스템에서 생성된 모든 트래픽 필터링 규칙이 먼저 ebtables에서 구현한 필터링 지원을 통과하고 나중에 iptables 또는 ip6tables 필터를 통해 구현됩니다. 필터 트리에 프로토콜( mac, stp, vlan arp, rarp, ipv4, ipv4)이 포함된 규칙이 있는 경우 ebtable 규칙과 나열된 값이 자동으로 사용됩니다.
동일한 프로토콜의 여러 체인을 만들 수 있습니다. 체인 이름에는 이전에 열거한 프로토콜 중 하나의 접두사가 있어야 합니다. ARP 트래픽을 처리하기 위한 추가 체인을 만들려면 이름이 arp-test인 체인을 지정합니다. 예를 들면 다음과 같습니다.
예를 들어, ip protocol 필터를 사용하여 소스 및 대상 포트를 통해 UDP 트래픽을 필터링하고 허용할 UDP 패킷의 프로토콜, 소스 및 대상 IP 주소 및 포트에 대한 속성을 지정할 수 있습니다. 이를 통해 ebtables를 사용하여 UDP 트래픽을 조기에 필터링할 수 있습니다. 그러나 UDP 패킷과 같은 IP 또는 IPv6 패킷이 ebtables 계층을 전달하면 iptables 또는 ip6tables 규칙을 인스턴스화하는 필터 트리에 하나 이상의 규칙이 있으므로 해당 필터링 계층에 대해 UDP 패킷을 전달하도록 하는 규칙도 필요합니다. 이는 적절한 udp 또는 udp-ipv6 트래픽 필터링 노드가 포함된 규칙으로 수행할 수 있습니다.
예 17.11. 사용자 정의 필터 생성
다음 요구 사항을 충족하는 데 필터가 필요하다고 가정합니다.
- VM의 인터페이스가 MAC, IP 및 ARP 스푸핑에서 방지
- VM 인터페이스의 TCP 포트 22 및 80만 엽니 다
- VM이 인터페이스에서 ping 트래픽을 보낼 수 있지만 VM이 인터페이스에서 ping을 ping하도록 허용하지 않음
- VM에서 DNS 조회를 수행할 수 있음(포트 53으로 UDP)
스푸핑을 방지하기 위한 요구 사항은 기존의
clean-traffic
네트워크 필터에 의해 충족되므로 이를 수행하는 방법은 사용자 정의 필터에서 참조하는 것입니다.
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>