본문 바로가기
C++ 200제/코딩 IT 정보

[ICMP redirect] IP 라우팅 : FOWARD, REDIRECT 예제

by vicddory 2017. 9. 6.

[ICMP redirect] IP 라우팅 : FOWARD, REDIRECT 예제


To Forward or Not to Forward

호스트들은 특별히 라우터로 구성되지 않는 한, IP datagram을 forward하지 않는다. 그렇다면 이러한 구성은 어떻게 이루어지는 것인가? 대부분은 ipforwarding이라는 커널 변수를 갖는다. 어떤 시스템은 이 변수가 zero가 아닐때만 forward를 한다. SunOS 4.1.x는 세가지 값을 가질 수 있다.


-1은 forward하지 않고 이후 변수의 값을 바꿀 수 없음을 의미하고, 0은 기본적으로 forward하지 않으나 두 개 이상의 interface가 설정되면 1로 세트하고, 값이 1이면 항상 forward함을 의미한다.


Solaris 2.x는 세 개의 값을 갖는다. 0은 never forward, 1은 always forward, 그리고 2는 두 개 이상의 interface가 설정되면 forward함을 의미한다.


ICMP redirect Errors

ICMP redirect error는 datagram이 다른 라우터로 보내여쟈만 할때, IP datagram을 송신한 라우터에 의해 보내진다. 아래 그림에서 보는 바와 같이 이 개념은 간단하다. ICMP redirect를 볼 수 있는 경우는 패킷을 보내기 위해 호스트가 라우터를 선택할 때이다.


IP 라우팅  FOWARD


1. host가 IP datagram을 R1으로 보내는 경우를 생각해 보자. R1이 그 호스트에 대한 디폴트 라우터이기 때문에 이러한 라우팅 결정은 종종 이루어진다.


2. R1은 datagram을 수신하고 라우팅 테이블을 검색한다. 그리고 R2가 datagram을 보낼 올바른 next-hop 라우터라고 결정한다. R1이 R2로 datagram을 보낼때, R1은 그것이 datagram이 도착한 것과 같은 interface로 보낸다는 것을 감지한다. 이것은 redirect가 original sender로 보내질 수 있는 라우터인 증거이다.


3. R1은 ICMP redirect를 호스트에 전송한다. 그리고 이후의 datagram은 R1대신 R2로 보낼 것을 알린다.


ICMP redirect, Example of an ICMP redirectICMP redirect, Example of an ICMP redirect


redirect의 일반적인 사용은 최소한의 라우팅 정보로 더 나은 라우팅 테이블을 구축하도록 하는 것이다. 호스트는 단지 디폴트 라우터로만 시작할 수 있다. 그리고 이러한 default가 잘못되었다고 판단되면 언제라도 redirect로 routing table을 갱신하도록 default router에게 알릴 수 있다.


ECMP redirect는 routing 할 때 TCP/IP 호스트들이 지능적으로 벙어리가 되는 것을 허용한다. 확실히 R1과 R2는 네트워크의 토폴로지에 대해 더 많이 알고 있다. 그러나 LAN에 붙어있는 모든 호스트들은 default route로 시작할 수 있다. 그리고 그들이 수신한 redirect로 더 많은 일을 할 수 있다.


An Example

우리의 네트워크에서 동작하는 ICMP redirect를 볼 수 있다. 비록 최상위 네트워크에 세 개의 호스트(aix, solaris, gemini)와 두 개의 라우터(gateway, netb) 밖에 보이지 않지만, 사실 이 네트워크에는 150개 이상의 호스트와 다른 라우터들이 있다.


대부분의 호스트는 게이트웨이를 기본 라우터로 하고 있다. 그 이유는 gateway가 인터넷으로의 접근을 제공하기 때문이다.


[ICMP redirect] IP 라우팅  FOWARD, REDIRECT 예제


어떻게 140.252.1 서브넷에 있는 호스트들이 140.252.13 서브넷에 접근할 수 있을까? 다시 생각해보면, 단지 하나의 호스트가 SLIP 링크의 끝에 있다면, proxy ARP가 사용된다.


140.252.1에 있는 호스트가 sun(140.252.1.29)에 접근하는 것은 별로 어렵지 않다. netb에 있는 proxy ARP 소프트웨어가 이것을 처리할 것이다.


그러나 SLIP 링크의 다른 한쪽에 네트워크가 있다면, 라우팅이 포함될 것이다. 하나의 해결책은 모든 호스트와 라우터가, netb가 140.252.13 네트워크의 게이트웨이라는 것을 아는 것이다.


FOWARD, REDIRECT 예제


이것은 각 라우터의 라우팅 테이블에 있는 static route에 의해 이루어질 수도 있고, 각 호스트에서 routing demon을 실행시킴으로써 이루어질 수 있다.


좀 더 간단한 방법이자 실제로 사용되고 있는 ICMP redirect를 이용하는 것이다. 상위 네트워크에 있는 솔라리스에서 하위 네트워크에 있는 bsdi로의 핑 프로그램을 실행시켜 보자. 서브넷 ID가 다르므로, proxy ARP는 사용될 수 없다.


static route가 설정되어 있지 않다고 가정하면, 첫 번째로 보낸 패킷은 라우터 게이트웨이로의 default route를 사용할 것이다. 여기에 ping을 실행하기 이전의 라우팅 테이블이 있다.


ICMP redirect, routing tableICMP redirect, routing table


만일 -v 옵션으로 ping을 실행한다 가정하자.


호스트로부터 수신한 ICMP 메시지를 볼 수 있을 것이다.


ICMP redirect, ICMP messageICMP redirect, ICMP message


첫 번째 ping 응답을 받기 전에, 기본 라우터인 gateway로부터 ICMP redirect를 수신한다. 만일 그때 routing table을 살펴보면, bsdi로의 새로운 route가 삽입된 것을 볼 수 있을 것이다.


ICMP redirect, Solaris 응답 1ICMP redirect, Solaris 응답 1


ICMP redirect, Solaris 응답 2ICMP redirect, Solaris 응답 2


이제 드디어 D flag를 볼 수 있을 것이다. 그것은 그 route가 ICMP redirect에 의해 설정되었음을 의미한다. G flag는 게이트웨이(netb)로의 indirect route를 의미한다. 그리고 H flag는 network route가 아니라 host route임을 의미한다. host redirect가 추가된 host route이므로, 그것은 bsdi만을 처리한다.


그때 만일 svr4를 access 한다면, 또 다른 host route를 만드는 redirect가 생성될 것이다. 유사하게, slip을 access 하는 것은 또 다른 host route를 만든다. 여기에서 중요한 것은 각각의 redirect는 추가된 host route를 유발한 단 하나의 host를 위한 것이라는 점이다.


subnet에 있는 세 개의 호스트들(bsdi, svr4, slip)은 모두 라우터 sun으로의 하나의 network route로 처리될 수 있다. ICMP redirect는 host route를 생성하지만 netwrok route는 생성하지 않는다. 왜냐하면 앞의 예에서 redirect를 생성한 라우터는 140.252.13 네트워크에 있는 서브넷의 구조에 대해 아무것도 모르기 때문이다.


[ICMP redirect] IP 라우팅 : FOWARD, REDIRECT 예제

댓글