設定:
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に置き換えることはオプションではありません。
私が使用したリソース(より多くのリソースがありますが関連性があります):
答え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サーバーの場合、構文を覚えるのは少し難しいですが、この方法はまだ機能します。resolvectl
systemd-resolve
busctl
次の例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」です。1
IPv4アドレスには2つのパラメータが必要です。そして、そして最終的2
に4
IPの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 ...
それが私が最初に考えたものです。