
네트워크 모니터링, 제어 등을 위해 디자인한 스크립트 세트가 있습니다. 이 스크립트에서 내가 하는 일 중 하나는 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 YOURCHAIN
iptables-restore를 사용하여 결과를 다시 로드합니다.
이것은 파이프로 하고 싶은 유혹이 있습니다.
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
그러나 저장과 복원을 동시에 실행하는 것이 제대로 작동할지는 잘 모르겠습니다. 저장과 복원을 분리하는 것이 더 안전할 것입니다. 규칙 세트에 대한 중간 업데이트가 손실되는 작은 중요 영역이 있습니다.
답변2
전체 구성을 다시 로드하는 것 외에는 이 문제를 해결할 수 있는 간단한 방법이 없다고 생각합니다.
적어도 부지런하다면 그런 식으로 체인에 드롭 정책을 추가하는 것에 대해 어느 정도 생각해 보아야 할 것입니다. 그렇게 하면 덜 문제가 발생하고 토론이 촉발될 수도 있습니다.
기술적인 관점에서 다양한 명령의 출력을 구문 분석해야 하는 경우 --line-num이 도움이 될 수 있지만 인덱스가 매번 변경되지 않도록 역순(높은 수준에서 낮은 수준)으로 삭제하는 것을 기억하세요. .
답변3
에 대한 고급 조작이 필요한 경우 iptables
훌륭한 Python 라이브러리http://ldx.github.io/python-iptables/살펴볼 가치가 있을 수 있습니다. 에 대한 프로그래밍 인터페이스(읽기 및 수정 모두)를 제공합니다 netfilter
. 상호 운용성은 바이너리를 호출하고 출력을 구문 분석 하지 않고 C 라이브러리( , 및 확장)를 iptables
사용하여 달성됩니다 .iptables
libiptc
libxtables
iptables
iptables