ifconfig
내 스크립트에서 IPv6 주소를 사용하고 있습니다. 그런 다음 해당 주소는 TCP 포트에서 수신 대기하는 데 즉시 사용됩니다.
다음과 같이 스크립트를 작성하면 서비스가 수신할 수 없기 때문에 실패합니다.
ifconfig igb0 inet6 2001:db8::10/64 add
service my_service start #fails
그러나 다음과 같이 하면 성공합니다.
ifconfig igb0 inet6 2001:db8::10/64 add
sleep 1
service my_service start
ifconfig
나는 실행 작업 직후에 출력을 작성해 보았습니다 add
. ifconfig
보고된 IP 주소는 다음과 같습니다 .잠정적인, 이는 분명히 서비스가 이를 수신하지 못하게 할 것입니다.
물론, 잠시 기다렸다가 주소를 사용할 수 있기를 바라는 것은 이 문제를 해결하는 좋은 방법이 아닙니다. 임시 주소가 사용 가능해질 때까지 기다리거나 ifconfig
나중에 다시 돌아와서 주소가 모두 설정되도록 하려면 어떻게 해야 합니까?
답변1
주소는 여러 상태에 있을 수 있으며 임시 주소는 그 중 하나입니다. ifconfig
주소가 임시 상태를 벗어나기 를 기다리는 것은 의도적으로 설계된 것이 아닙니다.
다음에 정의된 대로 낙관적 DAD를 사용하도록 구성할 수 있습니다.RFC 4429. DAD가 아직 작성되지 않은 경우에도 신청서에 사용 가능한 주소를 제공하는 것이 목적입니다. 이 기능을 사용하려면 커널을 재구성해야 할 수도 있습니다.
낙관적 DAD를 제공하도록 커널이 구축되면 특정 sysctl 설정을 통해 이를 활성화할 수 있습니다. ~에서IP-sysctl.txt:
/proc/sys/net/ipv6/* Variables:
...
conf/interface/*:
Change special settings per interface.
The functional behaviour for certain settings is different
depending on whether local forwarding is enabled or not.
...
optimistic_dad - BOOLEAN
Whether to perform Optimistic Duplicate Address Detection (RFC 4429).
0: disabled (default)
1: enabled
use_optimistic - BOOLEAN
If enabled, do not classify optimistic addresses as deprecated during
source address selection. Preferred addresses will still be chosen
before optimistic addresses, subject to other ranking in the source
address selection algorithm.
0: disabled (default)
1: enabled
즉, 다음과 같은 작업을 수행합니다.
sysctl -w net.ipv6.conf.enp2s6.optimistic_dad=1
sysctl -w net.ipv6.conf.enp2s6.use_optimistic=1
시작시.
답변2
NetBSD 개발자에게 물어보고 이것이 FreeBSD에서도 작동하는지 확인한 후 해결책을 찾았습니다(두 운영 체제 모두에서 작동함).
DAD(중복 주소 감지)는 주소가 이미 사용 중인지 감지하는 데 다소 시간이 걸립니다. 이에 사용되는 시간은 sysctl(3) 값에서 초 단위로 정의됩니다.net.inet6.ip6.dad_count. NetBSD에서/etc/rc.d/network, 기능network_start_ipv6_autoconf, 스크립트는 이 시간에 1초를 더한 시간 동안 대기합니다.
DAD가 주소가 네트워크에서 이미 사용 중임을 발견하면 ifconfig(8)는 주소를 로 표시합니다 duplicated
. 이 상태에서는 주소를 사용할 수 없을 때와 마찬가지로 주소에 바인딩할 방법이 없습니다 tentative
.
따라서 보다 완전하고 올바른 솔루션은 다음과 같습니다.
ifconfig igb0 inet6 2001:db8::10/64 add
dadcount=$(/sbin/sysctl -n net.inet6.ip6.dad_count 2>/dev/null)
sleep $dadcount
sleep 1
ifconfig igb0 | grep 2001:db8::10/64 | egrep '(duplicated|tentative)$' >&2 && exit 1
service my_service start
현재 상태에 있는 주소를 추가할 때 FreeBSD와 NetBSD가 다르게 동작하는 것을 관찰했습니다 duplicated
.
- FreeBSD 11은 이 상태를 즉시 제거하여
duplicated
이 주소의 사용을 허용하지만 충돌이 발생할 수 있습니다. - NetBSD 7은 주소를 로 표시
tentative
하고 적어도 몇 분 동안은 그 주소에서 상태를 변경하지 않습니다. 주소를 사용하려면 먼저 제거하고 다시 추가해야 합니다.