재부팅 시 iptables-restore가 실패하는 경우가 있음

재부팅 시 iptables-restore가 실패하는 경우가 있음

오늘과 어제, 서버가 자동으로 재부팅되어 부팅 중에 네트워크 장치를 불러오지 못했습니다. 머신을 다시 재부팅하면 정상적으로 시작됩니다. 또한 지난 2개월 동안 이와 관련된 문제가 발생하지 않았습니다.

이와 관련하여 찾을 수 있는 유일한 오류 로그는 다음과 같습니다.

Aug 23 06:37:14 server systemd[1]: Started ifup for ens16.
Aug 23 06:37:14 server systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE

그리고

Aug 23 06:37:14 server sh[281]: iptables-restore: line 10 failed
Aug 23 06:37:14 server systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE
Aug 23 06:37:14 server sh[281]: run-parts: /etc/network/if-pre-up.d/iptables exited with return code 1
Aug 23 06:37:14 server sh[281]: ifup: failed to bring up ens16

/etc/network/if-pre-up.d/iptables다음을 포함합니다:

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

/etc/iptables.up.rules다음을 포함합니다:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [896:90530]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT

간헐적으로 이 문제가 발생할 수 있는 이유는 무엇이며, 이러한 일이 다시 발생하지 않도록 하려면 어떻게 해야 합니까?

답변1

나는 여전히 부팅 프로세스 전반에 걸쳐 두 개의 실행이 /etc/network/if-pre-up.d/iptables동시에 실행되고 있다고 의심합니다. 권장하지 않는 한 동시에 작업을 시작하는 일반적인 동작 으로 인해 systemd부팅 프로세스가 인터페이스에 대해 하나의 스크립트 프로세스를 트리거 lo하고 인터페이스에 대해 다른 스크립트 프로세스를 트리거한다고 생각합니다 ens16. 그러면 가 동시에 실행되어 다음 iptables-restore과 같은 오류가 발생할 수 있습니다 iptables-restore: line 10 failed. 하지만 증거를 제공할 수는 없습니다.

저는 CentOS 및 Red Hat 시스템 관리에 익숙합니다. 옛날 옛적에 그러한 서버 중 하나가 동시에 시작되었기 iptables때문에 부팅 시 서비스를 초기화하지 못했습니다 . 해당 특정 오류는 여기에 문서화되어 있습니다.systemdip6tableshttps://bugzilla.redhat.com/show_bug.cgi?id=1477413

예를 들어 다음을 사용하여 스크립트에서 동시성을 처리하는 것이 좋습니다 flock.

#!/bin/sh
/usr/bin/flock /run/.iptables-restore /sbin/iptables-restore < /etc/iptables.up.rules

${IFACE}또는 규칙을 복원하기 전에 변수 의 실제 값을 확인할 수 있습니다 iptables(참조:남자 5 인터페이스):

#!/bin/sh
if [ "${IFACE}" == ens16 ]; then
    /sbin/iptables-restore < /etc/iptables.up.rules
fi

iptables또한 부팅 시 규칙을 로드하려는 경우 iptables-persistent대신 다음을 사용하는 것이 좋습니다.

# apt-get install iptables-persistent netfilter-persistent
# mv -v /etc/iptables.up.rules /etc/iptables/rules.v4
# systemctl enable netfilter-persistent.service
# rm -v /etc/network/if-pre-up.d/iptables

관련 정보