NAT에 대해서 질문입니다

rpit1412의 이미지

안녕하세요

NIC 2개를 iptables로 연결시켜놨습니다

하나는 tap0(7.0.0.2)
다른 하나는 usb0(10.42.0.1)

지금 연결되어있는 구조가 대충

Android[rndis0(10.42.0.73)]---(usb connect)---Linux[usb0(10.42.0.1)]---Linux[tap0(7.0.0.2)]---NS3[(7.0.0.3)]

이런식으로 되어있구요

연결은 리버스테더링으로 안드로이드와 리눅스를 연결 해놓았고

지금 iptables 설정을보면
*filter
-A INPUT -i usb0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i usb0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i usb0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i usb0 -p tcp -m tcp --dport 53 -j ACCEPT
-A FORWARD -d 10.42.0.0/24 -o usb0 -m state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.42.0.0/24 -i usb0 -j ACCEPT
-A FORWARD -i usb0 -o usb0 -j ACCEPT
-A FORWARD -o usb0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i usb0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i usb0 -j ACCEPT
-A FORWARD -o usb0 -j ACCEPT
-A FORWARD -i tap0 -j ACCEPT
-A FORWARD -o tap0 -j ACCEPT

*nat
-A POSTROUTING -s 10.42.0.0/24 ! -d 10.42.0.0/24 -j MASQUERADE
-A POSTROUTING -o tap0 -j MASQUERADE

이렇게 되어있습니다

여기서 테스트를 해보려고 안드로이드 내부에서 7.0.0.3으로 핑을 보내봤는데
패킷을 찍어보니까

usb0에서는 src 10.42.0.73 dst 7.0.0.3
tap0에서는 src 7.0.0.2 dst 7.0.0.3
으로 패킷이 가는데

안드로이드 내부에서 tap0로 핑을 보내면
tap0에서는 ICMP패킷이 관찰되지가 않습니다
근데 usb0에서는 ICMP reply 패킷이 돌아오고있구요

destination이 밖으로 나가야지만 주소가 translate되서 볼수있는건지..
왜이런건지 이해가 잘 안되네요..
아시는분 좀 알려주세요

chanik의 이미지

SNAT는 라우팅이 발생된 이후, 패킷을 밖으로 내보내기 직전에 적용됩니다.
그래서 -A POSTROUTING -o tap0 -j MASQUERADE 규칙에서 볼 수 있듯이
(SNAT를 내포하는) MASQUERADE 정책이 (문자그대로 라우팅 이후를 의미하는) POSTROUTING 체인에 설정되는 것이고요.

MASQUERADE는 라우팅뒤에 나가는 패킷에 SNAT를 수행하여 내보내고
응답패킷이 들어오면 라우팅전에 SNAT의 역변환에 해당하는 DNAT를 수행하는 일을 합니다.

'안드로이드 내부에서 tap0로 핑을 보내'는 것이 10.42.0.73 --> 7.0.0.2 로 보내는 것이라면,
이 패킷의 목적지는 리눅스 자신인 셈이므로 라우팅을 거칠 필요가 없고
라우팅 이후단계인 SNAT 역시 일어나지 않게 됩니다.

rpit1412의 이미지

아!!
이해했습니다!
답변 감사드립니다 ^^

rpit1412의 이미지

그럼 저상태에서

안드로이드(rndis0)에서 tap0에서 SNAT 안거치고 패킷을 보내면
라우팅테이블을 어떻게 수정해야할까요..?

밖으로 나가는건 POSTROUTING 으로 지나가게 되는데
rndis0에서 tap0으로 직접 보낼수있게 하는방법은 없을까요?

chanik의 이미지

원하시는 바가 무엇인지 제가 정확히 이해하지는 못하겠습니다만,
안드로이드가 NS3를 거쳐 외부IP와 통신하는 경우에만 tap0에서 NAT가 일어나게 하고
안드로이드와 NS3가 직접 통신하는 경우에는 NAT 없이 tap0를 통과시키려는 것인가요?

Android[rndis0(10.42.0.73)]---(usb connect)---Linux[usb0(10.42.0.1)]---Linux[tap0(7.0.0.2)]---NS3[(7.0.0.3)]

그렇다면 위와 같은 구성에서, iptables는 아래와 같은 식으로 설정하고,

*filter
-A FORWARD -i usb0 -o tap0 -j ACCEPT
-A FORWARD -i tap0 -o usb0 -j ACCEPT
-A INPUT -i usb0 -j ACCEPT
-A INPUT -i tap0 -j ACCEPT
 
