iptables가 길이를 삭제하고 TTL 조건이 작동하지 않습니다

iptables가 길이를 삭제하고 TTL 조건이 작동하지 않습니다

iptablesLinux 호스트에서 유틸리티를 사용하여 미니 방화벽을 생성해야 합니다. 패킷 길이가 722보다 크고 TTL이 22보다 큰 모든 수신 연결을 제거해야 합니다. 정확히 AND여야 합니다. 두 조건이 모두 TRUE인 경우에만 제거하세요.

sudo iptables -N LOGDROP
sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -j LOGDROP
sudo iptables -A INPUT -m ttl --ttl-gt 22 -j LOGDROP
sudo iptables -A LOGDROP -m length --length 722:65535 -j DROP

호스트의 IP 주소는 10.6.7.9방화벽 뒤에 있습니다.

나는 이 호스트에서 다른 호스트에 ping을 시도하면서 4가지 테스트를 수행했습니다.

ping -s 10000 -t 250 10.6.7.10 //fail (TTL AND LENGHT are wrong)
ping -s 100 -t 200 10.6.7.10 //success (TTL is wrong)
ping -s 10 -t 10 10.6.7.10 //success (Both are right)
ping -s 10000 -t 10 10.6.7.10 // fail, BUT SHOULD BE TRUE.

마지막 핑이 작동하지 않는 이유와 해결 방법은 무엇입니까?

답변1

두 가지 조건이 동시에 충족되어야 하는 경우 다음 조건을 구성해야 합니다.

sudo iptables -A OUTPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP

sudo iptables -A INPUT -m ttl --ttl-gt 22 -m length --length 722:65535 -j DROP

답변2

-t이 옵션은 나가는 패킷에 대해서만 TTL을 설정하므로 원격 호스트의 핑 응답에 더 큰 TTL이 있을 가능성이 매우 높습니다 . 현재 공통 기본 TTL은 64입니다. (추천은 인터넷 폭의 두 배라고 생각합니다.)

또 다른 가능성은 10000바이트 핑이 조각화되어야 하기 때문에 원격 호스트가 이에 대한 응답을 거부하는 것입니다. 800바이트 핑을 보내보세요.

또한 이렇게 하면 sudo iptables -L -v해당 규칙이 몇 번이나 적중되었는지 알려줍니다. 이는 디버깅에 유용합니다.

또 다른 디버깅 옵션은 다음과 같은 규칙을 구현하는 것입니다.

sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG

DROP 규칙 이전. 그러면 패킷을 삭제하기 전에 커널 로그( read 사용 dmesg)에 패킷이 기록됩니다. 그러면 누락된 부분을 해결할 수 있습니다.

관련 정보