
오늘과 어제, 서버가 자동으로 재부팅되어 부팅 중에 네트워크 장치를 불러오지 못했습니다. 머신을 다시 재부팅하면 정상적으로 시작됩니다. 또한 지난 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
때문에 부팅 시 서비스를 초기화하지 못했습니다 . 해당 특정 오류는 여기에 문서화되어 있습니다.systemd
ip6tables
https://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