*nat
-A POSTROUTING -o tap0 -s 10.42.0.0/24 ! -d 7.0.0.0/24 -j MASQUERADE

NS3 내부에는 아래와 같은 route entry를 넣어서,
안드로이드 쪽으로 가야할 패킷은 모두 리눅스에게 떠넘기도록 설정하면 되지 않을까 싶습니다.
( NS3 내부의 NIC 이름이 eth0 이라고 가정했음 )

$ ip route add 10.42.0.0/24 via 7.0.0.2 dev eth0

테스트까지는 해보지 않았습니다. iptables 규칙은 간단히 줄였습니다.
우선 돌아가는 골격부터 확인하고, 세세한 규칙은 실험해보며 추가하시면 될 것입니다.

그리고 위의 설정은 아래와 같은 가정을 전제했다는 점도 참고하십시오.

  • 안드로이드의 기본게이트웨이는 10.42.0.1
  • 리눅스의 기본게이트웨이는 7.0.0.3
  • NS3는 인터넷 접근이 가능하고 인터넷 공유기능을 가진 장치(?)
rpit1412의 이미지

정확히 하고자하는걸 정리하자면

Android[rndis0(10.42.0.73)]---(usb connect)---Linux[usb0(10.42.0.1)]---Linux[tap0(7.0.0.2)]---(tapbridge)---NS3[[7.0.0.2]---NS3 node[(7.0.0.3)]]

NS3와 Linux는 tap으로 연결되어있구요

Android(rndis0:10.42.0.73)에서 NS-3내부에 있는 7.0.0.3의 아이피를 가진 노드와 패킷통신을 하려고 함(안드로이드 어플리케이션 만들어서 UDP패킷을 전송)

먼저 패킷이 움직이는걸 확인하면 rndis0에서 usb0으로 패킷이 나오게되고
그 패킷을 각 인터페이스에서 확인하게되면

rndis0 : src 10.42.0.73 / dst 7.0.0.3
-> usb0 : src 10.42.0.73 / dst 7.0.0.3 (iptable에 의해 NAT로 src주소가 tap0의 주소로 바뀜)
-> tap0 : src 7.0.0.2 / dst 7.0.0.3
-> NS-3 내부에 있는 ghostnode에 패킷이 넘어감.(tap0로 패킷이 들어오면 자동으로 forwarding)이 노드의 주소도 7.0.0.2 /// ghostnode에서의 패킷 (src 7.0.0.2 / dst 7.0.0.3)
-> NS-3 내부의 다른 노드(7.0.0.3)으로 패킷 전송 /// dst node의 패킷 (src 7.0.0.2 / dst 7.0.0.3)

7.0.0.3에는 UDP Echo Server를 구동시켜놔서 받은 패킷을 그대로 돌려줍니다

반대의 경로를 보면
NS-3 에서 tap0까지는 패킷이 잘 나옵니다 (src 7.0.0.3/ dst 7.0.0.2)
근데 tap0에서 usb0로는 패킷이 안가는군요

tap0에서의 패킷캡쳐를 보면 usb0의 MAC 주소를 몰라서그런지 ARP패킷이 전달되고
response를 못받아오네요

이걸 usb0(10.42.0.1)을 통해서 rndis0(10.42.0.73)으로 보내고싶은데..

iptables을 보면 일단
-A INPUT -i usb0 -j ACCEPT
-A INPUT -i tap0 -j ACCEPT
-A FORWARD -d 10.42.0.0/24 -o usb0 -m state --state RELATED, ESTABLISHED -j ACCEPT
-A FORWARD -s 10.42.0.0/24 -i usb0 -j ACCEPT
-A FORWARD -i usb0 -o tap0 -j ACCEPT
-A FORWARD -i tap0 -o usb0 -j ACCEPT
-A POSTROUTING -o tap0 -s 10.42.0.0/24 ! -d 10.42.0.0/24 -j MASQUERADE

다시금 조언 부탁드립니다..

chanik의 이미지

NAT가 이뤄질 때 UDP 응답이 되돌아오지 못하는 것은 자연스러운 일입니다.
TCP나 ICMP ping 응답은 NAT를 거쳐도 잘 되돌아오지만 UDP 응답은 그렇지 못합니다.

