Linux 호스트의 유틸리티를 사용하면 iptables
미니 방화벽을 만들어야 합니다. 패키지 길이가 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만 설정하므로 원격 호스트의 ping 응답이 더 큰 TTL을 갖는다는 것입니다. 요즘 일반적인 기본 TTL은 64입니다. (권장 사항은 인터넷 너비의 두 배라고 생각합니다.)
또 다른 가능성은 10000바이트 핑을 조각화해야 했기 때문에 원격 호스트가 이에 대한 응답을 거부했다는 것입니다. 800바이트 핑을 보내보세요.
또한 그렇게 하면 sudo iptables -L -v
규칙이 몇 번이나 적중했는지 알려줍니다. 이는 디버깅에 유용할 수 있습니다.
또 다른 디버깅 옵션은 다음과 같은 규칙을 수행하는 것입니다.
sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG
DROP 규칙 이전. 그러면 패킷을 삭제하기 전에 커널 로그( 로 읽음 dmesg
)에 패킷이 기록됩니다. 그러면 무엇이 삭제되었는지 알아낼 수 있습니다.