Linux 인스턴스는 IP 주소를 어떻게 결정합니까?
즉, 127.0.0.1이 아닙니다.
이것이 파일에 저장되어 있습니까? 아니면 호출될 때마다 ifconfig가 어떻게든 계산합니까?
나는 노력했다는 것을 보여주기 위해 이 문제를 해결했지만 진지하게 적용할 만한 내용은 아닙니다.
sudo ifconfig | head -n 2 | tail -n 1 | tr -s " " | tr " " ":" | cut -d":" -f 4
답변1
귀하의 질문에는 근본적인 결함이 있습니다. 첫째, 호스트가 여러 주소(예: 여러 인터페이스)를 갖거나 심지어 인터페이스당 여러 주소를 갖는 것이 가능합니다. 이는 전 세계적으로 연결된 모든 호스트가 최소한둘주소.
둘째, 셸에서 이 작업을 수행하는 "가장 좋은" 방법은 시스템마다 다릅니다.
리눅스:
/sbin/ip addr show eth0 | awk -F"[ /]+" '/inet / {print $3}'
>= 솔라리스 11:
ipadm show-addr net0/v4 | awk -F"[ /]+" '/ok/ {print $5}'
맥 OS X/다윈:
ipconfig getifaddr en0
가장 낮은 공통 분모를 가져와 사용하더라도 ifconfig
출력 형식이 변경될 수 있으므로 일관성이 없습니다. 그러나 예제를 정리하려면 다음 명령을 사용하십시오.
ifconfig eth0 | awk -F"[ :]+" '/inet / {print $4}'
Shell 대신 Perl, Ruby, Java 등과 같은 고급 언어를 사용하는 경우 각 언어에는 커널에서 이 데이터를 가져오는 고유한 방법이 있습니다. 알아보는 것은 여러분에게 맡기겠습니다.
답변2
이 정보는 언제든지 변경될 수 있으므로 커널에서 검색해야 하며 파일에 저장할 수 없습니다.
이 정보를 얻을 수 있는 좋은 방법은 없습니다. 귀하의 구문 분석은 무엇보다도 훌륭합니다. 단지 두 번째 줄의 하드코딩이 잘못되었다는 것뿐입니다. 인터페이스가 특정 순서로 나열된다는 보장은 없습니다. 머신에 여러 인터페이스가 있는 것은 매우 일반적입니다. 여러 네트워크 카드나 가상 인터페이스가 있을 수 있습니다.
일반적으로 관심 있는 IP 주소는 기본 경로와 연결된 IP 주소입니다. 대부분의 구성에서는 이 명령을 사용하여 올바른 인터페이스를 얻은 route
다음 해당 인터페이스의 IP 주소를 추출하는 데 사용할 수 있습니다 ifconfig
.
/sbin/ifconfig $(/sbin/route -n |
awk '$1 == "0.0.0.0" {print $8}') |
awk 'match($0, /inet addr:[.0-9]+/) {print substr($0, RSTART+10, RLENGTH-10)}'
sudo
를 호출할 필요가 없으며 ifconfig
일반적 으로 루트가 아닌 사용자의 기본값 route
은 아니지만 PATH
정보를 읽고 설정을 변경하지 않는 한 특별한 권한 없이 사용할 수 있습니다.
Linux 이외의 UNIX 변형에서는 위 명령을 조정해야 할 수도 있습니다. 대부분의 ifconfig
명령에는 및 이름이 있지만 route
출력 형식은 다를 수 있습니다.
Linux에서는 및 대신 다음 명령을 사용할 수 있습니다 ifconfig
.route
ip
IP 경로 2도구 키트. iproute2의 작성자가 iproute2를 고려하고 ifconfig
더 이상 사용하지 않지만 출력을 구문 분석하기가 훨씬 쉽지 않고 항상 사용할 수 있는 반면 일부 간단한 Linux 설치에서는 이를 생략하기 때문에 route
실제로 사용하는 데 이점이 없습니다 .ip
ip
ifconfig
route
ip
답변3
여기에 있는 모든 답변은 기술적으로 정확하지만 "올바른" 답변으로 간주되는 것은 아닙니다. 불행하게도 귀하의 질문은 매우 모호합니다. (Linux에서 네트워킹이 어떻게 작동하는지 잘 모르신다면 이해할 수 있습니다.) 문제에 대한 가능한 설명에 대한 몇 가지 답변을 드리겠습니다.
머신의 기본 IP
머신에는 다른 모든 IP보다 상위에 있는 IP가 있으며 해당 IP는 머신의 기본 IP로 간주됩니다. 상자에는 여러 개의 IP가 있을 수 있고 어떤 IP가 사용되는지는 다양하므로 이는 의미가 없습니다(나중에 이에 대해 자세히 설명하겠습니다).
기본 IP는 단순히 컴퓨터의 호스트 이름과 연결된 IP입니다. 다음 명령을 실행하여 IP를 찾을 수 있습니다.
getent hosts "$(hostname)" | awk '{ print $1 }'
이제 그것이 하는 일은 호스트 이름을 기반으로 머신의 IP를 찾는 것입니다 /etc/nsswitch.conf
. 대부분의 경우 이 파일 /etc/nsswitch.conf
에는 hosts: files dns
. 따라서 명령은 일치하는 항목을 얻을 수 있습니다 . 해당 행에서 IP를 가져오면 됩니다 ./etc/hosts
/etc/resolv.conf
getent hosts "$(hostname)"
/etc/hosts
awk
( getent
그 안에 나열된 "데이터베이스"를 쿼리하기 위한 간단한 유틸리티 /etc/nsswitch.conf
)
외부 세계와 통신하는 데 사용되는 IP
앞서 언급했듯이 해당 머신의 기본 IP는 의미가 없습니다. 기계는 여러 IP 중 하나를 사용하여 통신할 수 있습니다. 귀하의 경우에는 아마도 하나의 인터페이스와 하나의(로컬 호스트가 아닌) IP만 있을 것입니다. 그러나 서버에는 여러 인터페이스 또는 IP가 있을 수 있습니다(때로는 단일 인터페이스에 여러 IP가 있음).
어떤 IP가 사용되는지는 커널의 라우팅 테이블에 따라 결정됩니다. 라우팅 테이블의 작동 방식은 간단하지 않기 때문에 자세히 설명하지 않겠습니다(라우팅 테이블은 여러 개 있고 어떤 테이블을 사용할지는 테이블 선택 규칙에 따라 다름). 어떤 IP가 사용될지 찾는 방법을 알려드리겠습니다.
특정 대상과 통신하는 데 어떤 IP가 사용되는지 확인하려면 다음 명령을 사용하십시오.
ip route get 1.2.3.4
( 1.2.3.4
목적지로 IP)
내 컴퓨터에서 google.com의 IP() 중 하나를 사용하여 이 작업을 수행하면 74.125.139.102
다음과 같은 결과를 얻습니다.
74.125.139.102 via 192.168.0.1 dev wlan0 src 192.168.0.24
cache
이것이 나에게 알려주는 것은 192.168.0.24
내 컴퓨터가 와 통신할 때마다 이 IP가 사용된다는 것입니다 74.125.139.102
.
IP만 원하는 경우 grep
끝에 추가 IP를 추가할 수 있습니다.
ip route get 1.2.3.4 | grep -oP '(?<=src )\S+'
grep
awk
오류가 발생할 가능성이 적기 때문에 an 대신 사용하세요 . 이 줄은 IP가 같은 위치에 있지 않을 때 변경될 수 있지만 항상 "src" 뒤에 오므로 "src" 바로 다음에 값을 가져옵니다.
기본 게이트웨이 IP
마지막으로 기본 게이트웨이가 있습니다. 어떤 IP가 사용될지 쿼리할 특정 대상이 없는 경우 기본 게이트웨이에서 하나를 선택할 수 있습니다. 인터페이스가 하나뿐이라면 어쨌든 이것이 가장 중요합니다.
이는 기본적으로 위와 동일하지만 기본 게이트웨이를 조회 대상으로 사용합니다.
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')"
그러면 이전 섹션의 것과 유사한 줄이 표시됩니다. 이 src
값은 기본 게이트웨이를 통과하는 트래픽에 사용되는 IP입니다.
이전 섹션과 마찬가지로 IP만 얻으려면 grep
.
ip route get "$(ip route show to 0/0 | grep -oP '(?<=via )\S+')" | grep -oP '(?<=src )\S+'
답변4
귀하의 요청이 명확하지 않습니다. "localhost"라는 용어는 루프백 인터페이스를 지칭하는 데 자주 사용되며, 127.0.0.1이 가장 일반적이고 정답입니다.
당신이 놓치고 있는 것은 다음과 같습니다:
- 실제로 각 인터페이스는 서로 다른 IP를 가질 수 있으며 루프백 인터페이스는 이더넷 카드나 무선 USB 수신기와 마찬가지로 네트워크 인터페이스입니다.
- 따라서 PC에는 하나의 IP가 없으며 모든 것은 고려 중인 인터페이스와 운영 체제에서 사용되는 인터페이스 수에 따라 다릅니다.
커널이 네트워크 활동을 처리하는 방법을 이해하는 데 좋은 방법인 "커널 라우팅 테이블" 주제에 관심이 있을 수 있습니다.