안드로이드와 NS-3 사이에 NAT 없는 패킷중계가 일어나면
TCP/ICMP/UDP 모두 양방향으로 패킷 전달이 자유롭게 이뤄질 것입니다.
제 이전 답변이 바로 그런 의도로 만들어진 것이었습니다.
제가 적었던 iptables 규칙 행간에 간단한 주석을 추가해 봤습니다.
iptables에 대한 제 이해가 깊지는 못하므로 의도와 다른 결과가 나올 가능성이 걱정되긴 하네요.

*filter
# 안드로이드로부터 NS-3로 가는 패킷포워딩 허용
-A FORWARD -i usb0 -o tap0 -j ACCEPT
# NS-3로부터 안드로이드로 가는 패킷포워딩 허용
-A FORWARD -i tap0 -o usb0 -j ACCEPT
-A INPUT -i usb0 -j ACCEPT
-A INPUT -i tap0 -j ACCEPT
 
*nat
# 안드로이드에서 NS-3 쪽으로 나가는 패킷 가운데 목적지가 NS-3가 아닌 패킷들에 대해서만 NAT 적용.
# 즉, NS-3를 거쳐 인터넷으로 나가는 패킷들만 NAT 적용하고, 목적지가 NS-3인 패킷은 NAT 없이 포워딩.
# 만약 NS-3가 인터넷 공유를 해 주는 장치가 아니라면 아래 규칙 자체를 빼버려도 됨.
-A POSTROUTING -o tap0 -s 10.42.0.0/24 ! -d 7.0.0.0/24 -j MASQUERADE

주의하실 점은, NS-3는 10.42.0.0/24 망으로 패킷을 전송할 방법을 모르므로
이전 답변에 있는대로 10.42.0.0/24 망에 대한 route entry를 따로 추가하시거나,
아예 NS-3의 default gateway를 7.0.0.2 로 설정해 주기라도 하셔야 합니다.

rpit1412의 이미지

도움많이받고있습니다 ^^

오만방법으로 다해도 tap0에서 usb0로 패킷이 돌아오질않네요..

리눅스에서는 NAT 빼고 그냥 forwarding으로

-A INPUT -i usb0 -j ACCEPT
-A INPUT -i tap0 -j ACCEPT
-A FORWARD -i usb0 -o tap0 -j ACCEPT
-A FORWARD -i tap0 -o usb0 -j ACCEPT

이것만 설정해놓고 해보았습니다

NAT는 NS-3에서 해주는걸로 해보았습니다. 패킷이 시뮬레이터에 들어가면 NAT실행해서 tap0으로 나올수있는 노드로 패킷이 돌아올수있게 Address Translation시켜주는방식으로..

문제는 tap0으로 들어갔다가 나오는 패킷이 usb0까지 가지 않는다는겁니다.

iptables -L -v 를 통해 해당 룰의 패킷 카운터를 해보면

-A FORWARD -i usb0 -o tap0 -j ACCEPT 여기는 카운터가 정상적으로 올라가는데
-A FORWARD -i tap0 -o usb0 -j ACCEPT 여기는 카운터가 아예 올라가지 않는군요

routing 설정은
*Linux
7.0.0.0/24 dev tap0 proto kernel scope link src 7.0.0.2
10.42.0.0/24 dev usb0 proto kernel scope link src 10.42.0.1 metric 1
*Android
default via 10.42.0.1 dev rndis0
10.42.0.0/24 dev rndis0 proto kernel scope link src 10.42.0.73

이렇게 설정되어있습니다.

tap0으로 들어오는패킷을 단순히 usb0로 포워딩만 해주면 될거같은데
usb0는 tap0로 포워딩되면서 반대로는 왜 안되는지 이해가 안되네요..

아. 리눅스 자체의 인터넷은 연결이 아예 안되어있습니다.
Android와 NS-3의 패킷교환만 되면 되기때문에
이외의 모든 연결은 끊어놓은상태입니다.

chanik의 이미지

