2011-01-27 2 views
4

요약 : 동일한 컴퓨터에있는 두 개의 물리적 인터페이스간에 데이터를 전달하기 위해 소켓을 만들고 Win32 소켓은 항상 트래픽을 직접 전달하려고합니다. 물리적 인터페이스를 밀어 넣는 대신 커널에서. 장치 설정, 레지스트리 조작, 라우팅 테이블 헛소리 또는 소켓 옵션을 통해이 동작을 비활성화하는 방법이 있습니까? 우리는 Windows XP SP3을 사용하고 있습니다.Win32 소켓 - 다른 로컬 인터페이스로 보낼 때 ip 패킷이 실제 인터페이스를 떠나도록하십시오.

일부 배경. 맞춤 IPv4 장비를 사용하기 위해 일부 자동화 된 IP 테스트를 구축하려고합니다. 우리는 우리가 연결하고있는 각 장치에 대한 Windows XP 컴퓨터와 개별 물리적 이더넷 인터페이스의 대규모 실험실을 운영하고 있습니다. 우리의 장치는 효과적으로 자체 IP가있는 이더넷 라우터입니다.

실험실 장비에서 장비를 통해 데이터를 전송 한 다음 다시 동일한 컴퓨터에 데이터를 전송해야합니다. 유니 캐스트 및 멀티 캐스트 UDP, TCP 및 브로드 캐스트 IP 트래픽을 장치를 통해 보내 게됩니다.

우리는 트래픽이 예정된 동일한 기계에서 시작되기를 원합니다. 이렇게하려면 자체 서브넷에 각각 고유 한 IP를 가진 두 개의 개별 NIC (예 : NIC# 1은 10.0.0.1/24, NIC# 2는 10.0.1.1/24)를 구성합니다. 우리의 장치는 간단한 패스 스루 라우터처럼 동작하며 10.0.0.0/24 서브넷에 하나, 10.0.1.0/24 서브넷에 하나씩 두 개의 인터페이스가 있습니다.이 인터페이스는 패킷을 앞뒤로 전달합니다.

데이터를 생성하기 위해 Win32 소켓은 잘 이해되고 잘 지원되며 고객이 사용하고 있으며 가장 빠른 접근 방법이기 때문에 사용할 수 있기를 바랍니다. UDP와 브로드 캐스트 IP는 패킷 주입이 가능하지만 TCP는 그렇지 않을 가능성이 높습니다. 나는 패킷 주입을 사용하는 아이디어를 즐겁게 할 것이지만, 표준 Win32 소켓을 강하게 선호 할 것이다.

요약에서 설명한 것처럼 패킷은 컴퓨터를 떠나지 않습니다. 나는 미치광이처럼 봤는데 많이 찾지 못했다. 어떤 아이디어?

답변

4

Windows의 명령 줄 ROUTE 유틸리티를 사용하십시오. 특정 서브넷의 특정 IP 주소로 전송 된 모든 IP 패킷이 다른 IP/장치로 전송되도록 구성 할 수 있습니다.예를 들어 : 당신은 NIC 인터페이스의 인덱스 번호를 알고있는 경우

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_2> METRIC 1 
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> <DEVICE_IP_CONNECTED_TO_NIC_1> METRIC 1 

은 또는, 당신은 대신을 지정할 수 있습니다 : 패킷이 NIC# 1의 IP로 전송 될 때마다

route ADD <NIC_1_IP> MASK <NIC_1_SUBNET> METRIC 1 IF <NIC_2_INTF> 
route ADD <NIC_2_IP> MASK <NIC_2_SUBNET> METRIC 1 IF <NIC_1_INTF> 

이 방법은, 패킷은 NIC# 2에 연결된 장치로 이동 한 다음 NIC# 1로 전달합니다. NIC# 2의 IP로 전송 된 패킷의 경우도 마찬가지입니다.

예를 들어 PC가 라우터가있는 네트워크에 연결되어 있으면 WireShark가 로컬 IP 트래픽을 캡처 할 수 있도록하는 유용한 기술입니다. 하나의 로컬 IP/포트에서 다른 로컬 IP/포트로가는 패킷은 라우터에서 PC로 반송되어 WireShark가 모니터링 할 수있는 물리적 인 인터페이스를 통해 이동할 수 있습니다 (WireShark는 각 로컬 패킷의 중복 사본 - 아웃 바운드 하나와 인바운드 - 그러나 당신은 중복을 걸러 낼 수 있습니다.)

+0

이것은 사람들이 제안하고 검색 할 때 찾은 모든 옵션 중에서 가장 잘 작동합니다. 나는 여전히 '브로드 캐스트'트래픽에 대해이 작업을 수행하는 데 문제가 있습니다. 더 많은 시간을 들여서 작업 할 필요가 있지만 Win7 (아이러니 컬, 브로드 캐스트 용 '유니 캐스트'옵션 사용)에 제공된 IP_UNICAST_IF 소켓 옵션이 필요할 필요가 있다는 느낌이 들었습니다. – antiduh

0

Winsock은 항상 패킷 데이터를 커널 공간으로 가져 와서 처리합니다. 일반적인 API에 대한 요점은 모든 장치가 동일한 "레이어"에서 처리된다는 것입니다. Winsock을 계속 사용하려면이 동작을 해결할 수 있다고 생각하지 않습니다.

버퍼 복사 중 일부는 또는 TransmitFile이지만 두 개의 장치 인터페이스 간에는 제거 할 수 없습니다.

그렇다면 Winsock에서 수행하는 추가 버퍼 처리 성능 문제가 있습니까? 보안 문제?

+0

무슨 말씀 이세요? 관심있는 NIC의 IP에 소켓을 연결 (bind)하지 않습니까? –

0

테스터의 끝점을 고유 한 가상 컴퓨터 내부에서 실행하는 방법은 어떻습니까? 그런 다음 단 하나의 하드웨어 만 필요하지만 서로를 알지 못하는 별도의 TCP/IP 스택을 로컬에 갖게됩니다 (대부분의 VM 솔루션은 패킷을 호스트를 통해 그대로 통과시킵니다. 호스트 VM간에 브리징을 구성하지 않으면 패킷을 가져 와서 다른 VM으로 곧바로 전송하지만 각 VM을 다른 실제 네트워크 어댑터에 바인딩합니다.

관련 문제