헤더 다음 IPv4
에 오는 패킷을 삭제하는 규칙을 추가하고 싶습니다 . 나는 헤더의 (인터넷 헤더 길이) 필드에 옵션을 포함하여 IPv4 헤더의 32비트 단어 수가 포함되어 있음 IP option
을 이해합니다 . IHL
따라서 규칙은 IHL
필드에서 패킷+옵션 길이를 가져와서 20(옵션이 없는 IPv4 헤더 길이)과 비교하고, 20보다 크면 패킷을 삭제해야 한다는 것입니다.
iptables
헤더를 검사 IP
하고 평가(산술 연산 수행) 할 수 있는 특정 모듈이 있습니까 ?
답변1
iptables
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
원하는 것을 선택하세요.