문제가 되는 것은 NAT인것 같습니다.
안드로이드에서 NS-3로 UDP 패킷을 보내고 응답을 받으려면 아래와 같은 과정이 일어나게 됩니다.

  1. 안드로이드로부터 NS-3로 UDP 패킷 송신. (src:10.42.0.73 -> dst:7.0.0.2)
  2. 목적지 주소(7.0.0.2)가 안드로이드의 서브넷(10.42.0.0/24)에 속하지 않으므로 스스로 처리하지 못하고 디폴트 게이트웨이(리눅스:10.42.0.1)에게 라우팅을 떠넘김.
  3. 게이트웨이인 리눅스는 패킷목적지(7.0.0.2)가 자신이 아님을 알아내고 라우팅 시도. 목적지가 tap0 쪽의 서브넷에 해당하는 것을 알아내고 tap0로 내보냄. (src:10.42.0.73 -> dst:7.0.0.2)
  4. NS-3에서 해당 패킷 수신. 패킷 목적지가 자기 자신이므로 UDP ECHO 프로세스에게 데이터 전달. (src:10.42.0.73 -> dst:7.0.0.2). 여기까지는 잘 되고 있죠.
  5. UDP ECHO 프로세스에서 패킷 발신지(10.42.0.73)쪽으로 응답패킷 송출. (src:7.0.0.2 -> dst:10.42.0.73)
  6. 10.42.0.73 주소는 NS-3 자신의 서브넷에 속하지 않으므로 직접 해결하지 못하고 누군가에게 떠넘겨야 함. 라우트 테이블을 뒤지기 시작함. 10.42.0.73/24 망에 대한 라우트 엔트리가 있으면 그대로 실행. 만약 그런 라우트 엔트리가 없다면 디폴트 게이트웨이 쪽으로 떠넘김. (이런 이유때문에 NS-3에 10.42.0.73/24 망에 대해 리눅스쪽으로 보내도록 라우트 엔트리가 추가되거나, 리눅스를 디폴트 게이트웨이로 설정해야 하는 것임)
  7. 리눅스는 tap0를 통해 UDP 응답패킷을 수신. 목적지가 자신이 아님을 알아내고 usb0 쪽으로 라우팅. (src:7.0.0.2 -> dst:10.42.0.73)
  8. 드디어 안드로이드에서 UDP 응답패킷 수신. (src:7.0.0.2 -> dst:10.42.0.73)

UDP만을 예로 들었지만 TCP, ICMP 모두 마찬가지 과정을 거칩니다.
이런 과정이 성립하려면 NS-3에서도 NAT가 없어져야 합니다.

NS-3 내부에서 NAT를 하지 않도록 변경하시고, NS-3에 10.42.0.0/24 망에 대해 리눅스를 거치도록
route entry 추가 또는 아예 default gateway 로 리눅스IP(7.0.0.2)를 설정해 주시면 해결될 것입니다.

rpit1412의 이미지

좀더 빠른 이해를 위해 그림을 첨부해서 chanik님의 글을 빌려 프로세스를 다시 정리해보았습니다.

1. 안드로이드로부터 NS-3로 UDP 패킷 송신(src:10.42.0.73 -> dst:7.0.0.3)
2. 목적지주소(7.0.0.3)가 안드로이드의 서브넷(10.42.0.0/24)에 속하지 않으므로 스스로 처리하지 못하고 디폴트 게이트웨이(리눅스:10.42.0.1)에게 라우팅을 떠넘김
3. 게이트웨이인 리눅스는 패킷목적지(7.0.0.3)가 자신이 아님을 알아내고 라우팅 시도. 목적지가 tap0쪽의 서브넷에 해당되는 것을 알고 tap0로 내보냄(10.42.0.73 -> dst:7.0.0.3)
4. NS-3에서 tap-bridge를 통해 해당 패킷 수신. 패킷 목적지가 7.0.0.3 이므로 해당 목적지로 패킷 전송.
5. 이 과정에서 패킷발신주소(10.42.0.73)이 목적지에 도착하면 응답패킷이 라우트엔트리에 없기때문에 패킷이 NS-3로 들어오자마자 tap-bridge에서 src adress translation 실행 (src:10.42.0.73~>7.0.0.2 -> dst:7.0.0.3)
6. 패킷이 해당목적지에 도착하면 UDP ECHO Server에서는 패킷 발신지(7.0.0.2)쪽으로 응답패킷 송출(src:7.0.0.3 -> dst:7.0.0.2)
7. 응답패킷이 ghost node(7.0.0.2)에 도착하면 처음 패킷발신주소(10.42.0.73)를 tap-bridge에서 dst address translation 실행 (src:7.0.0.3 -> dst:7.0.0.2~>10.42.0.73)
8. 응답패킷이 tap-bridge를 통해 tap0로 빠져나옴.(src:7.0.0.3 -> dst:10.42.0.73)

9. 리눅스는 tap0를 통해 나온 패킷의 목적지가 자신이 아님을 알고 usb0쪽으로 라우팅.(src:7.0.0.3 -> dst:10.42.0.73)
10. 패킷의 목적지 주소가 usb0의 서브넷에 해당되는 것을 알고 안드로이드의 rndis0으로 내보냄
11. 안드로이드의 rndis0에서 패킷 수신(src:7.0.0.3 -> dst:10.42.0.73)

