Warum kann ich die REJECT-Richtlinie nicht für meine iptables OUTPUT-Kette verwenden?

11

Ich habe derzeit meine OUTPUT-Kette auf DROP eingestellt. Ich möchte es in REJECT ändern, damit ich den Hinweis habe, dass es meine Firewall ist, die mich daran hindert, irgendwohin zu gelangen, anstatt ein Problem mit dem Dienst zu haben, auf den ich zugreifen möchte (sofortige Ablehnung statt Zeitüberschreitung). Iptables scheint dies jedoch nicht zu interessieren. Wenn ich meine gespeicherte Regeldatei manuell bearbeite und versuche, sie wiederherzustellen, wird iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy namesie angezeigt und das Laden der Regeln wird verweigert. Wenn ich versuche, dies manuell einzustellen ( iptables -P OUTPUT REJECT), erhalte ich, iptables: Bad policy name. Run 'dmesg' for more information.aber es gibt keine Ausgabe in dmesg.

Ich habe bestätigt, dass die entsprechende Regel im Kernel kompiliert wurde, und habe neu gestartet, um sicherzustellen, dass sie geladen ist:

# CONFIG_IP_NF_MATCH_TTL is not set
CONFIG_IP_NF_FILTER=y
***
CONFIG_IP_NF_TARGET_REJECT=y
***
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y

(Sternchen hinzugefügt, um die zutreffende Regel hervorzuheben)

Alles, was ich finden kann, besagt, dass REJECT (im Allgemeinen) eine gültige Richtlinie / ein gültiges Ziel ist, aber ich kann nichts finden, das besagt, dass es für die Ketten INPUT, FORWARD oder OUTPUT nicht gültig ist. Mein Google-Fu hilft nicht. Ich bin auf Gentoo, wenn das einen Unterschied macht. Hat hier jemand einen Einblick?

ND Geek
quelle
Können Sie die iptablesfraglichen Regeln anzeigen?
Bahamat

Antworten:

15

REJECTist eine Zielerweiterung , während eine Kettenrichtlinie ein Ziel sein muss . Die Manpage sagt das (obwohl es nicht wirklich klar ist), aber einiges von dem, was es sagt, ist völlig falsch.

Die Richtlinie kann nur ACCEPToder DROPin integrierten Ketten sein. Wenn Sie alle Pakete ablehnen möchten, die nicht mit den vorherigen Regeln übereinstimmen, stellen Sie einfach sicher, dass die letzte Regel mit allen übereinstimmt, und fügen Sie eine Regel mit einer REJECTZielerweiterung hinzu. Mit anderen Worten, nachdem Sie alle relevanten Regeln hinzugefügt haben, tun Sie dies iptables -t filter -A OUTPUT -j REJECT.

Siehe „was sind die mögliche Kettenpolitik“ Gewinde auf der Netfilter - Liste für weitere Details.

Shawn J. Goff
quelle
Das macht Sinn und ein generisches REJECT am Ende sollte funktionieren. Aus Neugier, ist das Ziel Erweiterung Definition irgendwo ziemlich offensichtlich , und ich kann es nur knapp verfehlt, oder ist das eine der schlecht dokumentierten Bits?
ND Geek
1
Beim Lesen der gesamten Manpage ist klar, dass REJECT eine Zielerweiterung ist, aber die Manpage ist sehr lang, sodass "TL; DR" tendenziell gilt. Dies bedeutet auch, dass DROP, ACCEPT und QUEUE gültige Richtlinienziele sind. Nach dem aktuellen Code ist QUEUE nicht!
StarNamer
4

Ich konnte es nicht dokumentiert finden, aber ein Verweis hier zeigt an, dass die einzigen zulässigen Richtlinien ACCEPTor DROP sind. Dies wird bestätigt, indem man sich die Quelle von libiptc(die für die Manipulation der Regeln verantwortlich ist) in Zeile 2429 ansieht, in der sich der Code befindet

2429         if (strcmp(policy, LABEL_ACCEPT) == 0)
2430                 c->verdict = -NF_ACCEPT - 1;
2431         else if (strcmp(policy, LABEL_DROP) == 0)
2432                 c->verdict = -NF_DROP - 1;
2433         else {
2434                 errno = EINVAL;
2435                 return 0;
2436         }

Der ursprüngliche Thread schlägt vor, am besten REJECT am Ende der Kette hinzuzufügen, das sein sollte iptables -A OUTPUT -j REJECT.

Beachten Sie, dass der Code unmittelbar davor wie folgt lautet:

2423         if (!iptcc_is_builtin(c)) {
2424                 DEBUGP("cannot set policy of userdefinedchain `%s'\n", chain);
2425                 errno = ENOENT;
2426                 return 0;
2427         }
2428 

Sie können die Richtlinie also überhaupt nicht für eine benutzerdefinierte Kette festlegen.

StarNamer
quelle
Dieser Befehl im Thread ist falsch. -pdient zum Abgleichen eines Protokolls; er meinte -Awie meine Antwort sagt.
Shawn J. Goff
Das ist ziemlich interessant. Die Neugier in mir fragt sich, ob es einen Grund dafür gibt oder ob es einfach so ist, möglicherweise der Einfachheit halber (einfacher Code bedeutet schließlich weniger mögliche Stellen für Schwachstellen). Wenn ich selbst ein moderater Entwickler wäre, könnte ich versucht sein, es lokal zu hacken, aber da ich es nicht bin und es ein Stück Sicherheit ist, werde ich es nicht anfassen.
ND Geek
2

REJECTon OUTPUTmacht keinen Sinn; a REJECTgibt ein ICMP-Paket zurück, das ein Netzwerk durchlaufen müsste.

Fügen Sie -j LOGals letzte Regel (daher vor der DROPRichtlinie) eine neue hinzu, um zu sehen, was in der OUTPUTKette so weit kommt.

Aaron D. Marasco
quelle
1
Konnte das REJECTICMP-Paket nicht auf der lo-Schnittstelle zurückgegeben werden? Ich bin damit einverstanden, dass a LOGfür die Fehlerbehebung nützlich ist, aber ich hatte wirklich gehofft, mich daran zu erinnern, dass "Oh, ja ... das wird wahrscheinlich durch meine DROPiptables-Standardeinstellung blockiert " anstelle von Fehlerbehebungen für 5 Minuten den Kollegen dazu auffordert Der Zugriff auf den XYZ-Server erkennt, dass er wahrscheinlich lokal ist , was mein häufigster Ansatz ist, da mein typischer Arbeitstag selten Dinge trifft, für die ich noch kein Loch geöffnet habe. Natürlich muss ich das vielleicht besser berücksichtigen, aber eine Wohnung REJECTist offensichtlicher.
ND Geek
Ich glaube nicht, dass Sie möchten, dass ethXdie loSchnittstelle aus vielen Gründen Datenverkehr auf der Schnittstelle generiert . Sie sind sehr unabhängig; Sie können leicht Ketten auf die eine und nicht auf die andere anwenden.
Aaron D. Marasco