iptablesから特定のルールを削除するにはどうすればよいですか?


334

ポート8006および8007でそれぞれ特別なHTTPおよびHTTPSサービスをホストしています。iptablesを使用してサーバーを「アクティブ化」します。つまり、着信HTTPおよびHTTPSポートをルーティングします。

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8006 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 8007 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8006 
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8007  
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to-ports 8006
iptables -A OUTPUT -t nat -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-ports 8007 

これは魅力のように機能します。ただし、サーバーを再び無効にする別のスクリプトを作成したいと思います。つまり、上記の行を実行する前の状態にiptablesを復元します。しかし、これらのルールを削除するための構文を理解するのに苦労しています。機能しているように見える唯一のことは完全なフラッシュです:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

しかし、それは望ましくない他のiptablesルールも削除します。


2
私はそれを使用する方であることを見つけた-I代わりの-AためACCEPTのライン。これは通常、最後の行(INPUTたとえば、チェーン)がDROPorでREJECTあり、その前にルールを配置したいためです。 -A最後のルールの後に新しいルールを-I配置し、最初にそれを配置します。
Mark Lakata 2014

回答:


471

同じコマンドを実行しますが、「-A」を「-D」に置き換えます。例えば:

iptables -A ...

なる

iptables -D ...

7
特定の種類のルールが複数ある場合、それらのすべてが削除されるわけではありません。
ETech 2014年

4
この-Dコマンドを複数回実行しようとすると、それらすべてが削除されます。
Zhenyu Li

4
同じコマンドを実行しましたが、-Iの代わりに-Dを使用しています。しかし、私は悪いルールを取得します(一致するルールが存在します)...
Ben

4
-Iまたは-Rでルールを追加した場合でも、でそれを削除できます-D
David Xia

ただのメモ。「iptables -A ...」でルールを作成しましたが、ルールは表示されましたが、効果がありませんでした。「iptables -D ...」を使用すると、応答は不正なルールでした。それでもルールは削除されました。ルールは「sudo iptables -nvL」で表示されました。私が使ったチェーンは「INPUT」でした。
Ben Paz

446

ルールの番号(--line-numbers)を使用することもできます。

iptables -L INPUT --line-numbers

出力例:

Chain INPUT (policy ACCEPT) 
    num  target prot opt source destination
    1    ACCEPT     udp  --  anywhere  anywhere             udp dpt:domain 
    2    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:domain 
    3    ACCEPT     udp  --  anywhere  anywhere             udp dpt:bootps 
    4    ACCEPT     tcp  --  anywhere  anywhere             tcp dpt:bootps

したがって、2番目のルールを削除する場合:

iptables -D INPUT 2

更新

特定のテーブル(natなど)を使用する場合(d)、それを削除コマンドに追加する必要があります(コメントには@ThorSummonerのthx)。

sudo iptables -t nat -D PREROUTING 1

4
どちらのソリューションも優れていますが、行番号が不明な場合、これはスクリプト設定では機能しません。したがって、他のソリューションはより一般的であり、したがってより正確なIMOです。
Jeroen 2013年

2
さて、あなたは(の中の答えのような)コメントを使用したり、ルールのためのgrepを行うことができますラインがわからない場合:iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27

6
これは、テーブルにいつでもルールを挿入できない場合にのみ問題ありません。そうしないと、行番号の監視と削除規則の実行の間に行番号が変わる可能性があります。このような場合、時間枠が非常に短いため「起こりそうもない」と想定するのは危険です。
Nick

14
1つのルールを削除すると、残りの行番号が変わることに注意してください。だから、あなたはその後、彼らに12、10を削除... 5.ルール5、10、および12を削除する必要がある場合
TomOnTime

2
削除PREROUTINGルールにしようとすると私は指定する必要がありました-t nat例えば、: sudo iptables -t nat --line-numbers -L、およびそれらを削除し-t natすぎて、例えば:sudo iptables -t nat -D PREROUTING 1(答えに追加する価値があるかもしれない?)
ThorSummoner

31

問題なく機能する最善の解決策は次のようになります
。1.コメントを付けて一時ルールを追加します。

comment=$(cat /proc/sys/kernel/random/uuid | sed 's/\-//g')
iptables -A ..... -m comment --comment "${comment}" -j REQUIRED_ACTION

