Iptables永続サービスが変更を保存しないのはなぜですか?

Iptables永続サービスが変更を保存しないのはなぜですか?

フォローするこれUbuntu 12.04でIPルール設定のチュートリアル。設定時にはすべてうまくいきましたが、ファイアウォールを変更したので、その変更は再起動後も保持されません。なぜこれが起こるのか理解できません。以下は、iptables-persistの使い方のデモです。私は何が間違っていましたか?

$ sudo service iptables-persistent start
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...   

$ sudo iptables -L   //shows a certain rule
$ iptables -D INPUT ... //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

 $ sudo service iptables-persistent restart
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...                                                                                                      [ OK ] 
 $ sudo iptables -L  //rule is back

答え1

iptables-persistentこれではありません。 「サービス」を再起動しても、iptables-persistentiptablesの現在の状態はキャプチャされ保存されません。パッケージが最後に設定されたときに保存されたiptablesルールのみが復元されます。

を設定するには、iptables-persistent現在のiptablesルールセットを教えてください。

これを達成する1つの方法は次のとおりです。

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6

または、同等にiptables-persistentパッケージは、以下も提供します。

dpkg-reconfigure iptables-persistent

(ルールを保存するかどうかを尋ねる質問に「はい」と答える必要があります。)

その後、iptables-persistent次のブート/再起動時に予想されるiptablesルールセットがロードされます。

答え2

現在のiptablesルールを保存する非常に簡単な方法は、次のコマンドを使用することです。

sudo service netfilter-persistent save

上記の方法(少なくともUbuntuにパッケージをインストールしnetfilter-persistentた後に動作iptables-persistent)を使用すると、iptablesコマンドを手動で実行したりパッケージを再構成したりする必要はありません(上記の回答で提案されているように)。

答え3

$ iptables ... DROP //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

それはそれがDROP意味したりすることではありません。からman iptables

...特別な値が許可されます。減らす、キューまたは戻り。 ACCEPT は、パケットが通過できるようにすることを意味します。拒絶とは次のことを意味します。パケットを床に投げます。 キューの意味は...

したがって、あなたがすべきことは新しいルールを追加することだけです。これは他の多くのルールを効果的に置き換えますが、まだそのまま残ります。

このようなもの(あなたのiptables -L出力)を調べるとき、私はあなたの目を使うのではなく供給しますgrep "string unique to this rule"。より簡単で高速で、エラーが発生する可能性も少なくなります。

iptables -L | grep "some unique string"

ルールを削除するには、スイッチを使用してください-D。マニュアルページには2つの形式が記載されています。

-D, --delete チェーンルール仕様

-D, --チェーンルール番号の削除

選択したチェーンから1つ以上のルールを削除します。このコマンドには2つのバージョンがあります。ルールはチェーンの数(最初のルールは1から始まる)として指定することも、一致するルールとして指定することもできます。

答え4

説明どおり@スティーブンマンデー、適切なディレクトリ(たとえば/etc/iptables/rules.v{4,6})にルールセットを直接保存できます。

しかし、@OpenITeXそうです:呼び出されたsave操作がservice netfilter-persistent良いです。

今日(18.10)現在、iptables-saveが組み込まれていiptables-persistentますが、いいえインストールする。したがって、呼び出されるプラグインディレクトリservice netfilter-persistentは空であり、サービスはルールセットが保存されたことを印刷しますが、これは真ではありません。

TLDR:iptables-persistentプラグインディレクトリに/usr/share/netfilter-persistent/plugins.dプラグインが含まれていることをインストールして確認してください。


これが私が思いついた方法です。

$ cat /etc/init.d/netfilter-persistent 
...
case "$1" in
...
save)
    log_action_begin_msg "Saving netfilter rules"
    /usr/sbin/netfilter-persistent save
    log_action_end_msg $?
    ;;

次にスクリプトを確認し、/usr/sbin/netfilter-persistent外部スクリプトを呼び出すことを確認します。

$ cat /usr/sbin/netfilter-persistent
...
PLUGINS=/usr/share/netfilter-persistent/plugins.d
...
run_plugins () {
    if [ -d ${PLUGINS} ]; then
        run-parts -v -a ${1} ${PLUGINS}
    fi
}

case $1 in
start|save|flush)
    run_plugins ${1}
    ;;

/usr/share/netfilter-persistent/plugins.dそれからそれが空であることがわかりました。

関連情報