私のローカルサーバーには、1日に数回リモートサーバーからルールを作成するボットがあります。ボットの目的は、各ポートで消費されるトラフィックを計算することです。 SSH経由でリモートサーバーにアクセスするために、ボットはPythonで書かれています。両方のサーバーのオペレーティングシステムはUbuntuです。ボット作成ルール:
sudo iptables -I OUTPUT -p tcp --sport port_number -j DROP
sudo iptables -I OUTPUT -p tcp --sport port_number -m quota --quota 500000000 -j ACCEPT
iptables -nvL OUTPUT --line-numbers|grep "\<tcp spt:port\>"
その瞬間にリモートサーバーを確認してみました。
iptables -nvL OUTPUT --line-numbers
わかりました。ルールが作成されました。ただし、一定時間(2〜3時間)が経過するとルールは削除されます。上記のものは、ボットが作成できるすべてのルールです。
OUTPUTチェーンを消去またはフラッシュできないルールはありません。ルールをクリアすると、スクリプトが正しく実行されず、個々のポートの帯域幅を制御できなくなります。
これで、ボットが数時間ごとに次のコマンドを実行することに気づきました。
firewall-cmd --reload
このコマンドはルールを削除します。ファイアウォールを再ロードし、ルールが削除されるのを防ぐ方法は?
ベストアンサー1
firewall-cmd --reload
実行すると、手動で追加されたルールが削除されるという事実は、システムが動作していることを示す信号ですfirewalld
。これはIPTablesファイアウォール(および将来の代替品)の管理システムですnftables
。
firewalld
ボットが目的の操作を知らせるのではなく、IPTablesを直接操作するため、firewalld
直接追加された設定が上書きされ、firewalld
すべてのIPtables設定が構成ガイドラインに従ってリセットされます。
あなたは交換する必要がありますiptables
ファイアウォール設定を変更するすべてのコマンド同等firewall-cmd
のコマンドを使用してください。iptables -nvL
そのままにできる既存のファイアウォール設定を確認してください。
ライン
iptables -nvL OUTPUT --line-numbers|grep "\<tcp spt:port\>"
ルールは生成されず、行番号を含むOUTPUTテーブルの内容のみが表示され、文字列 ""が含まれていない行はフィルタリングされます。
sudo iptables -I OUTPUT -p tcp --sport port_number -j DROP
sudo iptables -I OUTPUT -p tcp --sport port_number -m quota --quota 500000000 -j ACCEPT
これら2つのコマンドのためプレフィックス既存のルールに新しいルールを追加します。これら2つのコマンドの結果は、次の順序で2つのルールになります。
1.)出力時に開始されるすべてのIPv4 TCPトラフィックにはport_number
500000000のクォータが適用され、クォータが許可されている場合にのみ許可されます。
2.)クォータのために前述のトラフィックが許可されていない場合、そのトラフィックは破棄されます。
これの正確なコピーを使用するには、firewall-cmd
直接ルールを使用する必要があるようです:
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport port_number -m quota --quota 500000000 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --sport port_number -j DROP
firewall-cmd --reload
最初の 2 つのコマンドは新しいルールを永続firewalld
構成に書き込み、3 番目のコマンドは新しい構成を適用します。
直接ルールの予想順序を指定するには、優先順位番号を使用する必要があります。それ以外の場合、正しい順序は保証されません。さらに、ボットはチェーンの始めに新しいルールペアを挿入し続けるため、チェーンをますます長くすることはできません。
私は尋ねたいです。firewall-cmd --reload
あなたのロボットが実行するサイクルの目的は何ですか?すべてのルールが再ロードされるため、クォータカウンタがリセットされる可能性があります。 (これがボットがこれを行う理由だと思いますが、統計などのクォータカウンタの値が必要な場合は、このコマンドを実行する前に前の値を読み、どこかに保存したことを確認してください。)