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예 : 체인)이 DROP또는 REJECT이고 규칙이 그 앞에 오기를 원하기 때문입니다. -A새 규칙을 마지막 규칙 뒤에 -I두고 시작 규칙에 둡니다.
마크 라 카타

답변:


471

동일한 명령을 실행하지만 "-A"를 "-D"로 바꿉니다. 예를 들면 다음과 같습니다.

iptables -A ...

된다

iptables -D ...

7
어떤 종류의 규칙이 있으면 모든 규칙을 제거하지는 않습니다.
ETech

4
이 -D 명령을 여러 번 실행하면 모든 명령이 삭제됩니다.
Zhenyu Li

4
나는 같은 명령을 실행했지만 -I 대신 -D를 사용했습니다. 그러나 나는 나쁜 규칙을 얻는다 (일치하는 규칙이 존재한다)
Ben

4
-I또는 로 규칙을 추가 한 경우에도로 규칙을 -R삭제할 수 있습니다 -D.
David Xia

그냥 참고하십시오. 'iptables -A ...'로 규칙을 만들었는데 규칙이 나타 났지만 효과적이지 않았습니다. 'iptables -D ...'를 사용하면 응답이 잘못된 규칙 이었습니다. 그럼에도 불구하고 규칙이 삭제되었습니다. 'sudo iptables -nvL'로 규칙을 볼 수있었습니다. 내가 사용한 체인은 'INPUT'이었습니다.
벤 파즈

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

따라서 두 번째 규칙을 삭제하려면 다음을 수행하십시오.

iptables -D INPUT 2

최신 정보

특정 테이블 (예 : nat)을 사용하는 경우 삭제 명령에 주석을 추가해야합니다 (주석은 @ThorSummoner).

sudo iptables -t nat -D PREROUTING 1

4
두 솔루션 모두 훌륭하지만 줄 번호를 알 수 없으면 스크립트 설정에서 작동하지 않습니다. 따라서 다른 솔루션은보다 일반적이며 따라서 더 정확한 IMO입니다.
Jeroen

2
글을 모른다면 주석 (예 : 답)을 사용하거나 규칙에 대해 grep을 수행 할 수 있습니다.iptables -L INPUT --line-numbers | grep -oP "([0-9]{1,3}).*tcp.*domain" | cut -d" " -f1
domi27

6
테이블에 특정 시점에 규칙을 삽입 할 수없는 경우에만 유효합니다. 그렇지 않으면 행 번호를 관찰하고 삭제 규칙을 실행하는 사이에 행 번호가 변경 될 수 있습니다. 이 경우 시간 창이 너무 짧아서 "일어날 가능성이 거의 없다"고 가정하는 것은 안전하지 않습니다.
Nick

14
하나의 규칙을 삭제하면 나머지 행 번호가 변경됩니다. 따라서 규칙 5, 10 및 12를 삭제해야하는 경우 12, 10 및 5를 삭제하십시오.
TomOnTime

2
PREROUTING 내가 지정했다 규칙을 삭제하려고 할 때 -t nat, 예를 들면 :을 sudo iptables -t nat --line-numbers -L, 그리고 그들을 삭제 -t nat도, 예를 들면 : sudo iptables -t nat -D PREROUTING 1(대답에 추가 가치가있을 수 있습니까?)
ThorSummoner

31

아무 문제없이 저에게 가장 적합한 솔루션은 다음
과 같습니다.

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 % 삭제하고 다른 줄은 그대로 둡니다. 이 솔루션은 하루에 약 100 개의 규칙을 변경하여 지난 2 개월 동안 문제없이 작동합니다.


2
iptables 저장 / 복원이없는 경우 :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 또는 iptables -S | sed "/$comment/s/-A/iptables -D/e")와 같은
hek2mgl

@ hek2mgl sed는 포기하지 않습니까? =] 감사합니다.이 기능을 염두에 두겠습니다 (하루에 구문을 잊어 버리게 됨).
Mansour

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

아, 알아 냈습니다. 삭제 명령에 테이블 사양이 없습니다. 그래서 경우에 당신은 테이블에서 모든 규칙 목록 natsudo iptables -S -t nat당신이 복사, 반환 된 규칙 중 하나를 삭제할 충분하지 않습니다. -t nat예 를 들어을 추가해야합니다 sudo iptables -D ... -t nat.
Abdull

이해하기 쉬운!
기사

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.

다른 모든 command ( -A, -I)가 특정 테이블에서 작동하는 것처럼이 명령을 인식 하십시오. 기본 테이블 ( 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 규칙을 제거하려는 경우,

아래 명령을 사용하여 추가 된 IPtable을 나열하십시오.

# 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

IPtables에서 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.