--to 옵션이 < 52인 경우 iptables 문자열 일치가 작동하지 않습니다.

--to 옵션이 < 52인 경우 iptables 문자열 일치가 작동하지 않습니다.

문자열과 일치하는 iptables 규칙을 입력하면 --to옵션은 다음과 같습니다.>= 52

iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 100 -j DROP

위의 내용은 제대로 작동하며 "anypattern" 문자열이 포함된 IP 패킷을 차단합니다.

--to이제 값을 변경하면 < 52작동하지 않습니다.

iptables -I FORWARD 1 -m string --string anypattern --algo bm --to 50 -j DROP

그리고 IP 패킷은 차단되지 않습니다!

뭔가 빠졌나요? 아니면 iptables 문제인가요?

예:

linux:~$ sudo iptables -I OUTPUT 1 -m string --algo bm --string 7oula --to 52 -j DROP
linux:~$ echo 7oulaaaaaaaaaaa | nc  212.227.247.109 80
^C  #<---- Blocked here ==> Good
linux:~$ sudo iptables -I OUTPUT 1 -m string --algo bm --string coula --to 51 -j DROP
linux:~$ echo coulaaaaaaaaaaa | nc  212.227.247.109 80
HTTP/1.1 400 Bad Request
Server: nginx
Date: Sun, 26 Jan 2020 15:35:55 GMT
Content-Type: text/html
Content-Length: 150
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

답변1

--to옵션은 다음을 제공합니다.최대문자열이 시작될 수 있는 오프셋입니다. 오프셋은 IP 패킷의 시작을 기준으로 합니다. 합산하면:

  • 20IP 헤더의 바이트
  • 20TCP 헤더의 바이트
  • 12일부 TCP 옵션의 바이트

결국 52바이트가 됩니다. 따라서 TCP 페이로드의 시작은 오프셋 52에 있으며, 그보다 작은 것은 TCP/IP 헤더와만 일치합니다.

TCP 옵션에는 고정 길이가 없습니다. 숫자 12는 다음을 통해 실험적으로 얻어졌습니다.tcpdump, 그러나 모든 시스템은 서로 다른 수의 옵션을 보낼 수 있습니다.

관련 정보