2.ルールが追加され、それを削除する場合(またはこのコメントのあるものすべて)、次の操作を行います。

iptables-save | grep -v "${comment}" | iptables-restore

したがって、$ commentに一致するすべてのルールを100%削除し、他の行はそのままにします。このソリューションは過去2か月間機能し、1日あたり約100のルールの変更があり、問題はありません。


2
iptables-save / restoreがない場合:iptables -S | grep "${comment}" | sed 's/^-A //' | while read rule; do iptables -D $rule; done
Mansour

実際の使用方法:CRON 1)古いspamhausiptables禁止を削除する、2)spamhaus.org/dropを取得する、3)CIDR IPのgrepおよびiptables -A INPUT -s $ip_cidr -j -m comment --comment "spamhaus"
Xeoncross

2
@Mansour Or iptables -S | sed "/$comment/s/-A/iptables -D/e";)この
hek2mgl

@ hek2mgl sedはあきらめませんか?=]ありがとう、この機能を覚えておきます(1日で構文を忘れてしまいます)。
マンスール2015年

sedは、uuidから「-」を削除するためだけに使用されます。いずれにせよ、sed構文を取得したら、忘れることはありません。))
ETech

11

最初に、次のコマンドですべてのiptablesルールをリストします。

iptables -S

それは次のようにリストされます:

-A XYZ -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

次に、目的の行をコピーして、ちょうど置き換える-A-Dそれを削除するには:

iptables -D XYZ -p ...

2
注意してください!これは不完全な答えです。"-S"に関するマニュアルから: "他のすべてのiptablesコマンドと同様に、指定したテーブルに適用されます(フィルターがデフォルトです)。したがって、このスイッチを使用する場合-すべてのテーブルで繰り返す必要があります:nat、mangleなど
pmod

1
私の場合、私はiptables: Bad rule (does a matching rule exist in that chain?).今何を得るのですか?
Abdull、

ああ、それを理解しました-私の削除コマンドにはテーブルの指定がありませんでした。だから、場合にあなたがテーブルからすべてのルールをリストアップnatしてsudo iptables -S -t nat、あなたがコピーし、返されたルールのいずれかを削除するだけでは十分ではありません。あなたは追加する必要があります-t nat例えば、sudo iptables -D ... -t nat
Abdull

わかりやすい!
sknight

5

-Dコマンドを使用してください、これはmanページがそれを説明する方法です:

-D, --delete chain rule-specification
-D, --delete chain rulenum
    Delete  one  or more rules from the selected chain.  
    There are two versions of this command: 
    the rule can be specified as a number in the chain (starting at 1 for the first rule) or a rule to match.

他のすべてのコマンド(-A-I)が特定のテーブルで機能するように、このコマンドを理解しください。デフォルトのtable(filtertable)で作業していない場合は、を使用-t TABLENAMEしてそのターゲットテーブルを指定します。

一致するルールを削除する

iptables -D INPUT -i eth0 -p tcp --dport 443 -j ACCEPT

注:これにより、最初に一致したルールのみが削除されます。多くのルールが一致している場合(これはiptablesで発生する可能性があります)、これを数回実行します。

番号として指定されたルールを削除する

iptables -D INPUT 2

数を数える以外に、--line-numberパラメーターを使用して行番号をリストできます。次に例を示します。

iptables -t nat -nL --line-number

これは--line-numberが付いたものが最高だとわかった
Davuz

はい!見事!全体を欲しくないiptables -F
Dev Anand Sadasivam

2

NATルールを削除する場合は、

以下のコマンドを使用して、追加されたIPtablesをリストします。

# sudo iptables -L -t nat -v

Chain PREROUTING (policy ACCEPT 18 packets, 1382 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 DNAT       tcp  --  any    any     anywhere             saltmaster           tcp dpt:http to:172.31.5.207:80
    0     0 DNAT       tcp  --  eth0   any     anywhere             anywhere             tcp dpt:http to:172.31.5.207:8080

IPテーブルからnatルールを削除するには、次のコマンドを実行します。

# sudo iptables -F -t nat -v

Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'

次に、それを確認できます

# sudo iptables -L -t nat -v
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.