안녕하세요 멀티캐스트 관련 질문입니다.

rpit1412의 이미지

NS-3 를 이용해서 안드로이드까지 멀티캐스트 패킷을 보내려고합니다.

첨부파일에 그림을 첨부했습니다..

패킷을 보내는 src는 NS-3 내부의 remoteHost이고 multicast packet의 dst 는 255.1.2.4입니다.

tap device인 tap0을 통해서 안드로이드 usb테더링의 인터페이스인 usb0으로 패킷이 전달된 후에
안드로이드 내부의 어플리케이션을 통해서 다른 안드로이드로 패킷이 전송되는형태로 진행이 되어야합니다.

NS-3 내부에서는 각 enb가 멀티캐스트 그룹에 가입해서 패킷이 tap device까진 옵니다.
리눅스의 tap0까지 패킷이 오는거까진 성공했는데
여기서 usb0로 패킷을 보내는게 문제입니다.

tap을 통해서 리눅스로 나온 패킷은 src : 1.0.0.2, dst : 255.1.2.4이고
tap0 인터페이스의 ip는 7.0.0.2입니다.

여기서 의문점중에 하나가 dst가 멀티캐스트주소면 MAC address도 multicast의 MAC주소이지 않나요? 그렇다면 이걸 어떤주소로 설정을 해야할지 모르겠네요.. NS3에서 리눅스로 tap을통해 나오는 패킷의 dst MAC이 tap0의 MAC인게 좀 걸리네요.

또, tap0를 통해서 나온 패킷을 NAT도 적용시켜보고 forwarding도 시켜보았는데 전혀 진척이 없었구요

이제 다른방법이 뭐가있을까요?;

1. tunneling을 해야하는건지.. ??
2. 아니면 리눅스 자체에서 225.1.2.4를 멀티캐스트 그룹에 join하는 방법은 뭐가있을까요?

짧은 지식에 이것저것 해보려니 빡세네요.. 고수님들의 조언 부탁드립니다.

File attachments: 
첨부파일 크기
Image icon mcast.png26.16 KB
chanik의 이미지

Quote:
여기서 의문점중에 하나가 dst가 멀티캐스트주소면 MAC address도 multicast의 MAC주소이지 않나요? 그렇다면 이걸 어떤주소로 설정을 해야할지 모르겠네요.. NS3에서 리눅스로 tap을통해 나오는 패킷의 dst MAC이 tap0의 MAC인게 좀 걸리네요.

tap0를 통해 linux로 패킷을 내보낼때, 멀티캐스트 패킷의 경우는 목적지MAC을 손대지 말고 멀티캐스트 MAC으로 유지하도록 예외처리하면 되지 않을까요?




그리고, http://serverfault.com/a/257431 를 보니, 리눅스에서 NIC 간에 멀티캐스트 패킷 전달을 하려면 iptables만으로는 안 되는 모양입니다. /proc/sys/net/ipv4/conf/*/mc_forwarding 값들이 켜져야 하는데, 제가 쓰는 Linux PC를 확인해보니 아래와 같이 다 꺼져있는데다, 속성도 읽기전용으로 되어 있었습니다.

$ for i in /proc/sys/net/ipv4/conf/*/mc_forwarding; do echo -n `ls -al $i` : `cat $i`; echo; done
-r--r--r-- 1 root root 0 1118 17:45 /proc/sys/net/ipv4/conf/all/mc_forwarding : 0
-r--r--r-- 1 root root 0 1118 17:45 /proc/sys/net/ipv4/conf/default/mc_forwarding : 0
-r--r--r-- 1 root root 0 1118 17:45 /proc/sys/net/ipv4/conf/eth0/mc_forwarding : 0
-r--r--r-- 1 root root 0 1118 17:45 /proc/sys/net/ipv4/conf/eth1/mc_forwarding : 0
-r--r--r-- 1 root root 0 1118 17:45 /proc/sys/net/ipv4/conf/lo/mc_forwarding : 0

이것들이 켜지려면 아래의 조건이 필요하다고 합니다.
  1. 커널빌드시 CONFIG_MROUTE 옵션을 켜고 빌드되어야 함 (/boot/config-3.x.x 파일을 확인해보니 CentOS-5에서는 CONFIG_IP_MROUTE=y 으로 켜져 있었고, Ubuntu-12.04에서도 CONFIG_IP_MROUTE=y 및 CONFIG_IPV6_MROUTE=y 로 켜져 있었음)
  2. multicast routing daemon 이 필요함

1번은 저절로 해결되어 있었으므로 2번만 해결하면 되는데, http://troglobit.com/multicast-howto.html 을 보면 multicast routing daemon의 예로 아래의 세 가지가 나옵니다. 셋 가운데 하나만 동작시키면 되고요.

  • pimd -c pimd.conf
  • mrouted -c mrouted.conf
  • smcroute -f smcroute.conf

저는 smcroute로 해봤는데, 실행에 성공한 순간부터 eth1으로 들어오는 멀티캐스트 패킷이 eth0으로 전달되어 나가기 시작했습니다 (실은 mrouted를 먼저 해봤지만 간단한 예제가 눈에 띄지 않아 그냥 넘어가고 smcroute로 했습니다). 어쨌든, smcroute가 실행되면 앞서 보았던 값들이 아래와 같이 바뀝니다.

$ for i in /proc/sys/net/ipv4/conf/*/mc_forwarding; do echo -n `ls -al $i` : `cat $i`; echo; done
-r--r--r-- 1 root root 0 1118 17:50 /proc/sys/net/ipv4/conf/all/mc_forwarding : 1
-r--r--r-- 1 root root 0 1118 17:50 /proc/sys/net/ipv4/conf/default/mc_forwarding : 0
-r--r--r-- 1 root root 0 1118 17:50 /proc/sys/net/ipv4/conf/eth0/mc_forwarding : 1
-r--r--r-- 1 root root 0 1118 17:50 /proc/sys/net/ipv4/conf/eth1/mc_forwarding : 1
-r--r--r-- 1 root root 0 1118 17:50 /proc/sys/net/ipv4/conf/lo/mc_forwarding : 0

smcroute는 아래와 같이 빌드하고 동작시켰습니다. iptables 설정과 smcroute.conf 내용은 질문글에 올려주신 그림을 참조하여, 쓰시는 환경에 맞춰 수정했고 나머지는 과정을 최대한 그대로 올립니다. (smcroute url : ftp://troglobit.com/smcroute/smcroute-1.99.2.tar.bz2)

$ sudo sysctl -w net.ipv4.ip_forward=1
 
$ cat iptables.rules
*filter
-A INPUT -i tap0 -j ACCEPT
-A FORWARD -i tap0 -j ACCEPT
 
$ cat smcroute.conf
mgroup from tap0 group 225.1.2.4
mroute from tap0 group 225.1.2.4 to usb0
 
$ tar xjf smcroute-1.99.2.tar.bz2
$ cd smcroute-1.99.2
$ ./configure && make
$ cd ..
$ sudo smcroute-1.99.2/src/smcroute -d -f smcroute.conf

관련있다고 여겨지는 정보를 다 표시하려고 노력은 했지만, 과정을 잘 이해하며 진행한 것은 아니기 때문에 뭔가 빠진 것이 있을지도 모르겠습니다.

댓글 달기

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