데비안의 /etc/hosts

데비안의 /etc/hosts

서버에서 작동하기 위해 PostgreSQL 데이터베이스에 연결하기 위한 Perl 스크립트를 얻으려고 합니다. 이 스크립트는 이상하게도 실패합니다. 그러다가 이것이 파일에 localhost없다는 것을 깨달았습니다 ./etc/hosts

이 컴퓨터(현재 Debian lenny를 실행 중)의 파일은 현재 다음과 같습니다.

127.0.0.1       machinename.domain   machinename
xxx.xx.x.xxx    machinename.domain   machinename

이것이 xxx.xx.x.xxxIP 주소입니다. 약간 오래된 설치(현재 Debian Freeze를 실행 중)인 현재 집 컴퓨터의 파일은 다음과 같습니다.

127.0.0.1       machinename          localhost
127.0.1.1       machinename.domain   machinename

내 집 컴퓨터는 라우터 뒤에 있으며 인터넷에 직접 노출되지 않습니다. 어쨌든 저는 DSL을 사용하고 있으며 고정 IP 주소가 없습니다.

나는 /etc한동안 내 컴퓨터를 버전 제어(etckeeper 사용)하에 두고 있었는데, 이 서버에 대해 일부 마스터 마인드(아마 나 자신)가 2009년 12월 17일에 다음과 같은 변경을 수행했다는 것을 발견했습니다.

-127.0.0.1      localhost
+127.0.0.1      machinename.domain  machinename

이전에도 이 파일이 왜 이런 식으로 설정되어 있는지 궁금했지만 대답은 명확하지 않았습니다. 몇 가지 문제:

  1. 127.0.1.1? 이것은 데비안만의 독특한 역사일 수도 있습니다. 웹을 검색하여 Gnome에 대한 모호한 주장을 찾았지만, 내용은 거의 없습니다.

  2. 데비안에서 이 파일은 어디에서 설정되었나요?

  3. 이 파일이 현재 올바른/최상의 형식으로 간주됩니까?

  4. 행의 이름 순서가 중요합니까? 내가하지 희망.

보다 일반적으로, 이 두 줄이 현재의 방식으로 구성되어 있는 이유를 설명하는 것은 무엇입니까?

/etc/hosts이제 서버를 다음으로 변경하겠습니다 .

127.0.0.1       machinename.domain  machinename localhost
xxx.xx.x.xxx    machinename.domain  machinename

논평?

답변1

일반화하다

너는 항상 가지고 있어야 해

127.0.0.1    localhost.localdomain localhost

귀하의 경우에는 영구 IP 주소가 없으므로 다음을 가질 수도 있습니다.

127.0.1.1    machinename.domain machinename

이 줄은 GNOME과 같은 일부 응용 프로그램에 필요한 것처럼 보이지만 실제로는 다른 응용 프로그램에서 문제를 일으킬 수 있습니다!

바라보다시스템 호스트 이름을 해결하기 위한 새로운 솔루션 제안.


실제로 컴퓨터에는 두 개의 호스트 이름이 있습니다.

localhost.localdomain동일한 컴퓨터에서 실행되는 두 TCP/IP 사용 프로세스 간의 개인 통신에 사용되는 이름입니다.

machinename.domain귀하의 기기와 귀하의 기기에 연결된 기기 간의 통신에 사용되는 이름입니다.

항상 ( IPv6를 사용하는 경우) localhost.localdomain을 가리키고 싶습니다 . 이렇게 하면 동일한 시스템에 있는 두 TCP/IP 프로세스 간의 모든 통신이 (예를 들어) 일반적으로 방화벽에서 허용되는 (루프백) 인터페이스를 사용하게 되며 네트워크를 사용할 수 있는지 또는 DNS가 사용 가능한지에 대해 걱정할 필요가 없습니다. 알았어, 일해라.127.0.0.1::1loiptables

GNOME 1 과 같은 일부 응용 프로그램은 동일한 컴퓨터와 통신할 때에도 모든 것에 컴퓨터의 공통 이름을 사용하려고 합니다. 이를 통해 그놈의 한 부분이 네트워크의 다른 시스템에서 실행 중이더라도 그놈의 다른 부분과 통신할 수 있습니다. (그놈의 N은 원래 "네트워크"를 의미했습니다.)

이상적으로는 다른 컴퓨터의 응용 프로그램이 귀하의 컴퓨터와 통신할 수 있도록 다른 컴퓨터가 귀하의 컴퓨터 주소를 확인하는 데 사용할 수 있는 DNS 또는 기타 공유 데이터베이스를 통해 귀하의 컴퓨터 이름이 알려지게 됩니다.

그러나 컴퓨터 이름이 DNS에 없거나 DNS가 제대로 작동하지 않는 경우에도 GNOME과 같은 프로그램은 여전히 ​​자체 통신 방법이 필요합니다.

/etc/hosts이 작업을 수행하려면 다양한 수정이 필요합니다.

예전에는 가장 흔했던

127.0.0.1    localhost.localdomain localhost
w.x.y.z      machinename.domain machinename

w.x.y.z예를 들어 기본 네트워크 인터페이스의 주소는 어디에 있습니까 eth0?

이 방법은 시스템이 고정 IP 주소를 사용하고 항상 연결되어 있는 경우에 작동합니다2 .

