2012-04-20 8 views
0

MAC 주소 만 연결된 장치에 패킷을 보내고 내 로컬 LAN에 연결하는 것을 좋아합니다.알려진 MAC 주소로 패킷을 보내는 루비

그런 작업을 수행하는 데 사용할 수있는 루비/젬 라이브러리가 있습니까?

나는 tcpreplay와 같은 것을하고 싶지만 대신에 루비를 사용하고 싶다. 감사!

+0

MAC 주소는 속해있는 IP에 대해 알지 못하면 실제로 연락 할 수 없습니다. 주어진 MAC이 항상 같은 IP를 가질 수는 없습니까? – Jasper

답변

1

MAC은 OSI 레이어 2에서 사용되는 주소이며이 레이어에서 사용하는 패키지 유형은 이더넷 프레임과 같습니다. IP 소켓은 레이어 3/4에 있습니다. 따라서 IP 소켓을 사용하는 경우 IP 패킷을 보내고 있습니다.

"MAC 주소로"보내려는 경우 다른 쪽에서 이해해야하는 원시 이더넷 프레임을 보내야합니다. 이 물건의 정말 낮은 수준을 감안할 때, 이것은 거의 당신이 정말로하고 싶은 일이 아닙니다.

대신 브로드 캐스트/응답 메커니즘 또는 멀티 캐스트 (예 : Bonjour에서 사용)를 사용하여 로컬 네트워크 (기술적으로 브로드 캐스트 도메인)에있는 원격 장치의 적절한 IP 주소를 가져와야합니다. 그렇게하면 훨씬 더 지원되는 IP 계층을 항상 사용할 수 있습니다. 이를 위해서는 장치에 IP 주소가 있어야합니다. DHCP와 같은 메커니즘을 사용하거나 IPv6의 자동 구성을 처리 할 수 ​​있습니다.

귀하의 질문에 대해서는 Ruby가 원시 이더넷 프레임을 보내는 라이브러리를 알지 못합니다. 그러나 어쨌든 IP 외에도 새로운 프로토콜을 발명해야 할 필요가 있기 때문에 패키지를 보내는 것이 아마도 가장 우려 할 사항 일 것입니다.

+0

고맙습니다. 나는 tcpreplay가 어떻게 보내는 지 궁금하다. 필요한 것은 pcap을 재생할 인터페이스입니다. 모든 도움에 다시 한 번 감사드립니다. 나는 tcpreplay 코드를 파헤쳐보고 –

+0

을 찾아야 할 것이다. 나는 'tcpreplay'프로그램이 pcap을 eth 인터페이스에 덤프하는 방법이 궁금합니다. –

1

몇 가지 접근 방법이 있다고 가정합니다. 당신은 어떤 종류의 IP 패킷을 보내고 싶었는지 말하지 않았다. 그렇다면 어떤 IP 프로토콜을 말하지 않았다. (I 프로토콜을 캡슐화 무슨 ... 당신은 이더넷 프레임하지만를 보낼 알 수 있습니까?)

을 어쨌든, 당신은 루비와 SOCK_RAW를 열 수 있습니다, 같은 :

Socket.open(Socket::PF_INET, Socket::SOCK_RAW, Socket::IPPROTO_RAW) 

또 다른 방법이 될 수 있습니다 다만 링크 로컬 IP를 선택하고 다음과 같이 귀하의 지역 ARP 캐시의 IP/MAC 매핑을 설정하려면 : 당신이 링크 로컬 IP 주소를 사용하여 더 익숙한 소켓 작전을 사용하여 통신 할 수있는 그런

system "arp -s host hw_addr" 

.

이러한 모든 작업을 수행하려면 루트 권한이 필요합니다.

관련 문제