테스트상의 이유로 옵션이나 유형에 따라 특정 패킷을 차단하고 싶습니다.
예를 들어, DHCP DORA 트랜잭션에서는 DHCP ACK 패킷만 차단하고 싶습니다.
iptables를 사용하여 이 작업을 수행할 수 있습니까? 그렇지 않다면 가능성은 무엇입니까?
답변1
이 모듈을 사용할 수 있습니다 u32
. (보다맨페이지iptables-extensions
). 사용자 친화적이지는 않지만 작동해야 합니다.
DHCP는 DHCP 메시지 유형을 포함한 일부 데이터가 옵션에 있고 어떤 순서로든 있을 수 있기 때문에 구문 분석하기가 약간 어렵습니다. 메시지 유형 옵션이 첫 번째 옵션일 수도 있습니다.
DHCP 옵션은 UDP 패킷의 오프셋 236에서 시작하며 IP 및 UDP 헤더의 길이는 20+8바이트입니다. 따라서 우리는 오프셋 264에서 시작하는 바이트에 관심이 있습니다. 처음 4바이트는 매직 식별자여야 하며 다음 3바이트는 메시지 유형 옵션을 확인할 수 있습니다. 유형 코드는 이고 0x35
, 길이는 항상 이며 0x01
, DHCPACK
값은 입니다 0x05
. (이것DHCP 패킷 형식은 tcpipguide.com에 설명되어 있습니다.)
따라서 표현식은 u32
다음과 같습니다.
--u32 '268 >> 8 = 0x350105'
이는 단순히 오프셋 268(빅 엔디안 숫자)에서 4바이트를 읽고, 이를 오른쪽으로 8비트 이동(처음 3바이트 유지)하고 이를 예상 값과 비교하는 것을 의미합니다.
매직넘버를 확인할 수도 있습니다:
--u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
일반 규칙을 사용하여 실제로 UDP 패킷이 올바른 포트로 전송되었는지 확인하는 것이 더 쉽기 iptables
때문에 다음과 같은 것을 사용하여 예상되는 DHCP 패킷과 일치시킵니다.
iptables -A foo -m udp --dport bootpc -m u32 --u32 '264 = 0x63825363 && 268 >> 8 = 0x350105'
그러나 앞서 언급했듯이 DHCP 옵션의 순서는 임의이므로 이는 신뢰할 수 있는 방법이 아니며, 특히 누군가 적극적으로 문제를 해결하려고 하는 경우에는 더욱 그렇습니다. 하지만 아마도 테스트용으로 작동할 수도 있습니다. 또한 IP 헤더에는 옵션이 포함되어 있지 않다고 가정합니다.