分析する

分析する

設定:

Debian jessie デバイスは ppp 経由でインターネットに接続されます。

私たちはsystemd-networkingを使用し、/etc/network/interfaceをまったく使用しません。

systemd-resolved は DNS に使用されます。

バージョン:

systemctl --version
systemd 230
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
armv7l GNU/Linux
kernel 4.4.14-v7+

(バージョンはjessie-backportsのバージョンです)

これはイーサネット+ W-Lanではうまく機能しますが、pppでは失敗します。

理由:カスタム接続スクリプト

0000usepeerdns 000resolvconf

systemd-resolvedが提供するdbusサーバーに接続するのではなく、/etc/resolv.confに書き続けています。

だから私はPPPインターフェースを使ってDNS解決をしようとしています。これは、私が読んだものからDBUSを介してSetLinkDNSを呼び出すことで可能です(リンクは終わり)

インターフェイスIDを取得します(この場合は5)。

ip l
..
5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 700 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 3                                                         
link/ppp    
..

リンクインタフェース5の現在の状態を読む

busctl introspect org.freedesktop.resolve1 /org/freedesktop/resolve1/link/_35 |grep DNS 
.DNS                                property  a(iay)    0                 -

インターフェイス5で1つのIPV4アドレスを使用してDNSを設定します。 (google DNSを例にしてみましょう。)(3番目の整数の解釈は何ですか?)

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 5 1 2 4 8 8 8 8
Link ppp0 is managed.

値が読み取られてまだ空であるため、値を挿入できません。

busctl introspect org.freedesktop.resolve1 /org/freedesktop/resolve1/link/_35 |grep DNS 
.DNS                                property  a(iay)    0  

それでは、最終的に動作させるには、どのように追加のデバッグを行うことができますか?

/etc/network/interfacesまたは「通常」/etc/resolv.confに置き換えることはオプションではありません。

私が使用したリソース(より多くのリソースがありますが関連性があります):

systemd Github問題トラッカー

freedesktop wikiネットワーク管理者

Jonathan NeoVPN DNS問題トラッカー

jonathanioのVPN DNS変更スクリプト

答え1

この問題は、ネットワークがすでに systemd によって管理されているために発生します。

その /etc/systemd/network/ ファイルで systemd-resolved 管理を無効にします。

デーモンを再ロードして再起動すると、 systemctl daemon-reload systemctl restart systemd-resolved エラーメッセージがLink ppp0 is managed消えました。

私はより多くの内容を読んで、freenode #systemd ircチャンネルに質問し、そこからポインタヘルプを取得し、ソースコードを読んで答えを見つけました。

以下は、インターフェース5のDNSをgoogle DNSに設定します。

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 5 1 2 4 8 8 8 8

答え2

既存に修正されたバグはさておき、もしあなたは今日使いやすいものを使っていますsystemd-resolved.service(私がテストしているシステムでは、これら2つは実際には異なる名前で同じ実行可能ファイルです)。特に複数のDNSサーバーの場合、構文を覚えるのは少し難しいですが、この方法はまだ機能します。resolvectlsystemd-resolvebusctl

次の例8.8.8.8では、唯一のDNSサーバーまたは8.8.8.8 そして 8.8.4.4。設定しているデバイスも考えられますppp0

分析する

私はこれが今日最も簡単であることがわかりました。

resolvectl dns ppp0 8.8.8.8 8.8.4.4

ステータスを見る:

resolvectl status

体系的分析

割り当てる方法が見つかりませんでした。二つsystemd-resolveを使用するDNSサーバーアドレスは単純であると考えられます。

systemd-resolve --interface=ppp0 --set-dns=8.8.8.8

ステータスを表示するには(resolvectl出力がの出力とどのように等しいかを確認):

systemd-resolve --status

バス制御

DNS サーバーがある Busctl:

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' $(ip link show dev tun0 | sed 's/:.*//') 1 2 4 8 8 8 8

SetLinkDNSの後のフィールド構文は、「signature」'ia(iay)'、「device id」7(今回は7つでした。取得するIDは異なります)、「number of DNS server」です。1IPv4アドレスには2つのパラメータが必要です。そして、そして最終的24IPの4つのオクテット: 8 8 8 8。そのため、2 つの DNS サーバーに対して次を使用します。

busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' $(ip link show dev tun0 | sed 's/:.*//') 2 2 4 8 8 8 8 2 4 8 8 4 4

以下では、メソッド/署名に関する詳細情報を取得できます。

busctl introspect org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager

現在のDNSステータスを確認するには:

busctl get-property org.freedesktop.resolve1 /org/freedesktop/resolve1 org.freedesktop.resolve1.Manager DNS

おそらくデバイスIDを取得するより直接的な方法があります/proc/net。しかし、ip link ... | sed ...それが私が最初に考えたものです。

関連情報