netfilter: IP 옵션이 있는 패킷 삭제

netfilter: IP 옵션이 있는 패킷 삭제

헤더 다음 IPv4에 오는 패킷을 삭제하는 규칙을 추가하고 싶습니다 . 나는 헤더의 (인터넷 헤더 길이) 필드에 옵션을 포함하여 IPv4 헤더의 32비트 단어 수가 포함되어 있음 IP option을 이해합니다 . IHL따라서 규칙은 IHL필드에서 패킷+옵션 길이를 가져와서 20(옵션이 없는 IPv4 헤더 길이)과 비교하고, 20보다 크면 패킷을 삭제해야 한다는 것입니다.

iptables헤더를 검사 IP하고 평가(산술 연산 수행) 할 수 있는 특정 모듈이 있습니까 ?

답변1

iptablesu32조건을 일치시키기 위해 일부 비트별(임의 산술은 아님) 연산, 범위 비교 및 ​​패킷 페이로드에 대한 포인터와 같은 간접 지시를 수행할 수 있는 일치 방법이 포함되어 있습니다 .

u32

U32는 패킷에서 추출된 최대 4바이트의 양이 지정된 값을 가지고 있는지 테스트합니다. 추출할 항목에 대한 사양은 tcp 헤더 또는 페이로드의 지정된 오프셋에서 데이터를 찾을 수 있을 만큼 일반적입니다.

자체 하위 언어 문법이 있으므로 매뉴얼의 문법과 예제를 검토해야 합니다.

국제인도법는 IP 헤더 크기(바이트 단위가 아닌 32비트 청크 단위)이고 헤더의 처음 32비트(IPv4의 경우 값이 0x04인 버전의 경우 4비트, IHL의 경우 4비트)의 일부입니다. 옵션에서 이 크기는 최소 크기(20(바이트) / 4(32비트 단어당 바이트)여야 합니다. 따라서 IHL = 5(32비트 단어)입니다. IHL < 5인 잘못된 사례는 처리하지 않겠습니다. IPv4 스택이 이미 이를 처리했어야 합니다.

이는 다음과 같이 해석됩니다.

  • 처음 32비트 값을 가져옵니다.
  • IHL 부분에 마스크를 적용하세요
  • 24비트로 이동
  • 같음을 5와 비교(결과를 !일치 항목과 반전)

따라서 들어오는 패킷을 삭제하려면iptables:

iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 >> 24 = 5' -j DROP

반전 없이(대신 6 이상 일치):

iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 >> 24 = 6:0xF' -j DROP

매뉴얼에는 24비트로 이동한 다음 4를 곱하여(따라서 22비트만 이동) 32비트 단어가 아닌 바이트를 갖도록( u32나중에 사용되는 포인터가 8비트 주소를 사용하기 때문에) 유사한 예가 있습니다. 레이어 4 페이로드를 사용하고 추가 작업을 계속합니다.

... 0 >> 22 & 0x3C @ 0 >> 24 = 0"

첫 번째 0은 바이트 0-3을 읽음을 의미하고 >>22는 22비트를 오른쪽으로 이동한다는 의미입니다. 24비트를 이동하면 첫 번째 바이트가 제공되므로 22비트만 4배에 몇 비트를 더한 값입니다. 그런 다음 &3C는 오른쪽의 추가 비트 2개와 첫 번째 바이트의 처음 4비트를 제거합니다. 예를 들어 IHL=5인 경우 IP 헤더의 길이는 20(4 x 5)바이트입니다.
[...]

OP의 경우 제공 :

iptables -A INPUT -m u32 ! --u32 '0 >> 22 & 0x3C = 20' -j DROP

반전 없이(그리고 다음으로 가능한 첫 번째 값이 21이 아니라 24라는 사실이나 주어진 값이 더 큰 한 정확한 최대값에 대해 신경 쓰지 않고):

iptables -A INPUT -m u32 --u32 '0 >> 22 & 0x3C = 21:0xFF' -j DROP

첫 번째 방법은 다음과 같이 단순화될 수 있습니다.

  • 처음 32비트 값을 가져옵니다.
  • IHL 부분에 마스크를 적용하세요
  • 같음을 (5<<24)와 비교합니다. 즉, 0x05000000과 비교합니다(동일)

기부:

iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 = 0x05000000' -j DROP

또는:

iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 = 0x06000000:0x0F000000' -j DROP

또는:

  • 처음 32비트 값을 가져옵니다.
  • 0x45000000에서 0x45FFFFFF 사이 범위의 값을 비교하여 OK(IPv4언제나4로 시작하고 IHL 부분 뒤의 모든 값은 무시됩니다. 또는 0x46000000에서 0x4FFFFFFFF 사이(양호하지 않음)입니다.

기부:

iptables -A INPUT -m u32 ! --u32 '0 = 0x45000000:0x45FFFFFF' -j DROP

또는:

iptables -A INPUT -m u32 --u32 '0 = 0x46000000:0x4FFFFFFF' -j DROP

원하는 것을 선택하세요.

관련 정보