8번까지는 정상적으로 다 동작하고
9번부터 안되는건데 저 시나리오에서도 NS-3내부의 NAT를 없애야하는게 맞는건가요?
NS-3 내부에서 NAT구현은 실제 구현되어있는 NAT가 아닌 tap-bridge 내에서 리눅스로 패킷을 주고받는 시점에서 간단하게 ip헤더 떼고 주소만 바꿔주게 간단하게 코딩했습니다.
NS-3에 패킷이 들어갔다가 나오는게 아무 이상도 없기때문에 저는 NS-3의 NAT가 문제가아니라
리눅스의 라우팅테이블이나 iptables문제가 아닐까 생각합니다.
iptables에서 FORWARD 규칙이 제대로 들어갔는데도 안되고
라우팅테이블에서 default gateway를 usb0/tap0의 IP 주소로 각각 따로 설정해봤는데도
꿈쩍도 하지않네요..
저 패킷이 어떻게든 usb0까지만 도착하면 알아서 rndis0로 갈텐데..

댓글 첨부 파일: 
첨부파일 크기
Image icon usbtap.png22.1 KB
chanik의 이미지

NS-3 내부에서의 NAT가 그런 형태라면,
리눅스 입장에서는 NS-3 안에서 NAT가 일어난다는 것을 알 수 없는 투명한 사건이므로
말씀하신대로 NS-3 내부의 NAT는 문제의 원인이 아닌 것 같고, 굳이 끄지 않아도 되겠습니다.

----

8번까지 된다고 말씀하실때, 리눅스에서 tap0를 패킷캡처 해보면
(src:7.0.0.3 -> dst:10.42.0.73)인 UDP 응답패킷이 리눅스로 들어오고 있나요?

패킷이 들어오고 있는데도 usb0로 전달이 안되는 것이라면 저로써는 더 생각나는 것이 없네요..

하지만 제가 보기에는 7번의 NAT까지는 이뤄져도 8번의 tap0를 통한 리눅스로의 도착은 이뤄지지 않고 있을 것 같습니다.
이전에 말씀드린대로, NS-3에서 10.42.0.73/24 망으로의 라우트 엔트리가 7.0.0.2 쪽으로 잡혀 있거나,
또는 NS-3의 디폴트 게이트웨이가 7.0.0.2로 잡혀있는지요?

rpit1412의 이미지

8번까지의 과정은 아무 문제없이 됩니다.
NS-3내에서 돌아오는 패킷이 tap-bridge까지만 넘어오면 라우팅 테이블에 관계없이 NS-3는 LinuxHost로 패킷을 넘겨주는 함수를 호출하게됩니다.
그런원리로 7.0.0.2까지만 패킷이 도착해도 아무런 과정없이 리눅스로 패킷이 들어오게됩니다.
이걸로 라우팅테이블도 별 문제없다는게 확인되는거같구요

리눅스에서 tap0를 패킷캡쳐 해봐도
src:7.0.0.3 -> dst:10.42.0.73 인 UDP 패킷이 정상적으로 출력됩니다.

머리아프네요

당연히 되어야 할 iptables의 규칙이 적용되지 않는걸 곰곰히 생각해보다가

문득 떠오른 현상중에 하나가

예를 들면 ping을 tap0에서 usb0로 보낸다면
ping -I tap0 10.42.0.1 이런식으로 핑을 보냅니다.
그렇다면 ICMP 패킷이나 ARP 패킷이 usb0로 흘러가야할텐데
ping 을 실행했을 때의 패킷은 usb0가 아닌 NS-3쪽으로 흘러가버립니다.

NS-3에서 tap-bridge라는걸 사용해서 리눅스와 NS-3의 인터페이스를 연결하는데
ReceiveFromBridgedDevice라는 함수와 ForwardToBridgedDevice라는 함수를 사용합니다.
이름만봐도 알수있듯이 BridgedDevice에서 패킷을 Received하고, Forward해주는 함수입니다. BridgedDevice는 tap0가 아닌 NS-3와 리눅스가 연결되어있는 노드입니다. 이 함수를 호출하기위해선 콜백함수가 돌고있구요

NS-3에서 Linux Host로 패킷을 전송하는 과정이 라우팅이라면 iptables의 규칙에 맞게 포워딩을 해줄텐데, 함수를 대충 보니까 tap-bridge 노드에 있는 패킷을 write해서 tap0으로 내보내는 기능을 하는거같습니다.
이런 방법이라면 iptables 에서의 규칙은 아무 소용없게 되는거 아닌가요?

