Iptables 지속성 서비스가 변경 사항을 저장하지 않는 이유는 무엇입니까?

Iptables 지속성 서비스가 변경 사항을 저장하지 않는 이유는 무엇입니까?

나는 팔로우한다이것우분투 12.04에서 IP 규칙 설정에 대한 튜토리얼입니다. 설정할 때는 모든 것이 잘 작동했지만 이제 방화벽을 변경했으므로 해당 변경 사항은 재부팅 후에도 유지되지 않습니다. 왜 이런 일이 일어나는지 이해할 수 없습니다. 다음은 iptables-persist를 사용하는 방법에 대한 데모입니다. 내가 뭘 잘못했나요?

$ sudo service iptables-persistent start
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...   

$ sudo iptables -L   //shows a certain rule
$ iptables -D INPUT ... //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

 $ sudo service iptables-persistent restart
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...                                                                                                      [ OK ] 
 $ sudo iptables -L  //rule is back

답변1

iptables-persistent이건 아니야. "서비스"를 다시 시작해 iptables-persistent도 iptables의 현재 상태가 캡처되어 저장되지는 ​​않습니다. 패키지가 마지막으로 구성되었을 때 저장된 iptables 규칙만 복원됩니다.

을 구성하려면 iptables-persistent현재 iptables 규칙 세트를 알려주어야 합니다.

이를 달성하는 한 가지 방법은 다음과 같습니다.

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6

또는 동등하게 iptables-persistent패키지는 다음도 제공합니다.

dpkg-reconfigure iptables-persistent

(규칙을 저장할 것인지 묻는 질문에 "예"라고 대답해야 합니다.)

그 후 iptables-persistent다음 부팅/재시작 시 예상되는 iptables 규칙 세트가 로드됩니다.

답변2

현재 iptables 규칙을 저장하는 매우 간단한 방법은 다음 명령을 사용하는 것입니다.

sudo service netfilter-persistent save

위의 방법( 적어도 Ubuntu에 패키지를 설치 netfilter-persistent한 후 작동 iptables-persistent)을 사용하면 iptables 명령을 수동으로 실행하거나 패키지를 재구성할 필요가 없습니다(위에서 허용된 답변에서 제안한 대로).

답변3

$ iptables ... DROP //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

그것은 그것이 DROP의미하거나 하는 일이 아닙니다. 에서 man iptables:

...특별한 값이 허용됩니다.줄이다,대기열 또는 반환. ACCEPT는 패킷이 통과하도록 허용한다는 의미입니다. 거절은 다음을 의미합니다.패킷을 바닥에 던집니다. 대기열의 의미는...

따라서 여러분이 해야 할 일은 새로운 규칙을 추가하는 것뿐입니다. 이는 다른 많은 규칙을 효과적으로 대체하지만 여전히 그대로 유지됩니다.

이와 같은 것(귀하의 iptables -L출력)을 검사할 때 저는 귀하의 눈을 사용하기보다는 공급할 것입니다 grep "string unique to this rule". 더 쉽고 빠르며 오류가 발생할 가능성도 적습니다.

iptables -L | grep "some unique string"

규칙을 제거하려면 스위치를 사용하십시오 -D. 매뉴얼 페이지에는 두 가지 형식이 설명되어 있습니다.

-D, --delete 체인 규칙 사양

-D, --체인 규칙 번호 삭제

선택한 체인에서 하나 이상의 규칙을 제거합니다. 이 명령에는 두 가지 버전이 있습니다. 규칙은 체인의 숫자(첫 번째 규칙은 1에서 시작)로 지정되거나 일치하는 규칙으로 지정될 수 있습니다.

답변4

설명대로@스티븐먼데이, 적절한 디렉토리(예: /etc/iptables/rules.v{4,6})에 규칙 세트를 직접 저장할 수 있습니다.

하지만,@OpenITeX맞습니다: 호출된 save작업이 service netfilter-persistent더 좋습니다.

오늘(18.10) 현재 iptables-save가 내장되어 iptables-persistent있지만아니요설치하다. 따라서 호출되는 플러그인 디렉토리 service netfilter-persistent는 비어 있고 서비스는 규칙 세트가 저장되었음을 인쇄하지만 이는 사실이 아닙니다.

TLDR: iptables-persistent플러그인 디렉토리에 /usr/share/netfilter-persistent/plugins.d플러그인이 포함되어 있는지 설치하고 확인하세요.


이것이 내가 생각해 낸 방법입니다.

$ cat /etc/init.d/netfilter-persistent 
...
case "$1" in
...
save)
    log_action_begin_msg "Saving netfilter rules"
    /usr/sbin/netfilter-persistent save
    log_action_end_msg $?
    ;;

그런 다음 스크립트를 확인 /usr/sbin/netfilter-persistent하고 외부 스크립트를 호출하는지 확인합니다.

$ cat /usr/sbin/netfilter-persistent
...
PLUGINS=/usr/share/netfilter-persistent/plugins.d
...
run_plugins () {
    if [ -d ${PLUGINS} ]; then
        run-parts -v -a ${1} ${PLUGINS}
    fi
}

case $1 in
start|save|flush)
    run_plugins ${1}
    ;;

/usr/share/netfilter-persistent/plugins.d그러다가 그것이 비어 있다는 것을 알았습니다 .

관련 정보