/etc/hosts의 IPv6 범위 ID

/etc/hosts의 IPv6 범위 ID

내 로컬 네트워크의 IPv6 주소에 대한 정적 호스트 이름을 설정하고 싶습니다. 그러나 /etc/hosts영역 ID를 허용하지 않는 것 같습니다. 영역 ID를 IPv6 주소에 추가하면 호스트가 정의되지 않은 것처럼 동작합니다. 영역 ID가 없으면 애플리케이션이 호스트에 연결할 수 없습니다.

이 문제를 어떻게든 해결할 수 있을까요? 아니면 특별한 영역 ID 구문이 있습니까 /etc/hosts?

답변1

이건 한계야GNU C 라이브러리(다른 사람도 있을 수 있습니다). 플러그인 API가 있습니다범위 ID(또는 ifindex/ifname)를 안정적으로 전달할 수도 없습니다.. 그런 다음 nss_files내가 아는 한 구문이 아직 준비되지 않은 실제 플러그인이 있습니다 .

나는 확실히 이것에 도움을 줄 수 있고 그에 따라 답변을 수정할 수 있습니다. 첫째, 오픈 소스 프로젝트 형태로 glibc 이름 확인 API를 다소 실험적으로 대체하는 작업을 진행 중입니다.네트워크 분석. 무엇을 하고 있는지 알고 있다면 실험이나 일상 업무에 사용할 수 있습니다. 또한 /etc/hosts에서 IPv6 범위 ID를 지원하지 않는 것 같지만 이를 TODO 목록에 추가합니다. 둘째, glibc 기본 지원을 위한 패치를 제공할 수 있습니다. 로컬로 적용하거나 프로젝트에서 이를 수용할 수 있기를 바랍니다.

이론적으로는 이 기능을 제공할 수 있는 멀티캐스트 DNS와 같은 프로토콜이 있지만nss_mdns에서는 구현되지 않았습니다.같은 문제로 차단되었습니다.

netresolve를 사용한 솔루션

그래서 나는 내가 그랬다는 것을 깨달았습니다.네트워크 분석하지만 난 해야 해일부 사소한 버그 수정정말 효과가 있게 만드세요. 제가 사용해 볼 수 있게 해주시고 관심을 갖도록 해주셔서 감사합니다.

git에서 프로젝트를 빌드해야 합니다. ㅏ젠투 실시간 ebuild그리고아치 AUR 백공급. 종속성 검사는 아직 완벽하지 않습니다. 이 패키지는 netresolve이름 확인 쿼리를 수행하기 위한 명령과 wrapresolvelibc 확인 루틴을 사용하여 프로그램을 실행하기 위한 명령을 제공합니다 .libnetresolve. 환경 변수를 사용하여 이 작업을 수행하므로 LD_PRELOAD실행 등을 통해 전체 셸을 실행할 수도 있습니다.wrapresolve bash

구성

/etc/호스트:

fe80::2677:3ff:fe40:db38%wlan0 test-link-local-with-scope-id

참고: 예제에 보고된 대로 백분율 기호와 인터페이스 이름(ifname) 또는 인터페이스 인덱스(ifindex)를 추가하여 표준 방식으로 범위 ID가 있는 링크 로컬 주소를 작성할 수 있습니다 ip link.

netresolve를 사용하여 테스트

# netresolve --node testxxx
response netresolve 0.0.1
name testxxx
ip 1:2:3:4:5:6:7:8%eth0 any any 0 0 0 0
secure

Wrapresolve 및 getaddrinfo를 사용한 테스트

netresolve 패키지는 getaddrinfo()또한 getaddrinfo.

# wrapresolve getaddrinfo test-link-local-with-scope-id
query:
  nodename = test-link-local-with-scope-id
  servname = (null)
status = 0
#0:
  family = 10
  addrlen = 28
  address:
    family = 10
    port = 0
    flowinfo = 0x00000000
    address = 0xfe80000000000000267703fffe40db38
    scope_id = 3
  nodename = test-link-local-with-scope-id

Wrapresolve 및 getent를 사용한 테스트

이는 시스템에 이미 있는 도구를 사용한 첫 번째 테스트입니다. 그렇지 않으면 이전 테스트와 매우 유사합니다.

# wrapresolve getent ahosts test-link-local-with-scope-id 
fe80::2677:3ff:fe40:db38 0      test-link-local-with-scope-id

Wrapresolve 및 ping6을 사용한 테스트

# wrapresolve ping6 test-link-local-with-scope-id

PING test-link-local-with-scope-id(fe80::2677:3ff:fe40:db38) 56 data bytes
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=3 ttl=64 time=0.072 ms
64 bytes from fe80::2677:3ff:fe40:db38: icmp_seq=4 ttl=64 time=0.078 ms
^C

참고: 루트로 ping실행 해야 합니다 ping6. 해당 작업에는 추가 권한이 필요하며물뿌리따라서 Wrappesolve에서는 제대로 작동하지 않습니다.

Wrapresolve 및 SSH를 사용한 테스트

# wrapresolve ssh test-link-local-with-scope-id
# logout

와 같은 도구를 사용하여 테스트할 수도 있습니다 curl. 이는 권한이 없는 사용자에게도 적용됩니다.

멀티캐스트 DNS

내 netresolve 할 일 목록에 mDNS가 있습니다. 아마도 Avahi와 systemd-resolved를 통해 DNS, LLMNR 및 mDNS 서비스를 동시에 제공할 수 있습니다.

GNU C 라이브러리 수정

이것은 나의 장기적인 할 일 목록에 있고 그 중 일부를 작업하고 있는 다른 사람들과 연락하고 있습니다. 더 많은 옵션이 있으며 나중에 이 답변에서 더 많은 정보를 입력하겠습니다.

답변2

로컬 링크를 사용하여 수동으로 수행하는 것은 (아시다시피) 그다지 편리하지 않습니다. Link-local은 네트워크에서 로컬 게이트웨이 검색, 로컬 DHCPv6 서버, mDNS, OSPFv3 라우터 등과의 통신과 같은 자동화된 기능에 이상적입니다. 그러나 올바른 작업을 위해서는 라우팅 가능한 주소를 사용해야 합니다. ISP로부터 IPv6 주소를 얻은 경우 해당 주소를 사용하고, 그렇지 않으면 고유한 ULA 접두사를 생성하세요.

즉, 링크-로컬 주소가 작동하지 않습니다 /etc/hosts. 라우팅 가능한 주소를 사용하세요.

관련 정보