짧은 지식으로 생각해봤는데 이게 맞는건지 모르겠네요..

저게 맞다면 iptables는 무용지물이 되어버리고 따로 프로그래밍으로 패킷을 임의로 컨트롤해서 tap0->usb0이 가능할런지..

chanik의 이미지

제가 NS-3 시뮬레이터에 대해 모르다보니 NS-3 내부에 대한 대화는 어렵겠습니다..

일반적으로 A와 B가 통신을 할 때, 아시다시피 A에서 보낸 패킷이 B에 도달하게 하는 것과 B에서 보낸 패킷이 A에 도달하게 하는일은 완전히 별개의 문제입니다. 지금은 A에서 B로는 패킷이 도달하는데, B에서 A로는 패킷이 도달하지 못하고 있죠. 이런 상황에서는 최대한 간단한 구성을 써서 기본적인 동작부터 확인해야 합니다.

지금의 NS-3 내의 NAT는 한 가지 문제를 내포하는 것 같습니다. 아래 두 경우에 대한 구분이 불가능하다는 것입니다.

- 안드로이드가 보낸 UDP 패킷에 대해 NS-3가 응답하는 경우 (src: 10.42.0.73, dst: 7.0.0.3)
- 리눅스가 보낸 UDP 패킷에 대해 NS-3가 응답하는 경우 (src: 7.0.0.2, dst: 7.0.0.3)

위 두 경우에 대한 NS-3의 응답은 항상 (src: 7.0.0.3, dst: 7.0.0.2) 이 될 것이고, tab bridge를 거치면서 DNAT가 발생하여 무조건 (src: 7.0.0.3, dst: 10.42.0.73) 으로 바뀌어 안드로이드를 향하게 되겠죠. 누가 보낸 패킷에 대해서든 무조건 안드로이드에게 응답하게 되는 이런 결과는 하드코딩에 가까운 NAT를 쓰기 때문일텐데, 바람직한 결과는 아닐 것입니다.

NAT를 배제하고 NS-3 내의 라우팅 테이블을 적절히 설정하게 되면 이런 하드코딩을 쓰지 않아도 되고, 안드로이드와 리눅스 어떤 것과도 통신이 가능해지는 유연성을 얻게 됩니다.

먼저 이런 단순한 환경에서 양방향으로의 패킷 전달을 확인해 보고 나서, NAT는 추후 필요에 따라 추가해보시면 어떨까 싶습니다.

rpit1412의 이미지

iptable, routing table, NS-3쪽 모두 많은 시도를 해보았는데
설정이나 다른 문제에 대해서는 이제 의심이 없는데...

다른문제에 대해 고민을 해봐야 할것 같습니다.

아무래도 tap0가 가상 인터페이스이고 tap-bridge를 통한 통신이다보니
..
도와주셔서 감사합니다!

chanik의 이미지

안드로이드를 배제하고, 리눅스와 NS-3 간의 직접통신은 가능한가요?
즉, (src: 7.0.0.3, dst: 7.0.0.2) 인 UDP 응답패킷이 리눅스에서 수신되는지
패킷캡처를 통한 확인 말고 UDP 소켓을 통한 recv가 이뤄지는지 확인해 보셨는지요?

일단 이 통신이 가능하면 지금 의심하시는 tap0 - tab-bridge를 통한 양방향 패킷흐름이 검증되겠군요.

(그리고, 이 통신을 위해서는 NS-3 내부의 NAT는 불필요하고, 오히려 방해가 되겠군요)

rpit1412의 이미지

아 답을 달았어야하는데 이제야 다네요..
생각보다 사소한문제였습니다
NS3에서 나오는 패킷의 MAC address가 이상하게 꼬여있었어요 이거 풀어주니까 통신 잘 되었습니다. (__)

chanik의 이미지

잘 해결되었다니 다행입니다. ^^

그리고, 게시물을 끝까지 챙겨주시니까 좋군요. 글 올려놓고 나몰라라 하는 경우도 많은데, 다들 rpit1412님처럼 자기가 올린 게시물에 신경을 쓰면 좋겠다는 생각이 듭니다.

rpit1412의 이미지

도와주시는 분들이 있기에 마무리도 잘해야죠 ^^
앞으로도 많은 조언&도움 부탁드리겠습니다

댓글 달기

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