
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
アドレスは複数の状態にあり、一時アドレスはその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
し、少なくとも数分間はそのアドレスの状態を変更しません。アドレスを使用するには、まず削除して再度追加する必要があります。