고쳐 쓰다:

고쳐 쓰다:

나는 호스트 이름을 내 IP 주소와 연결할 수 있다는 것을 알고 있습니다 /etc/hosts.

1.2.3.4   foo

그러면 예를 들어 tcpdump출력 에 foo내 IP 주소 대신 표시됩니다( -n사용되지 않는 경우).

IP -> hostname실제로 파일을 편집하지 않고도 명령줄에서 이러한 매핑을 일시적으로 추가할 수 있습니까 ?

Wi-Fi에 연결하고 임의의 IP를 얻었다고 가정해 보겠습니다. 이 IP가 tcpdump의 내 호스트 이름으로 확인되기를 원합니다.이번 세션(항목을 영구적으로 추가할 필요는 없습니다 /etc/hosts.

고쳐 쓰다:

내 질문과 제목이 명확하지 않은 경우 수정하지 않고 이를 수행하는 방법을 찾고 있습니다 /etc/hosts.

hostname편집 없이 현재 세션(즉, 다음 재부팅까지)에 대한 호스트 이름을 설정하는 명령을 사용할 수 있는 것처럼 /etc/hostname, 수정 없이 현재 세션(즉, 다음 재부팅까지)에 대한 역방향 조회를 설정하려고 합니다 /etc/hosts.

답변1

C 라이브러리의 호스트 이름 확인 서비스(호스트 이름 확인이 필요한 거의 모든 소프트웨어에서 사용됨)는 hosts:주로 파일의 행에 의해 제어됩니다 /etc/nsswitch.conf. 이 줄의 각 키워드는 libnss_*.so해당 라이브러리를 로드하여 궁극적으로 애플리케이션의 호스트 이름 확인 요청을 처리합니다.

배포판에 라는 패키지 (또는 라이브러리를 제공하는 nss-myhostname다른 패키지)가 포함된 경우 해당 패키지를 설치하고 줄 에 추가 하면 라이브러리는 자동으로 로컬로 구성된 시스템 호스트 이름을 모든 IP 주소와 연결합니다. 시스템에 네트워크 인터페이스를 구성했습니다. 이 구성을 사용하면 연결을 업데이트하기 위해 명령을 실행할 필요가 없습니다. 모든 작업이 자동으로 수행됩니다. 시스템에 IP 주소가 전혀 구성되어 있지 않으면 로컬 호스트 이름도 IP 주소 127.0.0.2(및 IPv6 주소::1)와 연결됩니다.libnss_myhostname.so.*myhostnamehosts:nsswitch.conf

hosts:줄에 nsswitch.conf키워드가 포함되어 있거나 resolve/etc/resolv.conf에 줄이 있으면 DNS 확인자를 nameserver 127.0.0.53사용하고 있는 것입니다 . systemd-resolved이는 로컬 호스트 이름과 로컬로 구성된 IP 주소의 유사한 자동 상관 관계를 제공합니다 libnss_myhostname(위 참조). 이런 일이 발생하면 man systemd-resolved섹션을 참조하여 읽어보시기 바랍니다 SYNTHETIC RECORDS. 또한 선택적 mDNS(아래 참조) 및 LLMNR(Link Local Multicast Name Resolver/Responder) 기능도 포함되어 있으며 로터리 방식으로 로컬 호스트 이름 확인을 제공할 수도 있습니다.

hosts:회로에 nsswitch.conf멀티캐스트 DNS(mDNS)를 사용할 수 있는 호스트 이름 확인 서비스가 포함되어 있는 경우mdns4_minimal 그리고시스템에는 로컬 시스템의 IP 주소를 avahi-daemon자동으로 확인할 수 있는 mDNS 응답기(예: )가 포함되어 있으며 그 반대의 경우도 마찬가지입니다.<hostname>.local

hosts:라인에 nsswitch.conf다른 옵션이 포함되어 있거나 배포판이 다른 라이브러리를 제공하는 경우 배포판 libnss_*.so을 지정하지 않았으므로 해당 옵션이 제공하는 기능을 직접 조사해야 합니다.

hosts:행에 nsswitch.conf클래식 filesdns키워드 만 포함된 경우또는현재 로컬 네트워크 인터페이스에 구성되지 않은 IP 주소(예: 다른 호스트의 IP 주소 이름)에 이름을 할당해야 합니다. 그런 다음 다음의 방법을 참조하세요.마커스 뮐러의 답변.

이러한 답변 중 어느 것도 효과가 없다면 "아니요, 요청한 기능이 없습니다. 하지만 프로그래밍 기술이 있다면 직접 구현하는 데 방해가 되는 것은 없습니다."라고 대답하게 될 것 같습니다. 위의 가능한 접근 방식 그리고 Marcus Müller의 답변에서 이 목록은 자신의 솔루션에 연결하는 데 사용할 수 있는 인터페이스에 대한 아이디어를 제공해야 합니다.

답변2

따라서 여기서 tcpdump가 수행하는 작업은 역방향 조회를 실행하는 것입니다. 일반적으로 /etc/hosts 항목을 존중할 수 있는 것으로 보이며 getnameinfo이를 수행하기 위해 libc의 기능을 사용한다는 의미입니다. 예상했던 대로.

따라서 이는 런타임 환경의 상당히 핵심적인 부분의 동작을 수정해야 함을 의미합니다. /etc/hosts는 실제로 이를 수행하는 데 가장 방해가 되는 방법은 아닙니다.

이제 "회의 전용"에 대해 진지하게 생각해 보세요. 회의가 의미하는 바를 정의해야 합니다.

  • "세션"이 현재 실행 중인(또는 셸에서 시작된) 모든 프로세스를 의미하는 경우 함수를 자체 버전으로 바꾸고 실제로 모든 인수를 원래 함수에 전달하는 자체 작은 라이브러리 로드를 tcpdump사용할 수 있습니다 . 이름을 위조하려는 주소와 요청된 주소를 확인한 후에만 파일, 환경 변수 또는 활성 연결에서 해당 주소를 읽을지 여부는 귀하에게 달려 있습니다.LD_PRELOADgetnameinfo
  • "세션"이 "활성 네트워크 연결"을 의미하는 경우 네트워크 관리자에게 네트워크 자동 구성(DHCP)에서 제안한 확인자를 사용하지 말고 로컬에서 실행되는 자체 확인자를 사용하고 post-bringup 및 -bringdown을 사용하여 systemd 단위 파일을 트리거하도록 지시하십시오. 이 파서에 항목을 추가/제거합니다. 이는 모든 사용자에게 영향을 미칩니다.
  • "세션"이 많은 프로그램을 실행하려는 경우: 스크립트를 사용하여 원본 /etc/hosts를 새 파일에 복사하고 필요한 줄을 추가합니다. 그런 다음 수정된 파일을 사용할 설치 네임스페이스를 만듭니다. 그것은 마치
#!/bin/bash
modified_hosts=$(mktemp XXXXXXX.etchosts)
cp /etc/hosts "${modified_hosts}"
echo "$1 ownhost" >> "${modified_hosts}"

method="unshare"
#method="container"

if [[ ${method} = "unshare" ]]
then
  unshare --mount --map-root-user \
     bash --rcfile \
        <(echo . ~/.bashrc; \
          mount --bind --make-private "${modified_hosts}" /etc/hosts; \
          echo "You're now in a mount space of your own, /etc/hosts has been modified."\
         )
else
  container_image="fedora:36"
  podman run -it --rm -v "${modified_hosts}:/etc/hosts:Z" "${container_image}"
fi

관련 정보