iptables에서 체인을 참조하는 모든 규칙을 제거하는 방법은 무엇입니까?

iptables에서 체인을 참조하는 모든 규칙을 제거하는 방법은 무엇입니까?

네트워크 모니터링, 제어 등을 위해 디자인한 스크립트 세트가 있습니다. 이 스크립트에서 내가 하는 일 중 하나는 iptables -N mychain. 그런 다음 적절하게 기본 테이블에 규칙을 삽입하여 원하는 목적에 따라 패킷을 사용자 정의 체인으로 가져옵니다.

내 질문은: "새로 고침"을 수행하는 스크립트가 있다는 것입니다. 즉, 모든 규칙을 제거하고 다시 시작하는 것입니다. 이는 이상한 이상이 나타나는 경우에 유용합니다. 일부를 관리하는 것이 있더라도 사람들은 여전히 ​​iptable을 수동으로 관리하는 경우가 많습니다. (이것이 내가 모든 작업을 별도의 테이블에서 수행하기를 원하는 이유입니다.)

체인을 지우고 싶다면 다음과 같이 쉽습니다 iptables -F mychain. 하지만 내가 무엇을~하지 않다내장 체인(INPUT, OUTPUT 등)에서 해당 체인을 참조하는 규칙을 제거하는 방법을 알고 싶습니다.

내 앱에 버그가 있거나 사용자가 테이블을 조작하다가 결국 INPUT 체인에 규칙을 두 번 추가했다고 가정해 보겠습니다. 이제 패킷은 체인을 두 번 통과합니다. 두 번 계산되고 두 번 라우팅됩니다.

이에 대한 확실한 해결책은 메인 체인을 통과하여 점프 대상이 내 사용자 정의 체인인 모든 규칙을 제거하는 것입니다. 하지만 어떻게 해야 할지 모르겠습니다.

다음은 우리가 설정할 수 있는 최악의 상황의 예입니다.

iptables -N TEST
iptables -A INPUT -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST
iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error
iptables -I INPUT -p icmp -j TEST

부도덕하거나 정보가 없는 관리자가 세 가지 최하위 규칙을 만들었다고 가정해 보겠습니다.

이제 iptables -D INPUT -j TEST내가 만든 규칙을 발행하면 사라질 것입니다. 그러나 사용 시 매개변수가 -D일치해야 하므로 다른 규칙은 삭제되지 않습니다 . 따라서 내 규칙을 부지런히 제거하더라도 패킷은 여러 가지 이유로 여전히 두 번 이상 거기에 도달할 수 있습니다.

메인 체인을 플러시하는 것이 반드시 적절한 것은 아닙니다. 다시 말하지만, 명령줄에서 iptables를 사용하는 것이 일반적이므로(저는 항상 직접 수행합니다) 맹목적으로 삭제합니다.모든임시 규칙이더라도 누군가가 합당한 이유로 추가한 내용을 규칙으로 삭제할 수 있습니다.

확실한 해결책은 어떻게든 제거하는 것입니다.어느대상이 체인인 규칙 TEST을 삭제하고 해당 규칙을 제거합니다. 그러나 iptables 매뉴얼 페이지에서 이 작업을 수행할 수 있는 명령을 본 적이 없습니다.

내가 볼 수 있는 가장 가까운 것은 모든 사용자의 것입니다 iptables -S. 출력을 해석하기 위해 파서를 사용하고 생성할 수 있지만 iptables -S이는 약간의 추가 작업입니다. 일종의 와일드카드 방식으로 규칙을 삭제하는 더 정확한 방법이 있는지 궁금합니다. 다시 한번, 점프 대상이 내가 원하는 체인인 모든 규칙을 제거하십시오.

제거하고 싶은 체인이 있지만 다른 곳에 참조가 있는 경우 비슷한 상황이 발생할 수 있습니다. 해당 참조가 어디에 있는지 알아내고 싶고, 아마도 삭제도 하고 싶습니다.

이것이 가능한가? 아니면 출력을 해석하기 위해 파서를 작성해야 합니까 iptables -S?

답변1

이는 매우 간단합니다. iptables-save를 사용하여 현재 규칙 세트를 파일이나 stdout에 쓰고, 무엇이든 제거하고 -j YOURCHAINiptables-restore를 사용하여 결과를 다시 로드합니다.

이것은 파이프로 하고 싶은 유혹이 있습니다.

iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore

그러나 저장과 복원을 동시에 실행하는 것이 제대로 작동할지는 잘 모르겠습니다. 저장과 복원을 분리하는 것이 더 안전할 것입니다. 규칙 세트에 대한 중간 업데이트가 손실되는 작은 중요 영역이 있습니다.

답변2

전체 구성을 다시 로드하는 것 외에는 이 문제를 해결할 수 있는 간단한 방법이 없다고 생각합니다.

적어도 부지런하다면 그런 식으로 체인에 드롭 정책을 추가하는 것에 대해 어느 정도 생각해 보아야 할 것입니다. 그렇게 하면 덜 문제가 발생하고 토론이 촉발될 수도 있습니다.

기술적인 관점에서 다양한 명령의 출력을 구문 분석해야 하는 경우 --line-num이 도움이 될 수 있지만 인덱스가 매번 변경되지 않도록 역순(높은 수준에서 낮은 수준)으로 삭제하는 것을 기억하세요. .

답변3

에 대한 고급 조작이 필요한 경우 iptables훌륭한 Python 라이브러리http://ldx.github.io/python-iptables/살펴볼 가치가 있을 수 있습니다. 에 대한 프로그래밍 인터페이스(읽기 및 수정 모두)를 제공합니다 netfilter. 상호 운용성은 바이너리를 호출하고 출력을 구문 분석 하지 않고 C 라이브러리( , 및 확장)를 iptables사용하여 달성됩니다 .iptableslibiptclibxtablesiptablesiptables

관련 정보