서버에서 작동하기 위해 PostgreSQL 데이터베이스에 연결하기 위한 Perl 스크립트를 얻으려고 합니다. 이 스크립트는 이상하게도 실패합니다. 그러다가 이것이 파일에 localhost
없다는 것을 깨달았습니다 ./etc/hosts
이 컴퓨터(현재 Debian lenny를 실행 중)의 파일은 현재 다음과 같습니다.
127.0.0.1 machinename.domain machinename
xxx.xx.x.xxx machinename.domain machinename
이것이 xxx.xx.x.xxx
IP 주소입니다. 약간 오래된 설치(현재 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
이전에도 이 파일이 왜 이런 식으로 설정되어 있는지 궁금했지만 대답은 명확하지 않았습니다. 몇 가지 문제:
왜
127.0.1.1
? 이것은 데비안만의 독특한 역사일 수도 있습니다. 웹을 검색하여 Gnome에 대한 모호한 주장을 찾았지만, 내용은 거의 없습니다.데비안에서 이 파일은 어디에서 설정되었나요?
이 파일이 현재 올바른/최상의 형식으로 간주됩니까?
행의 이름 순서가 중요합니까? 내가하지 희망.
보다 일반적으로, 이 두 줄이 현재의 방식으로 구성되어 있는 이유를 설명하는 것은 무엇입니까?
/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
::1
lo
iptables
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/hosts
DHCP 서버가 반환하는 항목을 기반으로 항목을 포함하도록 편집합니다.
그러나 시스템에 영구적인 네트워크 연결이 없으면 신뢰할 수 있는 주소가 없기 때문에 해당 항목을 추가할 수 없습니다.
그래서 사람들은 다음과 같은 일을 하기 시작했습니다.
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.1
4개의 주소로 확인되면 실행 중이라고 생각하는 서비스 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
항목이 더 이상 필요하지 않을 수도 있습니다.
각주
- 예전에는 그랬습니다. 내 Fedora 15 테스트 시스템에서는 TCP/IP 대신 UNIX 소켓을 사용하는 것으로 보입니다.
- 네트워크 시작 전 시스템 부팅 중에는 제외됩니다.
- "듣는다"기보다는 정말로 "묶는다".
- 또는 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 항목에 추가하는 스크립트를 작성하는 것은 훨씬 더 어렵습니다.