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


41

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

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

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


: 또는 나무 등의 iptables의 상호 작용을 제공하는이 래퍼 사용 xyne.archlinux.ca/projects/idemptables을
sampablokuper

답변:


44

-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"

12

새로운 -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

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


1
규칙이 추가 된 정확한 방법을 정확히 찾아야하는 단순한 이유 때문에이 명령이 만족스럽지 않다고 덧붙입니다. 설정으로 테스트했는데 정확한 키워드와 값을 지정하지 않았기 때문에 규칙을 찾을 수 없었습니다 ...
Fabien Haddadi

규칙을 일시적으로 제거하면 무언가가 깨질 수 있습니다.
Mehrdad

5

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

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

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

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

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

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


1
dem 등원 명령을 시뮬레이션하기 위해 방화벽에서 원치 않는 구멍을 여는 것은 좋은 생각이 아닙니다. 물론 허점은 일시적인 것이지만 여전히 공격자의 기회를 향상시킵니다. 그리고 대체 규칙의 추가를 방해하는 것이 있으면 구멍이 무기한으로 지속될 수 있습니다.
sampablokuper

좋은 점 @sampablokuper :이 전략은 아마 보안상의 이유로, 사람을 DROP 규칙에 동의하지에만 적합
lucaferrario

나는 똑같은 일을 끝내었다!
warhansen

4

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

iptables --list | grep $ip

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


3
iptables-save|grep $ip특히 스크립트에서 더 쉽게 구문 분석 가능한 형식이므로 대신 제안 합니다. 원하는 경우 명령의 정확한 구문도 확인할 수 있습니다.
개렛

1
여러 규칙 iptables-save|grep $ip과 매우 잘 일치 수 있기 때문에 둘 중 어느 것도 실제로 질문에 대답하지 못합니다 . 아마도 전체 규칙 사양 iptables-save을 확인하는 데 사용될 수 있지만 여전히 약간의 해킹입니다. 반환 된 형식 이 스크립트의 규칙과 정확히 일치하지 않을 수 있습니다. 옵션을 다른 순서로 생성하거나 (예 :) 등을 추가 할 수 있습니다 . iptables-saveiptables-save-m tcp
Larsks

마음에 베어 iptables --list잘 알려진 포트를 해결하기 위해 노력할 것입니다. 따라서 포트를 잡기 전에 확인하십시오.
Fabien Haddadi


0

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.