분석하다

분석하다

설정:

데비안 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로 대체하는 것은 옵션이 아닙니다.

내가 사용한 리소스(더 많은 리소스가 있지만 관련성이 있음):

systemd Github 이슈 트래커

freedesktop 위키 네트워크 관리자

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(제가 테스트하고 있는 시스템에서 이 두 가지는 실제로 다른 이름으로 동일한 실행 파일입니다). 특히 여러 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으로 4IP의 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 ...그것이 제가 먼저 생각한 것입니다.

관련 정보