IPv4
다음 헤더 가 포함된 패킷을 삭제하는 규칙을 추가하고 싶습니다 IP option
. 내가 이해한 바에 따르면 IHL
헤더의 (인터넷 헤더 길이) 필드에는 옵션을 포함하여 IPv4 헤더의 32비트 단어 수가 포함되어 있습니다. 따라서 규칙은 IHL
필드에서 패킷 + 옵션 길이를 가져와서 20(옵션이 없는 IPv4 헤더 길이)과 비교하고 20보다 크면 패킷을 삭제해야 한다고 이해합니다 .
iptables
헤더를 확인 IP
하고 평가(산술 연산 수행) 할 수 있는 특정 모듈이 있습니까 ?
답변1
iptables
u32
패킷 페이로드에 대한 비트별(임의 산술은 아님) 연산, 범위 비교 및 조건 일치를 위한 포인터와 같은 간접 수행을 수행할 수 있는 match 메서드가 포함되어 있습니다 .
U32는 패킷에서 추출된 최대 4바이트의 양이 지정된 값을 가지고 있는지 테스트합니다. 콘텐츠 추출에 대한 사양은 TCP 헤더 또는 페이로드의 지정된 오프셋에서 데이터를 찾을 수 있을 만큼 일반적입니다.
여기에는 자체 하위 언어 구문이 있으므로 설명서에서 구문과 예제를 확인해야 합니다.
국제인도법IP 헤더 크기(바이트가 아닌 32비트 블록)이며 헤더의 처음 32비트(IPv4 값이 0x04인 버전의 경우 4비트, 그 뒤에 IHL의 4비트)가 포함됩니다. 옵션에서 이 크기는 최소 크기(20(바이트) / 4(32비트 단어당 바이트))여야 합니다. 따라서 IHL = 5(32비트 단어)입니다. IHL < 5인 잘못된 경우는 처리하지 않겠습니다. IPv4 스택이 이미 이를 처리해야 합니다.
이는 다음과 같이 번역됩니다.
- 값의 처음 32비트 가져오기
- 국제인도법 섹션을 은폐하세요
- 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비트 가져오기
- 국제인도법 섹션을 은폐하세요
- (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에서 0x4FFFFFFF 사이의 값은 이상을 나타냅니다.
주다:
iptables -A INPUT -m u32 ! --u32 '0 = 0x45000000:0x45FFFFFF' -j DROP
또는:
iptables -A INPUT -m u32 --u32 '0 = 0x46000000:0x4FFFFFFF' -j DROP
원하는 것을 선택하세요.