설정:
데비안 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를 예로 들어 보겠습니다.) (세 번째 정수의 해석은 무엇입니까?)
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
(제가 테스트하고 있는 시스템에서 이 두 가지는 실제로 다른 이름으로 동일한 실행 파일입니다). 특히 여러 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
으로 4
IP의 4개 옥텟: 8 8 8 8
. 따라서 두 개의 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 ...
그것이 제가 먼저 생각한 것입니다.