Ubuntu 18.04와 두 개의 네트워크 인터페이스(eth0 및 wlan0)가 연결되어 있습니다. 그래서 실제로 두 개의 LAN(예: LAN1과 LAN2)이 있습니다. 단순히 ping 명령(예: ping 다음에 일부 IPv4/IPv6 주소)을 실행하면 내부적으로 어떻게 작동합니까? 다음 질문이 있습니다. 이 문제를 해결하도록 도와주세요.
- ping은 이 주소에 대한 경로를 어떻게 찾나요?
- ping은 대상 주소에 도달하기 위해 어떤 인터페이스를 사용합니까? (LAN1, LAN2 또는 둘 다)
- 두 인터페이스가 특정 순서에 따라 차례로 시도됩니까?
- 주소가 로컬 네트워크 중 하나의 호스트에서 오는 경우 내부적으로 어떻게 작동합니까? (LAN 1 또는 LAN 2)
- 대상 주소가 로컬 네트워크(LAN1 또는 LAN2)에 속하지 않는 경우 작동 방법. ping 명령은 게이트웨이에 어떻게 도달합니까? 게이트웨이는 어떻게 선택하나요? 미리 정의된 순서가 있나요?
답변1
운영 체제는 패킷이 어디로 가야 하는지 알려주는 라우팅 테이블을 유지 관리합니다. 이 테이블은 패킷이 어느 주소에서 왔는지 기록하는 데에도 사용됩니다.
그런 다음 소스 주소가 이전에 지정되지 않았 source.sin_addr.s_addr=htol(INADDR_ANY);
음을 나타내도록 프로그래밍할 수 있습니다 . bind()
(기본적으로 지정되지 않지만 bind()
소스 포트만 바인딩하려는 경우 이 줄이 유용합니다.)
이 -B
옵션을 사용하면 ping
소켓 바인딩이 활성화되어 두 번째 및 후속 소스 주소를 수정할 수 있습니다. -I
소스 주소를 설정하는 인터페이스를 바인딩 할 수 있습니다 .
이것은 처음 세 가지 사항에 어느 정도 대답합니다.
LAN1(10.0.1.5로 가정)에서 LAN2(10.0.2.5)로의 핑 관련
10.0.1.5는 경로 테이블을 사용하여 10.0.1.1(게이트웨이)을 통해 10.0.2.0/24에 연결할 수 있음을 나타냅니다. 해당 이더넷 주소로 "10.0.1.5에서 10.0.2.5로" ping을 보냅니다. 그런 다음 게이트웨이는 이를 확인하고 LAN2를 통해 10.0.2.5에 직접 연결할 수 있음을 확인하고 패킷을 전달합니다. 10.0.2.5에서 10.0.1.5까지의 답변은 동일한 패턴을 따릅니다.
네 번째 요점은 더 까다롭습니다. 공개 주소를 사용하면 모든 게이트웨이가 경로를 교환하고 모든 사람이 누가 어디에 있는지(어느 게이트웨이를 통해) 알 수 있으므로 완벽하게 작동합니다. 때때로 라우팅 테이블은 간단합니다. LAN1은 인터페이스 eth0을 통해 직접 액세스할 수 있고, 그 밖의 모든 것은 LAN1의 라우터 X를 통해 액세스할 수 있습니다. 그러나 우리는 여러 가지 목적으로 로컬 주소를 사용합니다. 10.0.0.5 주소는 인터넷에서 접근할 수 없습니다. 그런 다음 10.0.0.5에서 IP 패킷을 보내면 라우터는 from 주소를 인터넷 라우터에 알려진 공용 주소로 변경하고 스위치를 기억합니다. 공용 주소로 응답이 돌아오면 스위치를 기억하고 있는 라우터는 실제 주소(10.0.0.5)를 복구하고 10.0.0.5에서 응답을 받을 수 있습니다.