[질문] Ethernet 디비이스 Promiscuous Mode일때만 통신됩니다.

skjean의 이미지

제목대로입니다.
특정 Ethernet Card에 대해서 ping을 수행하면
통신이 되질 않습니다. 그러다가 ping 대상 호스트에서
tcpdump를 실행하면 상대편에서 ping이 됩니다.
ifconfig eth0 promisc라고 설정하면 tcpdump 수행하지
않아도 ping이 됩니다. tcpdump는 디바이스를 promiscuous
모드로 만들기 때문에.. 결국 해당 Ethernet Device가
promiscuous mode일때만 정상적인 통신이 되는 꼴인데요..

이러한 현상은 왜 나타날까요?
promiscuous mode로 ethernet card를 운용하면
받아서 버려야 할 패킷이 너무 많기 때문에.. 이 모드로
설정하지 않고 쓰려고 하고 있습니다.

경험자분들의 고견을 기다랍니다.
감사합니다.

flyduck의 이미지

어떤 환경인지 설명이 없기는 한데, 일반 PC라면 보기 드문 현상이라고 하겠습니다. 네트웍 칩이 맛이 갔다고 보는 것이... :-)

임베디드 시스템이나 디바이스 드라이버를 개발하는 중이라고 한다면... 이런 현상은 MAC address 불일치 때문에 생길 수 있습니다. 모든 네트웍 장치는 자신만의 MAC address를 갖고 있고, 보통은 이를 EEPROM에 저장하고 있습니다. (사실 MAC address가 EEPROM에 있다는 것은 중요하지 않습니다.) 이와 별도로 네트웍 장치는 MAC address를 보관하는 레지스터를 갖고 있고, 네트웍을 통해서 패킷을 수신할 때 promiscuous mode가 아닌 경우에는 broadcast와 레지스터에 저장된 MAC address와 일치하는 경우에만 패킷을 받아들입니다. 그래서 다른 MAC address가 목적지인 패킷은 무시하게 됩니다.

그러면 문제가 발생할 수 있는 가능성은 두가지가 있습니다.

- MAC address가 지정되지 않았거나 잘못된 MAC address가 지정되었다. 예를 들어 EEPROM에서 MAC address를 읽어오도록 했는데 EEPROM이 없어서 (보통 네트웍 드라이버는 초기화 과정에서 EEPROM에서 MAC address를 읽어와 레지스터에 설정을 합니다.) MAC address가 모두 0이거나 multicast용 MAC address가 지정되었거나 하는 경우가 있겠죠.

- 장치의 레지스터에 MAC address가 잘못 기록이 되어 있다. 만약 소프트웨어적으로 MAC address를 설정하도록 했거나 ifconfig에 hw 옵션으로 MAC address를 바꾸어줬는데 드라이버가 이를 처리하지 않아서 이를 레지스터에 기록하지 않았을 수도 있고, 커널이 생각하는 MAC address와 다른 MAC address를 레지스터에 기록했을 수도 있습니다. 그러면 송신할 때 사용하는 MAC address가 네트웍 장치가 생각하는 것과 다르기 때문에 패킷을 수신할 수 없습니다.

해당 네트웍 장치가 어떤 MAC address를 사용하는지, 그것이 레지스터 설정과 일치하는지 확인해보세요. 그리고 정상 모드에서 broadcast packet을 수신하는지도 확인해보구요 (이건 arp table을 비우고 arp packet을 보내보면 확인할 수 있습니다).

Freedom is another word for nothing left to lose,
Nothing doesn't mean nothing if it ain't free.

emptysky의 이미지

flyduck wrote:
어떤 환경인지 설명이 없기는 한데, 일반 PC라면 보기 드문 현상이라고 하겠습니다. 네트웍 칩이 맛이 갔다고 보는 것이... :-)

임베디드 시스템이나 디바이스 드라이버를 개발하는 중이라고 한다면... 이런 현상은 MAC address 불일치 때문에 생길 수 있습니다. 모든 네트웍 장치는 자신만의 MAC address를 갖고 있고, 보통은 이를 EEPROM에 저장하고 있습니다. (사실 MAC address가 EEPROM에 있다는 것은 중요하지 않습니다.) 이와 별도로 네트웍 장치는 MAC address를 보관하는 레지스터를 갖고 있고, 네트웍을 통해서 패킷을 수신할 때 promiscuous mode가 아닌 경우에는 broadcast와 레지스터에 저장된 MAC address와 일치하는 경우에만 패킷을 받아들입니다. 그래서 다른 MAC address가 목적지인 패킷은 무시하게 됩니다.

그러면 문제가 발생할 수 있는 가능성은 두가지가 있습니다.

- MAC address가 지정되지 않았거나 잘못된 MAC address가 지정되었다. 예를 들어 EEPROM에서 MAC address를 읽어오도록 했는데 EEPROM이 없어서 (보통 네트웍 드라이버는 초기화 과정에서 EEPROM에서 MAC address를 읽어와 레지스터에 설정을 합니다.) MAC address가 모두 0이거나 multicast용 MAC address가 지정되었거나 하는 경우가 있겠죠.

- 장치의 레지스터에 MAC address가 잘못 기록이 되어 있다. 만약 소프트웨어적으로 MAC address를 설정하도록 했거나 ifconfig에 hw 옵션으로 MAC address를 바꾸어줬는데 드라이버가 이를 처리하지 않아서 이를 레지스터에 기록하지 않았을 수도 있고, 커널이 생각하는 MAC address와 다른 MAC address를 레지스터에 기록했을 수도 있습니다. 그러면 송신할 때 사용하는 MAC address가 네트웍 장치가 생각하는 것과 다르기 때문에 패킷을 수신할 수 없습니다.

해당 네트웍 장치가 어떤 MAC address를 사용하는지, 그것이 레지스터 설정과 일치하는지 확인해보세요. 그리고 정상 모드에서 broadcast packet을 수신하는지도 확인해보구요 (이건 arp table을 비우고 arp packet을 보내보면 확인할 수 있습니다).


어디서 많이 본 아이디라고 생각했더니 ㅋㅋㅋ
이호님이시네요 :)

『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』

skjean의 이미지

정말 감사드립니다.
몇번 재부팅 이후에.. MAC Device의 Register에 설정되는 MAC이
EEPROM에 있는 값으로 바뀌어 있음을 발견했습니다.
실제 저희는 OS가 살아날때, boot script에서 ifconfig hw ether로
MAC Address를 다시 설정하는데(Register 설정).. 이 부분이
잘 안되는 것 같았습니다. 어떤 경우는 잘 되고.... -.-;;

아직 해결은 못했지만... 단서를 주셔서 너무 감사드립니다.

좋은 하루 되세요~~~ ^^;;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.