iptables OUTPUTチェーンでREJECTポリシーを使用できないのはなぜですか?


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-fuは役に立ちません。私はGentooを利用しています。ここに誰か洞察力がありますか?


iptables問題のルールを表示できますか?
バハマート

回答:


15

REJECTターゲット拡張ですが、チェーンポリシーはターゲットでなければなりません。マニュアルページには(それは本当に明確ではありませんが)とありますが、それが言うことの一部はまったく間違っています。

ポリシーは、組み込みチェーン上にのみ、ACCEPTまたはDROP組み込みチェーン上にのみ存在できます。以前のルールに一致しないすべてのパケットを拒否する効果が必要な場合は、最後のルールがすべてに一致し、REJECTターゲットの拡張子を持つルールを追加することを確認してください。つまり、関連するすべてのルールを追加した後で、を実行しますiptables -t filter -A OUTPUT -j REJECT

詳細については、netfilterリストの「可能なチェーンポリシーとは」スレッドを参照してください。


それは理にかなっており、最後の一般的なREJECTが機能するはずです。好奇心から、ターゲット拡張機能の定義はどこかかなり明白であり、私はそれを逃しましたか、それとも不十分に文書化されたビットの1つですか?
ND Geek

1
manページ全体を読むと、REJECTがターゲット拡張であることは明らかですが、manページは非常に長いため、「TL; DR」が適用される傾向があります。また、DROP、ACCEPT 、およびQUEUEが有効なポリシーターゲットであることも意味します。現在のコードから、QUEUEはそうではありません!
StarNamer 2012

4

ドキュメントに記載されていませんでしたが、ここで参照すると、許可されているポリシーはACCEPTor DROPのみであることがわかります。これは、コードが2429行目付近の(ルールの操作を担当する)のソースを確認することで確認されlibiptcます。

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私の答えが言うように意味しました。
Shawn J. Goff

面白いですね。私の好奇心は、その背後に理由があるのか​​、それとも、単純化のためかもしれません(単純なコードは、結局のところ、脆弱性の可能性のある箇所が少ないことを意味します)。私が中程度の開発者でさえ、ローカルでハッキングしたくなるかもしれませんが、私はそうではないので、それがセキュリティの一部であることを考えると、それに触れるつもりはありません。
ND Geek

2

REJECTオンにOUTPUTは意味がありません。a REJECTは、ネットワークを通過する必要のあるICMPパケットを返します。

-j LOG最後のルールとして(したがって、DROPポリシーの前に)新しいルールを追加して、OUTPUTチェーンのどこまでそれが適用されるかを確認します。


1
REJECTICMPパケットがloインターフェイスで返されませんでしたか?私は、ことに同意しLOG、トラブルシューティングのために便利ですが、私が本当に望んでいたことは「あ、うん...おそらく私によってブロックされていますということを私に思い出させるための方法であるDROPiptablesのデフォルト」の代わりに、5分間のトラブルシューティングする に同僚に尋ねアクセスXYZサーバー は、それがおそらくローカルであることを認識します。これは、私の最も一般的なアプローチです。これは、私の典型的な仕事日が、まだ穴を開けていないことにはほとんど影響を与えないためです。もちろん、私REJECTはそれをよりよく心に留めておく必要があるかもしれませんが、フラットはより明白です。
ND Geek

多くの理由ethXで、loインターフェースでトラフィックをインターフェースに生成させたくないと思います。彼らは非常に独立しています。チェーンを一方にのみ適用し、もう一方には適用しないようにすることができます。
アーロンD.マラスコ2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.