web-dev-qa-db-ja.com

iptables-特定の宛先アドレスを持つすべてのPREROUTINGルールをクリアします

Iptable PREROUTINGルールを追加するスクリプトがあります。それらはすべて同じように対処します。これを実行すると:

 iptables --list PREROUTING -t nat

次のような出力が表示されます。

 DNAT       tcp  --  anywhere             165.193.122.18      tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.91.11        tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.90.224       tcp dpt:https to:192.168.2.1:443

このようなコマンドを書くことで、これらすべてのルールを削除できるはずです...

"drop all PREROUTING rules that go to 192.168.2.1:443"

したがって、itablesのオプションを見ると、-Dオプションを使用する必要があるようです。しかし、私はそれを与えるためのルールを知りません。 :-(

そのため、おそらく既存のルールを照会し、grepで宛先を192.168.2.1:443に制限し、-Dを実行してそれぞれにrulenumを渡す必要があります。どうすればいいのか分かりません。任意の助けいただければ幸いです。

ありがとう!

EV

5
user548971

このようなもの:

#!/bin/bash

for line_num in $(Sudo iptables --line-numbers --list PREROUTING -t nat | awk '$7=="to:192.168.2.1:443" {print $1}')
do
  # You can't just delete lines here because the line numbers get reordered
  # after deletion, which would mean after the first one you're deleting the
  # wrong line. Instead put them in a reverse ordered list.
  LINES="$line_num $LINES"
done

# Delete the lines, last to first.
for line in $LINES
do
  Sudo iptables -t nat -D PREROUTING $line
done

unset LINES

フィールド番号が一致しない場合は、awkでフィールド番号を調整する必要がある場合があります。

3
bahamat

あなたはtacを使ってラインリバーサルを単純化することができるかもしれません:

#!/bin/bash

for line in $(Sudo iptables --line-numbers --list PREROUTING -t nat | awk '$7=="to:192.168.2.1:443" {print $1}' | tac)
do
  # You can't just delete lines here because the line numbers get reordered
  # after deletion, which would mean after the first one you're deleting the
  # wrong line. Instead put them in a reverse ordered list.
  Sudo iptables -t nat -D PREROUTING $line
done
1
FastFreddy

次のワンライナーを使用できます。

Sudo iptables -S | grep $pattern | cut -d " " -f 2- | xargs -L1 Sudo iptables -D

$ patternは目的のパターンです。

ドラマを避けるために、最初にこのコマンドの結果をエコーすることをお勧めします

1
bryanph

使用する --line-numbersルール番号を表示するには、grepとawkを実行します。

# iptables -vnL -t nat --line-numbers |grep 10.1.1.0|awk '{print $1}' 
1

次に、forを使用して、1つの特定のIPに一致するすべてのルールをクリアできます。

# for rule in $(iptables -vnL -t nat --line-numbers |grep 10.1.1.0|awk '{print $1}'); do iptables -D INPUT $rule; done

これらの数値はテーブルごとに表示されるため、テーブルごとにリストコマンドを制限し、1つずつクリアする必要がある場合があります。

0
coredump