동일 PC의 Windows에서 동일 PC에 설치된 Vitrualbox의 Ubuntu 간에 ping이 안될때


※ 전제조건 : 동일 Windows PC상에 Virtualbox가 설치되어 있다고 가정한다.


소켓통신 프로그램을 개발하거나 이더넷 통신... 등등을 개발하다보면 실제 장비와 하기 전에 테스트 차원에서 Virtualbox의 리눅스와 PC간에 통신 프로그램을 개발하는 경우들이 있다.

이때 통신이 정상적인 상태인지를 체크하기 위해 보통은 ping으로 테스트하는 경우가 있다.


아래와 같이 리눅스의 터미널 창에서 PC쪽으로 ping을 날리거나 반대로 PC의 DOS창(커맨더 창)에서 Virtualbox 쪽으로 ping을 날림을 통해서 네트워크 연결 상태를 체크하게 된다.


ping 192.168.211.105


이러한 상황에서 

① 양방향 모두 ping 전송 실패하거나

② PC에서 Virtualbox 쪽으로는 가능하나 그 반대는 안되는 경우

에 대해서 살펴본다.


다른 네트워크 설정 상태가 정상임에도 위 ①의 경우가 발생한다면 우선적으로 Virtualbox의 네트워크 설정 상태를 NAT에서 브릿지 어댑터로 변경해 주어야 한다.

아래 그림과 같이 설정 - 네트워크 - 어댑터1 - 다음에 연결 항목에 있는 NAT를 브릿지 어댑터로 변경한 후 Virtualbox를 재시작한다.



위 ②번의 경우는 아마도 리눅스(여기서는 Ubuntu)의 네트워크 환경 설정 중에서 gateway를 잘못 설정했을 경우에 발생하는 현상이다. 그러나 네트워크의 경우는 워낙 다양한 변수들이 있기에 항상 정답이 될수는 없다.

이 경우 gateway를 올바로 설정하기 위해서는 우선 gateway의 ip 주소를 알아야 한다.

PC의 DOS창을 열어서 ipconfig 명령을 실행하면 아래와 같은 정보를 얻었다면 여기서 "기본 게이트웨이"에 있는 ip를 Ubuntu의 gateway로 설정해 주면 된다.


   연결별 DNS 접미사. . . . :

   링크-로컬 IPv6 주소 . . . . : fe80::84aa:fa63:4a5f:23a2%12

   IPv4 주소 . . . . . . . . . : 192.168.219.186

   서브넷 마스크 . . . . . . . : 255.255.255.0

   기본 게이트웨이 . . . . . . : 192.168.219.1


/etc/network/ 디렉토리 아래에 interfaces라는 파일을 열어서

아래 예시와 같이 gateway의 값을 지정한 후 파일을 저장한다.


auto enp0s3

iface enp0s3 inet static

address 192.168.219.115

netmask 255.255.255.0

gateway 192.168.219.1

dns-nameserver 8.8.8.8 8.8.4.4


이후 다음 명령어로 네트워크 장비를 재시작한다.


ip addr flush enp0s3 && /etc/init.d/networking restart



네트워크 연결 상태를 체크할 때 가장 손쉬운 방법이 ping을 통해서 테스트해 보는 방식이다.

그런데 윈도우쪽에서 다른 쪽으로 ping이 정상적으로 전송되는데 반대로

그 다른 쪽에서 윈도우쪽으로는 ping이 불가능할 때가 있다.

이때 콘솔 창(DOS 창)을 관리자 권한으로 연 후 아래 명령어를 입력하면 해결 끝


netsh advfirewall firewall add rule name="ICMP Allow" protocol=icmpv4:8,any dir=in action=allow


관련된 자세한 정보를 볼려면


netsh advfirewall firewall show rule name="ICMP Allow" dir=in type=dynamic



ping을 통해서 네트워크 연결 상태 체크하기 - 안드로이드 소스 코드에서


Runtime runTime = Runtime.getRuntime();


String host = "192.168.0.13";

String cmd = "ping -c 1 -W 10 "+host; //-c 1은 반복 횟수를 1번만 날린다는 뜻

Process proc = null;


try {

proc = runTime.exec(cmd);

} catch(IOException ie){

Log.d("runtime.exec()", ie.getMessage());

}


try {

proc.waitFor();

} catch(InterruptedException ie){

Log.d("proc.waitFor", ie.getMessage());

}


//여기서 반환되는 ping 테스트의 결과 값은 0, 1, 2 중 하나이다.

// 0 : 성공, 1 : fail, 2 : error이다.

int result = proc.exitValue();


if (result == 0) {

Log.d("ping test 결과", "네트워크 연결 상태 양호");

} else {

Log.d("ping test 결과", "연결되어 있지 않습니다.");

}



※ ping 명령어 옵션들


-4, -6 Force IPv4 or IPv6 hostname resolution

-c CNT Send only CNT pings

-s SIZE Send SIZE data bytes in packets (default=56)

-I iface/IP Use interface or IP address as source

-W timeout Seconds to wait for the first response (default:10)

                (after all -c CNT packets are sent)

-w deadline Seconds until ping exits (default:infinite)

                (can exit earlier with -c CNT)

-q               Quiet, only displays output at start and when finished


안드로이드의 기반이 리눅스이기 때문에 DOS에서의 ping 명령어 옵션과는 약간의 차이가 있다.


-c 옵션은 ping을 날릴 횟수이다.

-W 옵션은 ping을 날린 이후 리턴 결과를 기다릴 timeout 시간 값이다. 연결 상태가 끊겼거나 연결 상태가 좋지 않을때 이 대기 시간 동안 응답이 없으면 연결 실패로 간주한다.


위의 옵션들은 대소문자를 구분한다.

따라서 ping -C xxx.xxx.x.x는 잘못된 사용법이다.






ping을 통해서 네트워크 연결 상태 체크하기 - 커맨더 창(DOS 창)에서


예를들어서 내 PC에서 폰의 연결 네트워크 상태를 체크할려면 우선 내 폰의 IP를 알아야 한다.

폰의 IP가 192.168.0.12이라고 할 경우


D:\>ping -n 5 192.168.0.12


여기서 -n은 ping을 날릴 횟수를 의미한다. 여기서는 5회.

아래 그림과 같은 결과를 보이면 정상적으로 연결된 상태이다.




만일 DDNS가 살아있는지 연결 상태를 체크하고자 한다면

(DDNS가 mycom.iptime.org라고 한다면)


D:\>ping mycom.iptime.org

를 하면 위의 이미지와 같은 결과를 보이면 네트워크가 정상적으로 연결된 상태이다.


+ Recent posts