Linux가 다른 IP에 액세스할 때 라우팅 테이블을 어떻게 사용하는지 알고 싶습니다. 내가 아는 한, 예를 들어 "ssh 192.168.21.2"를 실행하면 시스템은 대상 IP가 192.168.21.2인 TCP 패킷을 생성하고 다음 홉에 대한 라우팅 테이블을 참조합니다. 라우팅 테이블 항목은 다음과 같습니다.
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.16.1 0.0.0.0 UG 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1005 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1006 0 0 br1
192.168.16.0 0.0.0.0 255.255.240.0 U 0 0 0 br0
192.168.66.0 0.0.0.0 255.255.255.128 U 0 0 0 br1
여기서 시스템은 대상 네트워크 주소를 찾아 대상 네트워크 주소와 일치시키고, 일치하는 항목이 발견되면 패킷이 인터페이스를 통해 적절한 게이트웨이로 전송됩니다.
내 질문은 시스템이 라우팅 테이블과 일치시키기 위해 대상 IP의 네트워크 주소를 계산하는 방법과 시기입니다. 이 과정에서 제가 완전히 틀렸을 수도 있습니다. 시스템의 패킷 흐름을 이해하기 위해서는 해석이 필요합니다.
답변1
먼저, 네트워크 코드는 전송할 패킷에 대한 올바른 인터페이스를 선택합니다. 그런 다음 해당 소스 IP 주소를 적용합니다.
귀하의 경우 인터페이스는 아마도 주소가 있는 인터페이스일 것입니다.
192.168.16.X
분명히 "255.255.240.0" 마스크를 br0 인터페이스에 적용했으므로 이것이 나가는 인터페이스가 됩니다. 하지만 조심하세요:
192.168.21.2
귀하의 경우 .16.X 주소는 (넷마스크 때문에) 동일한 네트워크에 있으므로 나가는 패킷은 ARP를 통해 MAC 주소 21.1을 성공적으로 검색한 후에 인터페이스로 전송됩니다.
패킷을 다른 서브넷의 대상으로 보내는 경우(-->(대상 주소 및 마스크)가 다른 값을 제공함) 다음과 같이 말할 수 있습니다.
192.168.32.1
그런 다음 패킷은 라우팅을 위해 MAC 주소를 사용하여 게이트웨이로 전송됩니다.
답변2
기본적으로 라우팅 코드는 전체 라우팅 테이블을 통과하며 테이블의 각 행에 대해 해당 행을 기록합니다 (destIP & netmask) == destination)
. 0~N개의 일치 항목이 있을 수 있습니다. 경로가 둘 이상인 경우 "가장 구체적인" 경로, 즉 넷마스크에 최대 1비트가 있는 경로가 선택됩니다. 일치하는 경로가 없으면(기본 경로가 없는 경우) 패킷을 전달할 수 없습니다.
대상 네트워크, 즉 대상의 호스트와 네트워크 부분 간에 주소가 분할되는 방식은 라우팅 결정에 영향을 미치지 않습니다. 보내는 호스트는 일반적으로 이를 모르고 신경 쓰지 않습니다.