私はansibleを使用してDBサーバーでufwを設定し、特定のサーバーから特定のポートへの接続のみを許可します(_1234
_と言います)。
以前アクセスしていたサーバーがプールから削除されると、そのサーバーのアクセスルールを削除するのを忘れることがあります。
私の解決策:ルールを設定するときにポート_1234
_のすべてのルールを削除してから、現在のプールからサーバーを使用してルールを再作成します。
残念ながら_ufw delete
_では、削除するルール(ポート、プロトコル、SCR IPなど)を正確に指定する必要があります。
私はufw delete $(ufw status numbered | grep 1234 | <get all the numbers of the rules> )
のような解決策を試しましたが、それは本当に醜く、本当に速くなりました。
特定のポートのすべてのルールを削除するより良い方法はありますか?
ここで解決する必要がある2つの問題があります。
私はbashのこの1つのライナーを介して問題#1の解決策を持っていると思います:
ufw status numbered |(grep '80/tcp'|awk -F"[][]" '{print $2}')
上記の例は、文字列「80/tcp」のファイアウォールルールに一致し、角かっこを除いたルール番号のみを出力します。
私が知ることができる限り、「ufw delete」コマンドには「(y | n)」確認プロンプトを抑止するスイッチがないため、問題2はまだ解決していません。これにより、自動化が失敗します。
ただし、以下のコマンドを実行して、「y」キーを押して確認し、上矢印=> Enterを押してすすぎて繰り返すことにより、各ルールの削除を手動で実行できます。
ufw delete $(ufw status numbered |(grep '80/tcp'|awk -F"[][]" '{print $2}'))
私はこれが非常に古い質問であることを知っていますが、グーグルは私をここに連れてきて、これまでの答えは役に立ちましたので、私の完全な解決策を共有したいと思いました。 @Sethからの返答は、私にほとんどの道を教えてくれました。
私の目標は、ポート3306でローカルMySQLサーバーへの接続を許可するすべてのUFWルールを削除することです。これが私が使用したものです。
for NUM in $(ufw status numbered | grep 3306 | awk -F"[][]" '{print $2}' | tr --delete [:blank:] | sort -rn); do
yes | ufw delete $NUM
done
これを自動化する鍵は、ルールを逆順で削除することです。最後から削除しても上記の数値は変わりません。
ufw status numbered
を実行すると、次のような出力が得られます。
To Action From -- ------ ---- [ 1] 22 ALLOW IN 10.181.225.123 [ 2] 3306/tcp ALLOW IN 10.181.225.123 [ 3] 3306/tcp ALLOW IN 10.181.226.45 [ 4] 3306/tcp ALLOW IN 10.181.226.77 [ 5] 3306/tcp ALLOW IN 10.181.225.196 [ 6] 3306/tcp ALLOW IN 10.181.226.3 [ 7] Anywhere ALLOW IN 10.181.226.45 [ 8] 3306/tcp ALLOW IN 10.181.224.55 [ 9] 3306/tcp ALLOW IN 10.181.224.80 [10] 3306/tcp ALLOW IN 10.208.6.136 [11] 3306/tcp ALLOW IN 10.178.128.13
知っておくべきこと:
awk -F"[][]" '{print $2}'
からの出力には、10未満の数値の先行スペースが含まれます。tr --delete [:blank:]
はそれを削除しますsort -rn
は数値を逆の番号順に並べ替えます。--force
を使用する代わりにyes
をufwにパイプしています。最新バージョンをお持ちの場合は、--force
を使用できます。特定のポートだけでなく、すべてのルールを一掃する必要がある場合:
ufw --force reset
(-確認を求められたくない場合は強制)
削除するたびに新しい番号付けを回避するには、コマンドを再実行して最初の番号を選択し、そのルールを削除して次のようにループする必要があります。
真である間; do n = $(ufw status numbered | grep DENY | head -n 1 | awk -F "[] []" '{print $ 2}'); ["$ n"!= ""] ||ブレーク;はい| ufwは$ nを削除します。完了。
言うまでもないことですが、番号付きのufw-itemを削除するたびに、そのアイテムに続くすべてのアイテムの番号が付け直されます。したがって、このワンライナーは最初に削除されたアイテムの後に間違ったアイテムを削除します:
#Wrong use of deleting multiple ufw-items:
for numb in $(ufw status numbered | grep DENY | cut -d" " -f1 | grep -o [[:digit:]]*); do ufw delete $numb; done
確認なしに各アイテムを強制削除することができない限り、私はより良い解決策を見つけていません...まだ...