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}'
쉘 대신 Perl, Ruby, Java 등과 같은 고급 언어를 사용하는 경우 각 언어에는 커널에서 이 데이터를 얻는 고유한 방법이 있습니다. 이 문제는 당신에게 맡기겠습니다.
답변2
정보는 언제든지 변경될 수 있으므로 커널에서 검색해야 하며 파일에 저장할 수 없습니다.
이 정보를 얻을 수 있는 좋은 방법은 없습니다. 두 번째 줄의 하드 코딩이 잘못되었다는 점을 제외하면 구문 분석은 어느 것이나 좋습니다. 인터페이스가 특정 순서로 나열된다는 보장은 없습니다. 머신에 둘 이상의 인터페이스가 있는 것은 매우 일반적입니다. 여러 개의 네트워크 카드 또는 가상 인터페이스가 있을 수 있습니다.
관심 있는 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
출력 형식은 다를 수 있습니다.
ifconfig
Linux에서는 및 대신 다음 명령을 route
사용할 수 있습니다.ip
iproute2도구 제품군. iproute2의 작성자는 더 이상 사용되지 않는 것을 고려 ifconfig
하고 사용하는 반면, 의 출력은 구문 분석하기가 현저히 쉽지 않고 항상 사용할 수 있는 반면 일부 간단한 Linux 설치에서는 생략되기 때문에 route
실제로 를 사용하는 데 거의 이점이 없습니다 .ip
ip
ifconfig
route
ip
답변3
여기에 있는 모든 대답은 기술적으로 정확하지만 "올바른" 대답은 아닙니다. 불행히도 귀하의 질문은 매우 모호하므로(Linux의 네트워킹 작동 방식에 대해 잘 알지 못하는 경우 이해할 수 있습니다) 질문에 대한 가능한 해석에 대한 몇 가지 답변을 제공하겠습니다.
머신의 기본 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
. 즉, 어떤 종류의 호스트 이름이나 주소 조회를 시도할 때 /etc/hosts
먼저 찾은 다음 DNS(에서 구성한 대로 /etc/resolv.conf
)를 참조합니다.
따라서 명령은 getent hosts "$(hostname)"
에서 일치하는 항목을 가져올 가능성이 높습니다 /etc/hosts
. 단순히 awk
해당 라인에서 IP만 가져옵니다.
( 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
이것이 나에게 알려주는 것은 내 컴퓨터가 와 대화할 때마다 IP 192.168.0.24
가 사용된다는 것입니다 74.125.139.102
.
IP만 원하는 경우 grep
끝에 추가 정보를 추가하면 됩니다.
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가 없으며 모든 것은 고려 중인 인터페이스와 OS에서 사용하는 인터페이스 수에 따라 다릅니다.
커널이 네트워킹 활동을 처리하는 방법을 이해하는 데 도움이 되는 "커널 라우팅 테이블"이라는 주제에 관심이 있을 것입니다.