iptables 규칙이 이미 존재하는지 어떻게 확인할 수 있습니까? 때문에 삽입하기 전에

인터넷에서 TCP 포트로의 연결을 차단하려면 iptables에 규칙을 추가해야합니다.

내 스크립트가 여러 번 호출 될 수 있고 규칙을 삭제할 스크립트가 없기 때문에 삽입하기 전에 iptables 규칙이 이미 있는지 확인하고 싶습니다. 그렇지 않으면 INPUT 체인에 많은 dup 규칙이 있습니다.

iptables 규칙이 이미 존재하는지 어떻게 확인할 수 있습니까?



답변

-C --check최근 iptables 버전 에는 새로운 옵션이 있습니다.

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

이전 iptables 버전의 경우 Garrett 제안을 사용합니다.

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"


답변

새로운 -C옵션은 TOCTTOU (Time-To-To-Time-To-Use-Time) 사용 조건에 개방되어 있기 때문에 만족스럽지 않습니다. 두 프로세스가 거의 같은 시간에 같은 규칙을 추가하려고하면 두 -C번 추가하는 것을 막지 않습니다.

따라서 grep솔루션 보다 낫지 않습니다 . 출력은 테이블 상태에 대한 신뢰할 수있는 스냅 샷이므로 출력에 대한 정확한 텍스트 처리 작업 iptables-save은 안정적으로 작동 할 수 -C있습니다.

필요한 것은 --ensure규칙이없는 경우에만 원자를 검사하고 추가 하는 옵션입니다. 또한 규칙이없는 경우 새 규칙이 삽입되는 올바른 위치로 규칙을 이동하면 좋을 것입니다 ( --ensure-move). 예를 들어 iptables -I 1체인 헤드에서 규칙을 작성하는 데 사용되지만 해당 규칙이 이미 7 번째 위치에있는 경우 기존 규칙이 첫 번째 위치로 이동해야합니다.

이러한 기능이 없으면 실행 가능한 해결책은이 의사 코드를 기반으로 쉘 스크립트 루프를 작성하는 것입니다.

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

이 코드는 회전 할 수 있습니다. 고정 된 수의 반복 내에서 둘 이상의 레이서가 나올 것이라고 보장하지 않습니다. 이를 돕기 위해 임의의 지수 지수 백 오프 수면이 추가 될 수 있습니다.


답변

조금 뒤로 보일 수 있지만 나에게는 효과적입니다. 먼저 규칙을 삭제 해보십시오.

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;

다음과 유사한 메시지를 받아야합니다.

iptables : 잘못된 규칙 (해당 체인에 일치하는 규칙이 있습니까?)

그런 다음 규칙을 정상적으로 추가하십시오.

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;


답변

그냥 나열하고 검색 하시겠습니까?

iptables --list | grep $ip

또는 규칙이 지정되어 있습니다. 사용 grep -q하면 아무것도 출력되지 않으며 다음을 사용 하여 반환 값을 확인할 수 있습니다$?


답변

https://serverfault.com/questions/628590/duplicate-iptable-rules에 설명 된대로 중복을 먼저 추가 한 다음 제거하는 방법은 무엇입니까 ? (인접한 라인) 가장 쉬운 것 같다

iptables-save | uniq | iptables-restore


답변

스크립트에서 중복 규칙을 피하려면 아래 행을 추가하십시오.

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

위의 명령이 처음 실행될 때 아래 메시지가 나타납니다.

iptables : 잘못된 규칙 (해당 체인에 일치하는 규칙이 있습니까?)

이것은 단지 정보입니다. 그러나 명령의 후반부에 규칙을 추가해야합니다.


답변