[linux] iptables에서 특정 규칙을 제거하려면 어떻게해야합니까?

포트 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 규칙도 삭제합니다.



답변

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

iptables -A ...

된다

iptables -D ...


답변

규칙 번호 ( –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


답변

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

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 개월 동안 문제없이 작동합니다.


답변

먼저이 명령으로 모든 iptables 규칙을 나열하십시오.

iptables -S

다음과 같이 나열됩니다.

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

그런 다음 원하는 줄을 복사하고 바꾸기 -A로 바꾸십시오 -D.

iptables -D XYZ -p ...


답변

-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


답변

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


답변