추가된 룰이 이미 체인에 있는 룰과 같은 경우, iptables
룰 번호를 부여하지 않고 룰을 교체할 수 있나요? 아니면 기존 룰을 덮어써서 룰을 삽입/추가할 수 있나요? 제가 묻는 이유는 자동으로 규칙을 추가하는 스크립트가 있는데 iptables
, 추가된 규칙이 이미 체인에 있는 규칙과 동일한 상황이 있을 수 있기 때문입니다.
답변1
당신이 요구하는 것을 달성하기에 충분히 가까운 방법은 다음과 같습니다. iptables
선택하세요-C/--check
:
-C, --확인체인 규칙 사양
선택한 체인에 호환되는 규칙이 있는지 확인합니다. 이 명령은 다음과 동일한 논리를 사용합니다.-디기존 iptables 구성을 변경하지 않고 일치하는 항목을 찾고 종료 코드를 사용하여 성공 또는 실패를 나타냅니다.
따라서 자동화된 스크립트가 있는 경우 다음을 수행해 보십시오.
iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT
규칙을 오염시키고 싶지 않으면 다음과 같이 할 수 있습니다.
iptables -C FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \
iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT
규칙이 존재하는지 확인합니다. true가 반환되면 아무 일도 일어나지 않습니다. false가 반환되면 쉘은 두 번째 iptables
규칙을 실행합니다. 항상 이렇게 수행된다면 이 규칙은 단 한 번만 멱등적으로 생성됩니다(그러나 나중에 주문하는 방법을 참조하세요). 를 사용할 수도 있었지만 -A
도움 -I
이 될 가능성이 더 높습니다.
규칙의 위치가 정말 중요하지만 다른 변경 사항으로 인해 현재 정확한 위치를 알 수 없는 경우 이를 위해 사용자 정의 체인을 사용해야 합니다. 이렇게 하면 규칙이 항상 점프 위치에서 호출됩니다.
iptables -N mychain
iptables -A FORWARD -m comment --comment first_rule
iptables -A FORWARD -m comment --comment initially_second -j mychain
iptables -C mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \
iptables -A mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT
이런 식으로, 얼마 전에 예외가 삽입된 경우:
iptables -I FORWARD 2 -s 10.0.3.10 -d 10.0.4.20 -m comment --comment now_second -j DROP
스크립트는 이 예외 이전에 규칙을 다시 삽입하고 취소하지 않습니다.