안녕하세요? 여러분의 도움을 얻고자 질문드립니다. 꼭좀 답변부탁드립니다.
제가 해야되는 일은 간단히 말씀드리자면
호스트A(윈도2000) 와 호스트B(윈도2000) 사이에 4대의 리눅스호스트 컴퓨터(1,2,3,4)가 존재하고 각각 4대의 컴퓨터는
랜카드(8139)가 3개씩 장착되어있습니다. 결과적으로는 A에서 B로 ping 테스트가 되어야하고 네트웍환경에서 보여서 파일을
주고 받을수 있으면 되는겁니다. 리눅스호스트 1,2,3,4는 서로 마치 링구조처럼 물리적으로 연결을 하였습니다. 말로설명을
하려니 더 어려워보이는데 각각의 리눅스호스트에 제가 만들어야할 어플리케이션자체는 그러니까 어떤 라우팅기능이 있는것은
아니며 단지 가령 A에서 어떤 이더넷 패킷이 들어오면 1번 호스트의 eth0인터페이스로 패킷이 들어가게 될거고 그럼 1번 호스트
에서는 들어오는 패킷을 커널로 보내지않고 바로 어플리케이션에서 잡아서 여기서 데이터영역에 약간의 변경을 한뒤 곧바로
eth1이나 eth2로 내보내기만 하면 되는데 결국 eth0, eth1, eth2 어느 네트웍디바이스로 패킷이 들어올지 모르기 때문에 모든
네트웍디바이스에 대해서 패킷을 감시 주시를 해야하는 프로그램이 필요하며 패킷을 어플리케이션에서 받아서 원하는 네트웍장치
로 보내주면 되는겁니다. libcap같은 api함수를 이용하면 모든 디바이스로부터 들어오는 패킷을 처리할수 있다고 문서를 찾아보았는데
그럼 이 패킷을 내가 원하는 네트웍장치로(eth0로 들어와서 eth1이나 eth2로 보낼려면)보내려면 어떻께 해야할지 이걸 모르겠습니다.
보통 패킷을 네트웍으로 보낼때는 어떤방법을 사용하는지요? 문서를 찾아보니 libnet인가하는것으로 이용하는거 같은데 이 경우도
보낼 네트웍장치의 선택은 어떻게 하는지도 궁금하구요. 또는 아래처럼 raw 소켓을 이용해서 보내는 방법이 있던데 가령
sock = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
sendto(sock, &msg,*LENGTH_OF_MSG*,0,&sin,sizeof(sin));
여기서 소켓에 뿌려줄 데이터는 IP 패킷이고 그럼 이 IP패킷이 실제로 네트웍 드라이버를 통해서 랜상에 전송이 되는거
같은데 그럼 이더넷 헤더를 붙여서 완전한 이더넷 패킷을 만들어주는것은 네트웍드라이버가 해주는건가요?
이와같이 구성이 된다고 가정할경우 호스트 A에서 최종 B로 ping test를 하면 이상이 없을까요?
조언을 부탁드립니다.
일반적으로 libcap에서는 이런 기능들을 지원하는 함수를 제공합니다.
네트워크 카드의 선택은 destination IP에 의해서 자동으로 선택이 됩니다. 그 카드가 어떤 IP대역에 물려있는지에 따라 PACKET이 스택단에서 나누어집니다.
패킷을 만드는 것과 (헤더를 붙이는 작업) 이더넷 카드를 선택하는 것은 전적으로 OS에서 해주는 일이죠.
* 중간 gateway같은 프로그램 만드시나 보네요? ^^; 아주 오래전에 이런 프로그램 비슷한거 libcap으로 해봤던 기억이 나네요..지금은 가물~