시스템에 동적 IP 주소가 있는 경우 다양한 스크립트를 사용하여 /etc/hostsDHCP 서버가 반환하는 항목을 기반으로 항목을 포함하도록 편집합니다.

그러나 시스템에 영구적인 네트워크 연결이 없으면 신뢰할 수 있는 주소가 없기 때문에 해당 항목을 추가할 수 없습니다.

그래서 사람들은 다음과 같은 일을 하기 시작했습니다.

127.0.0.1    localhost.localdomain localhost machinename.domain machinename

또는

127.0.0.1    machinename.domain machinename localhost.localdomain localhost

이렇게 하면 TCP/IP를 사용하는 프로세스는 컴퓨터 이름을 사용하여 IP 주소를 찾는 경우에도 동일한 컴퓨터의 다른 프로세스와 계속 통신할 수 있습니다.

그러나 다른 응용 프로그램이 중단됩니다.

예를 들어,dnsdomainname.

또한 서버가 3개의 루프백 장치 에서만 연결을 수신하기 때문에 동일한 컴퓨터에 있는 사람들만 서버에 연결할 수 있는 문제가 있었던 것으로 기억합니다 .

프로그램은 시스템의 이름을 얻은 다음 이름의 주소를 조회하고 발견된 첫 번째 주소를 사용하여 해당 네트워크 인터페이스에 바인딩합니다. 컴퓨터 이름이 127.0.0.14개의 주소로 확인되면 실행 중이라고 생각하는 서비스 machinename.domain(따라서 전체 네트워크에서 사용할 수 있음)가 실제로는 동일한 컴퓨터에서 실행 중인 다른 프로세스에서만 사용할 수 있음을 의미합니다.

Andy가 지적했듯이 이름의 순서는 중요하지 않습니다. 호스트 이름을 검색하려고 하면 127.0.0.1호스트의 정식/공식/기본 이름으로 이름이 표시되지만 앞뒤로 구문 분석하므로 /etc/hosts형식이나 형식이 필요 하지 않는 한 이것이 문제를 일으킬 것이라고 생각하지 않습니다. 다른 형식의 자동화된 편집 도구입니다.

하지만 제 생각에는 먼저 정규화된 도메인 이름(즉, 도메인 이름이 포함된 이름)이 있어야 한다고 생각합니다./etc/hosts의 형식.

한 줄 대신 두 줄을 사용하는 또 다른 유사한 형식이 있습니다.

127.0.0.1    localhost.localdomain localhost
127.0.1.1    machinename.domain machinename

lo의 주소는 127.0.0.1/8네트워크의 모든 주소가 127루프백 장치 라는 의미이므로 이는 깔끔한 트릭입니다 .

나는 이 형식이 항목을 변경해야 하는 도구가 machinename.domain항목을 건드리지 않고도 변경할 수 있도록 사용된다고 가정합니다 127.0.0.1 localhost....

그러나 여전히 machinename.domain매핑이 발생하므로 lo내가 언급한 문제가 계속 발생합니다.

또한 방금 가상 머신에서 Fedora 15를 시작하고 Gnome 데스크탑에 로그인했지만 TCP/IP 연결을 볼 수 없습니다. 그들은 모두 UNIX 소켓을 사용하고 있는 것 같습니다. 따라서 127.0.1.1항목이 더 이상 필요하지 않을 수도 있습니다.


각주

  1. 예전에는 그랬습니다. 내 Fedora 15 테스트 시스템에서는 TCP/IP 대신 UNIX 소켓을 사용하는 것으로 보입니다.
  2. 네트워크 시작 전 시스템 부팅 중에는 제외됩니다.
  3. "듣는다"기보다는 정말로 "묶는다".
  4. 또는 127.xxx 주소.

답변2

내 시스템에는 다음이 있습니다 /var/lib/dpkg/info/netbase.postinst.

create_hosts_file() {
  if [ -e /etc/hosts ]; then return 0; fi

  cat > /etc/hosts <<-EOF
        127.0.0.1       localhost
        ::1             localhost ip6-localhost ip6-loopback
        fe00::0         ip6-localnet
        ff00::0         ip6-mcastprefix
        ff02::1         ip6-allnodes
        ff02::2         ip6-allrouters

EOF

내 netbase 버전은 4.45입니다.

IP 주소를 역방향으로 조회하여 줄의 첫 번째 이름을 반환하고 싶습니다. 그렇지 않으면 순서가 중요한지 의심됩니다.

답변3

이전에도 이 파일이 왜 이런 식으로 설정되어 있는지 궁금했지만 대답은 명확하지 않았습니다.

텍스트 파일에서 한 줄을 추가하거나 제거하는 것은 스크립트하기가 매우 쉽습니다.

구성 요소를 추가하거나 제거하기 위해 텍스트 파일의 한 줄을 편집하는 것이 훨씬 어렵습니다.

따라서 "hostname -s" 및 "hostname -f"를 실행하고 /etc/hosts에서 127.0.1.1을 제거하고 호스트 이름 결과를 포함하는 새 스크립트를 추가하는 스크립트를 작성하는 것은 매우 쉽습니다.

그러나 127.0.0.1이 포함된 줄에서 호스트 이름을 제거하고(운영자가 수동으로 추가한 항목을 방해하지 않고) 현재 호스트 이름을 localhost 항목에 추가하는 스크립트를 작성하는 것은 훨씬 더 어렵습니다.

관련 정보