Mit iptables
dem Dienstprogramm auf dem Linux-Host muss eine Mini-Firewall erstellt werden. Ich muss alle eingehenden Verbindungen mit einer Paketlänge von mehr als 722 UND TTL von mehr als 22 löschen. Benötige genau UND. Nur löschen, wenn beide Bedingungen WAHR sind.
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
Die IP-Adresse des Hosts ist 10.6.7.9
mit einer Firewall ausgestattet.
Ich habe von diesem Host aus 4 Tests durchgeführt und versucht, einen anderen Host anzupingen:
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.
Warum funktioniert der letzte Ping nicht und wie kann ich das Problem beheben?
Antwort1
Wenn die beiden Bedingungen gleichzeitig erfüllt sein müssen, sollten Sie die Bedingungen wie folgt strukturieren:
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
Antwort2
Eine gute Möglichkeit ist, dass die Ping-Antwort vom Remote-Host eine größere TTL hat, da die -t
Option nur die TTL des ausgehenden Pakets festlegt. Ein gängiger Standard-TTL ist heutzutage 64. (Ich glaube, die Empfehlung ist die doppelte Breite des Internets.)
Eine andere Möglichkeit wäre, dass der Remote-Host eine Antwort auf den 10.000-Byte-Ping verweigerte, da dieser fragmentiert werden musste. Versuchen Sie, einen 800-Byte-Ping zu senden.
Wenn Sie sudo iptables -L -v
dies tun, wird Ihnen außerdem angezeigt, wie oft die Regel zugeschlagen hat. Dies kann beim Debuggen hilfreich sein.
Eine weitere Möglichkeit zum Debuggen besteht darin, eine Regel wie die folgende zu verwenden:
sudo iptables -A LOGDROP -m length --length 722:65535 -j LOG
Vor der DROP-Regel. Dadurch wird das Paket vor dem Verwerfen in das Kernelprotokoll protokolliert (gelesen mit dmesg
). Sie können dann herausfinden, was verworfen wurde.