Чому я не можу використовувати політику REJECT у своїй мережі iptables OUTPUT?


11

Наразі мій ланцюг OUTPUT встановлений на DROP. Я хотів би змінити його на REJECT, щоб у мене з'ясувалося, що мій брандмауер перешкоджає мені дістатися кудись, а не проблему з будь-якою службою, до якої я намагаюся отримати доступ (негайне відхилення замість вичерпання часу). Однак, здається, iptables не переймаються цим. Якщо я вручну редагую збережений файл правил і намагаюся його відновити, я отримую, iptables-restore v1.4.15: Can't set policy 'REJECT' on 'OUTPUT' line 22: Bad policy nameі він відмовляється завантажувати правила. Якщо я спробую встановити це вручну ( iptables -P OUTPUT REJECT), я отримаю, iptables: Bad policy name. Run 'dmesg' for more information.але в dmesg виводу немає.

Я підтвердив, що відповідне правило збирається в ядро, і я перезавантажився, щоб переконатися, що він завантажений:

# 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

(Зірочки додані, щоб виділити застосовне правило)

Все, що я можу знайти, стверджує, що REJECT - це дійсна політика / ціль (загалом), але я не можу знайти нічого, що говорить, що це недійсно для ланцюгів INPUT, FORWARD або OUTPUT. Мій Google-фу не допомагає. Я на Gentoo, якщо це має значення. Хтось тут має якусь інформацію?


Чи можете ви показати відповідні iptablesправила?
bahamat

Відповіді:


15

REJECTє розширенням цілі , тоді як ланцюгова політика повинна бути цільовою . На сторінці чоловіка сказано, що (хоча це не зовсім зрозуміло), але щось із цього, що йдеться, є неправильним.

Політика може бути тільки ACCEPTабо DROPна вбудованому в ланцюгах. Якщо ви хочете, щоб ефект відхилення всіх пакетів, які не відповідають попереднім правилам, просто переконайтеся, що останнє правило відповідає всім, і додайте правило з REJECTцільовим розширенням. Іншими словами, після додавання всіх відповідних правил, зробіть iptables -t filter -A OUTPUT -j REJECT.

Детальнішу інформацію див. У розділі "які можливі політики ланцюжкової політики" у списку netfilter.


Це має сенс, і загальний REJECT в кінці повинен працювати. З цікавості, чи десь чітке визначення цільового розширення досить очевидно, і я його просто пропустив, чи це один із погано задокументованих бітів?
ND Geek

1
Читаючи всю чоловічу сторінку, зрозуміло, що REJECT - це цільове розширення, але сторінка man дуже довга, тому "TL; DR", як правило, застосовується. Це також означає, що DROP, ACCEPT та QUEUE є дійсними цілями політики; з поточного коду, QUEUE не!
StarNamer

4

Я не міг знайти це документально зафіксованим, але тут посилання вказує на те, що єдині дозволені політики - це ACCEPTor DROP. Це підтверджується, дивлячись на джерело з libiptc(який відповідає за зміну правил) навколо лінії 2429, де код має

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         }

Оригінальна нитка підказує, що найкраще зробити це додати REJECT на кінці ланцюжка, який повинен бути iptables -A OUTPUT -j REJECT.

Зауважте, що код перед цим:

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

Таким чином, ви не можете взагалі встановити політику на визначеній користувачем ланцюжку.


Ця команда в потоці невірна; -pпризначений для узгодження за протоколом; він мав на увазі, -Aяк каже моя відповідь.
Шон Дж. Гофф

Це досить цікаво. Цікавість в мені задається питанням, чи є причина в цьому, чи це просто так, можливо, для простоти (більш простий код означає менше можливих місць для вразливості все-таки). Якби я навіть був поміркованим розробником, я міг би спокуситися зламати його на місцевому рівні, але оскільки я цього не маю, і, враховуючи, що це є частиною безпеки, я не збираюся його торкатися.
ND Geek

2

REJECTна OUTPUTнемає сенсу; a REJECTповерне пакет ICMP, який повинен пройти через мережу.

Додайте нове -j LOGяк своє останнє правило (тому перед DROPполітикою), щоб побачити, що потрапляє так далеко в OUTPUTланцюг.


1
Не вдалося REJECTICMP-пакет повернутися до інтерфейсу lo? Я погоджуюся, що a LOGкорисний для усунення несправностей, але те, на що я дуже сподівався, - це спосіб нагадати мені, що "О, так ... це, мабуть, блокується моїм DROPiptables за замовчуванням", а не усунення несправностей протягом 5 хвилин просить колегу сервер доступу XYZ розуміє, що це, напевно, локальний , що є моїм найпоширенішим підходом, оскільки мій типовий робочий день рідко потрапляє на речі, для яких я вже не відкрив дірку. Звичайно, можливо, я повинен мати це на увазі краще, але квартира REJECTє більш очевидною.
ND Geek

Я не думаю, що ви хочете, ethXщоб loінтерфейс з багатьох причин генерував трафік на інтерфейсі. Вони дуже незалежні; Ви можете легко змусити ланцюги застосовуватись до одного, а не до іншого.
Аарон Д. Мараско
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.