arp request 로 고민이 되어 글올립니다.

ktkmyfeeling의 이미지

유닉스 통신 쪽으로는 초보입니다.

이제야 raw socket을 이용하여 packet을 전송을 이해하고 사용하고 있습니다.

공부중 arp 를 하려고 하는데 제 순서가 맞는지 알고리즘이 맞는지 아직 확실치도 않고

무수히 많은 실패로 인해 더이상 알고리즘이 생각 나지 않아 글을 올리게 되었습니다.

생각했던 방법이 UDP broadcast 로 request 하는 방법이었습니다.

raw socket 을 사용하여 packet을 조작하여 sendto로 보내려고 하였습니다.

request는 공부를 하여서 방법이

src_address(my ip address), mac_address, dst_address(상대방 address)를

ethernet으로 보내서 ethernet에서 다시 broadcsat 하여 dst_address에서 받고 reply하여

unicast 하여 ethernet으로 보내고 ethernet에서 다시 저에게 보내서 mac_address를 받고

통신을 하는 것으로 알고있었습니다.

그래서 먼저 packet를 작성하여 udp broadcast를 하려고 하는데

mac address를 추출하려는 부분에서 엄청난 고민과 실의에 빠졌습니다.

linux에서는 SIOCGIFADDR등 함수를 써서 ip와 mac address 를 구하는 걸로 알고 있습니다.

하지만 제 쪽 환경에서는 SIOCGIFADDR드의 함수가 없습니다.

만약 제가 생각 하고 있는 방법이 틀리다면 지적해 주시고

혹 만약 맞다면 mac address를 추출할수 있는 참고 할 수 있는 소스나 책 등을 알려주세요

고수님들 부탁 드립니다.

익명 사용자의 이미지

아마도 생소켓 관련을 보시고 ARP 를 구현해보려 하시나보군요.
전 컴퓨터 없이 살고 있으므로(스마트폰이라 존칭생략요) 그림만 그려봅니다.
그리고 이 글의 수정판을 제 블로그에도 쓸 것이고 다른 글도 있지만 블로그링크는 간접광고이므로 하지 않습니다.
혹 도움이 될 수도...

1. 보통 넷트웍 데이타흐름은 커널 ip계층<=>전송<=>응용fd 과정 인데
생소켓은 이 중 전송계층을 빼버리는 것이다.
전송계층을 빼버린다는 말은

송신시 : 전송헤더는 만들지 않아도 되고 그러면 상대방은
-ipv4 일경우 전송계층으로 올리려다가 프로토콜을 못찾아서 드랍하고 icmp 에러를 리턴
-icmp 일경우 커널내 icmp 루틴 호출 후 적절한 처리.icmp에는 상위 프로토콜 필드가 없으므로 더 이상 전송계층으로 시도하지 않고 끝.
-ipv4 이면서 tcp/udp 가 아닌 사설의 서로 약속된 즉 수신시스템상에 생소켓호출시 약속된 프로토콜번호를 사용해 fd를 할당받은 프로그램이 있을 경우 패킷 사본은 이 프로그램으로 전달.
-ipv4 이면서 프로토콜번호 0 를 사용한 프로그램이 있을 경우 모든 패킷사본은 이 프로그램으로 복사.(아마도 리눅스만 확인필요)

생소켓은 이 소켓을 호출한 시스템내에서의 커널과 응용과의 약속일 뿐 일단 전송되면 수신상대는 이게 생소켓인지뭔지 모르고 관계도 없다.
관계가 있으려면
-ipv4 헤더필드에 상위프로토콜이 서로 약속된걸 쓰든가
-0 로 해서 생소켓 서버 플밍이 되어 있어야 한다는 말이다.

관계가 없는 상대는 당연히 정상적으로 ip =>전송=>응용 으로 처리하려 할 것이므로 예를들어 tracert 같은 경우 변칙적으로 전송헤더 즉 UDP 포트번호를 만들어 보내면 상대방 커널은 이 포트번호로 연결된 fd 를 찾으려 하는데 보통 무효한 번호이므로
'포트도달불가' 라는 ICMP 패킷을 보내고 사용자데이타는 드랍해버린다.
즉 커널 icmp 루틴에서 나오는 ping 과 커널 전송계층을 호출하려다가 실패한 시스템에서 보내는 icmp 메세지 차이를 이용한 트릭이다.여기에 TTL 을 추가해 tracert 가 완성된다.

2. ARP 는 커널 넷트웍계층 중 일부 그러니까 ipv4,ipv6 와 같은 계층이므로 당연히 커널이 처리하는것이며 그 말은 ARP 캐시리스트에 대응되는게 없으면 원래 사용자가 보낸 패킷은 홀딩시키고 FF:6개 맥 브로드캐스팅 주소를 적어 ARP 프로토콜 패킷을 따로 하나 커널 스스로 만들어 전송하고 이 리턴값을 보고 원래 사용자 패킷에 헤더를 만들어 붙여 전송한다는 말이다.
즉 ARP 가 어떻게 동작하는지 과정을 보는 것은 좋으나 ARP 전체를 제어하는 것은 랜카드를 통해 skb 에 넘어오는 원시 패킷에서 ethertype 필드값이 0x0806 인 순간 부터의 커널 진입루틴을 폐기하고 이 값에 맞는 루틴을 커널모듈에 추가하는 방법밖에 없다.
모든 SAN 스토리지는 이 원리로 동작하며 그 말은 ethertype 값을 보고 커널이 호출하려는 루틴을 바꿔버리면 얼마든지 ARP,IPV4,IPV6 등 tcp/ip 를 무시한 시스템 구축이 가능하다는 말이며 물론 클라이언트는 맥헤더 ethertype 를 약속된 것으로 사용해야 한다.

-생소켓을 통한 어떤 플밍을 하든 응용이 받는 데이타그램은 skb 사본이다.커널 원본은 커널 원래의 상위 계층 호출을 시도한다.
여러 모니터링이나 스니핑 ping 변형 프로그램의 원리는 다 같다.즉 사본을 보고,원본은 무효한 전송계층 헤더를 조작해서 리턴값 분석.

libpcap
이라는 tcpdump 에서 개발해 배포하는 라이버러리를 볼 것.

귀하가 시도하는 것은
커널이 하는 것을 커널수정없이 사용자가 하려는 시도가 있고
개념이 얽힌 부분이 있어 좀 정리 후 해보실 것을 추천드려요.
그리고 고수님에게 질문하면 하수는 대답하기 망설여지는데요...
전 심지어 13 년째 pc 없이 산답니다.하수중에 하수죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.