2014-06-21 6 views
1

나는 사용자 공간의 TCP 스택 (주로 재미만을위한)에서 작업하고 있는데, 유닉스 TCP 스택에 대해 테스트하는데 약간의 문제가있다. 현재 유일한 테스트 형식은 단위 테스트를 통해 수행됩니다. 그러나, 나는 실제 커널 tcp 스택에 대해 내 tcp 스택을 테스트하려고한다. 나는 많은 성공없이 다음과 같은 설정을 시도했다.사용자 공간 tcp/ip 스택을 테스트하는 방법은 무엇입니까?

  • raw 소켓을 사용하여 : 저는 커널 tcp 소켓을 사용하여 연결을 허용하는 간단한 echo tcp 서버를 작성했습니다. tcp 서버는 localhost의 포트 8080을 수신합니다. 내 tcp 클라이언트는 사용자 공간 tcp 스택을 사용합니다. 그러나 클라이언트가 서버에 syn을 보낼 때마다 커널은 tcp rst를 보냅니다. 모든 TCP 첫 패킷을 삭제하도록 iptable을 수정 한 후 일종의 작업. 그러나 3 way syn, syn + ack, ack handshake가 설정 되었더라도 서버는 내 클라이언트가 보내는 모든 패킷을 recv 할 수 없습니다. 나는 결국 원시 소켓을 포기했다.

  • 비슷하게 echo 서버는 kernel tcp socket을 사용하고 localhost 포트 8080에서 수신 대기합니다. 클라이언트는 탭 장치를 엽니 다. 탭 장치에는 10.0.0.1의 ip가 있고 클라이언트에는 10.0.0.2의 ip가 있다고 가정합니다. 내 컴퓨터에서 10.0.0.2로 ping 할 수 있습니다. 그러나 내 클라이언트가 탭 장치를 통해 tcp 서버에 syn을 보내면 서버가 응답하지 않습니다.

참고 : 우분투 12.04를 사용하고 있습니다.

답변

1

conntrack 도구를 사용하면 원시 소켓을 사용하지 않는 이유에 대한 자세한 정보를 얻을 수 있습니다. 어떤 이유로 커널이 TCP 연결 상태에 대해 혼란 스러울 경우 재설정을 결정할 수 있습니다. 원시 테이블에 notrack 규칙을 설정하여 연결을 추적하지 않도록 커널에 알려주는 방법을 시도해 볼 수 있습니다.

iptables -t raw -A PREROUTING -p tcp --port 8080 -j NOTRACK 

같은 뭔가 패킷이 삭제됩니다 위치를 확인하기 위해 TUN/TAP 장치에iptables 수를 tcpdump를 사용해보십시오. 나는 또한 대신에 장치를 사용하여 레이어 3에 대해 걱정할 필요가 있습니다.