인터넷에서 TCP 포트로의 연결을 차단하려면 iptables에 규칙을 추가해야합니다.
내 스크립트가 여러 번 호출 될 수 있고 규칙을 삭제할 스크립트가 없기 때문에 삽입하기 전에 iptables 규칙이 이미 있는지 확인하고 싶습니다. 그렇지 않으면 INPUT 체인에 많은 dup 규칙이 있습니다.
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
하면 아무것도 출력되지 않으며 다음을 사용 하여 반환 값을 확인할 수 있습니다$?
iptables-save|grep $ip
특히 스크립트에서 더 쉽게 구문 분석 가능한 형식이므로 대신 제안 합니다. 원하는 경우 명령의 정확한 구문도 확인할 수 있습니다.
iptables-save|grep $ip
과 매우 잘 일치 할 수 있기 때문에 둘 중 어느 것도 실제로 질문에 대답하지 못합니다 . 아마도 전체 규칙 사양 iptables-save
을 확인하는 데 사용될 수 있지만 여전히 약간의 해킹입니다. 반환 된 형식 이 스크립트의 규칙과 정확히 일치하지 않을 수 있습니다. 옵션을 다른 순서로 생성하거나 (예 :) 등을 추가 할 수 있습니다 . iptables-save
iptables-save
-m tcp
iptables --list
잘 알려진 포트를 해결하기 위해 노력할 것입니다. 따라서 포트를 잡기 전에 확인하십시오.
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 : 잘못된 규칙 (해당 체인에 일치하는 규칙이 있습니까?)
이것은 단지 정보입니다. 그러나 명령의 후반부에 규칙을 추가해야합니다.