systemd를 실행하고 싶습니다일회성 서비스내 시스템이 네트워크 라우터로부터 새 IPv6 주소를 할당받을 때마다(이는 시작 시 발생하며 가동 시간 내내 주기적으로 발생합니다)
이상적으로 이 이벤트는 IPv6 주소 업데이트에만 적용되며 잠재적인 IPv4 주소 변경은 포함되지 않습니다.
그러한 이벤트에 대한 네트워크 dbus 활동을 모니터링하기 위해 systemd를 사용할 수 있습니까?
나의 궁극적인 목표는 이런 일이 발생할 때 동적 DNS 엔드포인트에 도달하여 시스템의 IPv6 DNS 레코드가 오래되지 않도록 하는 것입니다.
답변1
나는 몇 년 전에 (상상력 부족)이라는 제목의 글을 썼습니다.자동 도메인 이름.
systemd 서비스를 호출하지 않지만(그 당시에는 systemd가 존재하지 않았던 것 같습니다!) DNS 업데이트를 수행하기 위해 외부 프로세스를 호출합니다(고쳐 쓰다). 그러나 IP 주소 추가 및 삭제를 네트워크 링크 수준에서 직접 모니터링합니다. 즉, 발생 방식(수동 관리 구성, SLAAC, DHCP, 네트워크 관리자)에 관계없이 해당 항목을 선택합니다. 변화가 발생하면 즉시 반응합니다. 필터(링크-로컬 주소와 같은 항목을 자동으로 제외하도록 설계됨)를 지원하므로 원하는 대로 IPv6 주소 변경 사항을 준수하고 IPv4 주소 변경 사항을 무시하도록 할 수 있습니다.
어쩌면 당신은 그것을 사용하거나 필요에 맞게 수정할 수 있습니다. IP 주소 변경을 감지하고 대응하는 마법의 대부분은watchip.c, 제 생각에는.
답변2
일회용 서비스 대신 지속적인 시스템 서비스를 사용하세요.
[Unit]
Description=Dynamic DNS updater
DefaultDependencies=no
Wants=local-fs.target
After=local-fs.target
Wants=network-pre.target
Before=network-pre.target
[Service]
Type=exec
ExecStart=/usr/local/sbin/ddns-updater
[Install]
WantedBy=sysinit.target
패키지 의 도구를 사용하는 해당 /usr/local/sbin/ddns-updater
데몬 스크립트 :ip
iproute2
#!/bin/sh -e
ip -o -6 monitor address |
while read index iface proto addr dummy scope temporary dummy; do
case "$iface:$proto:$scope:$temporary" in
enp2s0:inet6:global:dynamic)
addr="${addr%/*}"
if [ "$addr" != "$current" ]; then
nsupdate -k /etc/network/nsupdate/Kyour.dyn.domain.name.+157+58882.private <<EOF
update delete your.dyn.domain.name AAAA
update add your.dyn.domain.name 300 AAAA $addr
send
EOF
echo "AAAA record set to $addr"
current="$addr"
fi;;
esac
done
이렇게 하면 자주 변경되는 무작위(개인 정보 보호 강화, 임시) 주소를 DNS 서버에 쓰는 것을 방지할 수 있지만 임시가 아닌 전역 주소(예: 정적으로 구성된 주소 및 SLAAC용 주소)가 여러 개 있는 경우 문제가 될 수 있습니다. 필요에 따라 조정합니다(인터페이스 이름, 도메인 이름, 키 파일 경로, 추가 논리, TTL...)