18.12.11.6. 사용자 정의 필터 샘플
위 XML의 규칙 중 하나에는 게스트 가상 시스템의 IP 주소가 소스 또는 대상 주소로 포함되어 있지만 트래픽 필터링은 올바르게 작동합니다. 그 이유는 규칙의 평가가 인터페이스별로 내부적으로 발생하는 반면, 규칙은 소스 또는 대상 IP 주소가 아닌 패킷을 전송하거나 수신하는지 여부에 따라 추가로 평가되기 때문입니다.
예 18.12. 네트워크 인터페이스 설명을 위한 XML 샘플
테스트 게스트 가상 머신의 도메인 XML 내에서 가능한 네트워크 인터페이스 설명에 대한 XML 조각은 다음과 같습니다.
[...]
<interface type='bridge'>
<source bridge='mybridge'/>
<filterref filter='test-eth0'/>
</interface>
[...]
ICMP 트래픽을 보다 엄격하게 제어하고 게스트 가상 머신에서 ICMP 에코 요청만 보낼 수 있고 게스트 가상 머신에서 ICMP 에코 응답만 수신하도록 위의 ICMP 규칙은 다음 두 가지 규칙으로 교체될 수 있습니다.
<!- - enable outgoing ICMP echo requests- ->
<rule action='accept' direction='out'>
<icmp type='8'/>
</rule>
<!- - enable incoming ICMP echo replies- ->
<rule action='accept' direction='in'>
<icmp type='0'/>
</rule>
예 18.13. 두 번째 예제 사용자 정의 필터
이 예제에서는 위의 예제와 같이 유사한 필터를 빌드하는 방법을 설명하지만 게스트 가상 시스템 내에 있는 ftp 서버를 사용하여 요구 사항 목록을 확장합니다. 이 필터의 요구 사항은 다음과 같습니다.
- 게스트 가상 머신의 인터페이스가 MAC, IP 및 ARP 스푸핑을 사용하지 않도록 합니다.
- 게스트 가상 머신 인터페이스에서 TCP 포트 22 및 80만 열기
- 게스트 가상 머신이 인터페이스에서 ping 트래픽을 보낼 수 있지만 인터페이스에서 게스트 가상 머신을 ping할 수 없습니다.
- 게스트 가상 머신이 DNS 조회를 수행할 수 있음 (UDP ~ 53)
- 게스트 가상 머신 내부에서 실행할 수 있도록 ftp 서버(활성 모드)를 활성화합니다.
게스트 가상 머신 내부에서 FTP 서버를 실행하도록 허용하는 추가 요구 사항은 FTP 제어 트래픽에 대해 포트 21에 연결할 수 있도록 허용하며 게스트 가상 머신이 게스트 가상 시스템의 TCP 포트 20에서 FTP 클라이언트(FTP 활성 모드)로 다시 생성되는 발신 TCP 연결을 설정할 수 있도록 허용하는 요구 사항입니다. 이 필터를 작성하는 방법에는 여러 가지가 있으며 이 예제에는 두 가지 가능한 솔루션이 포함됩니다.
첫 번째 솔루션은 Linux 호스트 물리적 머신의 연결 추적 프레임워크에 후크를 제공하는 TCP 프로토콜의 state 속성을 사용합니다. 게스트 가상 머신 시작 FTP 데이터 연결 (FTP 활성 모드)의 경우 RELATED 상태는 게스트 가상 머신 시작 FTP 데이터 연결이 기존 FTP 제어 연결의 결과 (또는 'has relationship with')로 인해 방화벽을 통해 패킷을 전달할 수 있음을 탐지하는 데 사용됩니다. 그러나 RELATED 상태는 FTP 데이터 경로에 대해 발신 TCP 연결의 첫 번째 패킷에만 유효합니다. 그 후, 상태는 ESTABLISHED이며, 이는 들어오고 나가는 방향에 동일하게 적용됩니다. 이 모든 것은 게스트 가상 시스템의 TCP 포트 20에서 시작되는 FTP 데이터 트래픽과 관련이 있습니다. 그러면 다음과 같은 해결 방법이 있습니다.
<filter name='test-eth0'>
<!- - This filter (eth0) 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 port 21 (FTP-control) to be reachable - ->
<rule action='accept' direction='in'>
<tcp dstportstart='21'/>
</rule>
<!- - This rule enables TCP port 20 for guest virtual machine-initiated FTP data connection related to an existing FTP control connection - ->
<rule action='accept' direction='out'>
<tcp srcportstart='20' state='RELATED,ESTABLISHED'/>
</rule>
<!- - This rule accepts all packets from a client on the FTP data connection - ->
<rule action='accept' direction='in'>
<tcp dstportstart='20' state='ESTABLISHED'/>
</rule>
<!- - This rule enables TCP port 22 (SSH) to be reachable - ->
<rule action='accept' direction='in'>
<tcp dstportstart='22'/>
</rule>
<!- -This rule enables TCP port 80 (HTTP) to be reachable - ->
<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>
RELATED 상태를 사용하여 필터를 시도하기 전에 적절한 연결 추적 모듈이 호스트 물리적 시스템의 커널에 로드되었는지 확인해야 합니다. 커널 버전에 따라 게스트 가상 시스템과의 FTP 연결이 설정되기 전에 다음 두 명령 중 하나를 실행해야 합니다.
- #modprobe nf_conntrack_ftp - 사용 가능한 경우 OR
- #modprobe ip_conntrack_ftp 를 위의 코드를 사용할 수 없는 경우
FTP 이외의 프로토콜을 RELATED 상태와 함께 사용하는 경우 해당 모듈을 로드해야 합니다. 모듈은 ftp, tftp, irc, sip, sctp 및 amanda 프로토콜에서 사용할 수 있습니다.
두 번째 솔루션은 이전 솔루션보다 연결의 상태 플래그를 사용합니다. 이 솔루션은 트래픽 흐름의 첫 번째 패킷이 탐지될 때 NEW 연결 상태가 유효하다는 사실을 활용합니다. 그 후, 흐름의 첫 번째 패킷이 허용되면 흐름은 연결이 되므로 ESTABLISHED 상태가 됩니다. 따라서 ESTABLISHED 연결의 패킷이 게스트 가상 머신에 도달하거나 게스트 가상 머신에 의해 보낼 수 있도록 일반 규칙을 작성할 수 있습니다. 이는 NEW 상태로 식별되는 첫 번째 패킷에 대한 특정 규칙을 작성하고 데이터가 허용되도록 포트에 지시합니다. 명시적으로 승인되지 않은 포트에 대한 모든 패킷은 삭제됩니다, 따라서 ESTABLISHED 상태에 도달하지 않습니다. 해당 포트에서 전송된 후속 패킷도 삭제됩니다.
<filter name='test-eth0'>
<!- - This filter references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing and IP address parameter, libvirt will detect the IP address the VM is using. - ->
<filterref filter='clean-traffic'/>
<!- - This rule allows the packets of all previously accepted connections to reach the guest virtual machine - ->
<rule action='accept' direction='in'>
<all state='ESTABLISHED'/>
</rule>
<!- - This rule allows the packets of all previously accepted and related connections be sent from the guest virtual machine - ->
<rule action='accept' direction='out'>
<all state='ESTABLISHED,RELATED'/>
</rule>
<!- - This rule enables traffic towards port 21 (FTP) and port 22 (SSH)- ->
<rule action='accept' direction='in'>
<tcp dstportstart='21' dstportend='22' state='NEW'/>
</rule>
<!- - This rule enables traffic towards port 80 (HTTP) - ->
<rule action='accept' direction='in'>
<tcp dstportstart='80' state='NEW'/>
</rule>
<!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
<rule action='accept' direction='out'>
<icmp state='NEW'/>
</rule>
<!- - This rule enables outgoing DNS lookups using UDP - ->
<rule action='accept' direction='out'>
<udp dstportstart='53' state='NEW'/>
</rule>
<!- - This rule drops all other traffic - ->
<rule action='drop' direction='inout'>
<all/>
</rule>
</filter>