Post

(python) 외부 IP 사이의 소켓 통신 GET/POST 요청 1편

(python) 외부 IP 사이의 소켓 통신 GET/POST 요청 1편

들어가며

서론

외부 IP간의 소켓 통신은 내부망에서의 통신과는 다르게 매우 복잡하다. 그 이유는 보안문제와 관련있다. 내부 망에서는 보통 192.168.0.xxx의 주소를 통해 이루어진다. 이는 Virtual Network IP인데 하나의 공유기 안에서 이루어진 주소라고 생각하면 된다. 즉, 실제로는 하나의 IP를 내부에서 192.168.0.xxx라는 형식을 통해 가상화해서 여러 IP로 나누는 방식이다. 다시 말해서 아무리 192.168.0.7192.168.0.13이 서로 소켓 통신을 한다고해서 외부망과 통신하는 것이 아닌 하나의 IP 안에서 이루어지는 통신이다. 따라서, 본인과 본인 사이에서 이루어지는 통신이므로 보안 상의 이슈가 전혀 없다.

이렇게 내부망에서 통신하기만 한다면 python에서 제공하는 socket 모듈만을 사용해서 쉽게 코드를 만들 수 있다. 하지만, 외부 IP 사이에서는 그렇지 않다.

의존성 모듈 (prerequisite)

외부 IP 사이에서는 다른 모듈을 사용해야 더 간단하고 빠르게 만들 수 있다. Python 코드를 짜기 전에 아래의 모듈들이 필요하다. 아래의 모듈들을 설치해준다.

1
2
pip3 install Flask    # or pip
pip3 install requests # or pip

환경 설정

구현환경

내가 외부 IP들 사이의 통신을 하기 위해서 서로 다른 IP를 사용하는 디바이스가 필요했다. 따라서 해당 환경을 구축하기위해, 이더넷 LAN이 연결된 데스크탑(윈도우)을 준비했으며 다른 기기로는 노트북(MacBook)을 준비했다. 특히, 노트북은 이더넷으로 연결하지 않았으며 휴대폰의 핫스팟(hotspot)을 통해서 다른 외부 IP를 갖도록 구성했다. 서버는 유선랜 사용을 권장한다.

SERVER: 데스크탑 (Window & Ethernet)
CLIENT: 노트북 (MacOS & Hotspot)

[SERVER] Global IP 확인하기

본인의 실제 외부 IP를 확인하기 위해서는 본인의 global ip를 확인해야 한다. 이 사이트를 통해 확인해보자. 대문짝만하게 IP 주소가 떠있다. 편의상 나의 외부 IP 주소는 각각 111.222.33.123(서버), 55.66.77.8(클라이언트)라고 하겠다.

[SERVER] 라우터 포트포워딩하기 (Router Port Forwarding)

라우터 포트포워딩을 하기위해서는 가장 먼저 본인에게 가장 가까운 라우터에 접근해야 한다. 게이트웨이 라우터에 접근하기 위해서는 게이트웨이 라우터의 IP주소를 알아야 한다. 일반적으로는 192.168.0.1이나 192.168.1.1로 접속할 수 있다. 브라우저에 이 주소만 입력하면 된다. 만약, 고정 IP를 사용한다거나 건물 자체의 공동 인터넷을 사용한다면, 이 주소가 아닐 수 있다. 그경우에는 직접 게이트웨이 라우터 IP를 찾아야한다. 명령어 한 줄이면 쉽게 찾을 수 있다. Window 버전

1
ipconfig

MacOS 버전

1
route -n get default

결과에서 대충 한글이나 영어로 게이트웨이(gateway) 어쩌구 써져있는 부분 찾으면 된다. IP 주소 형식을 찾아보면 쉽게 찾을 수 있다. 예를 들어 192.168.99.1 이런 식으로 나오는 걸 볼 수있다. C-Class(ip주소의 3번째 부분, 예시에서는 99)만 다를 것이다. 나의 게이트웨이 라우터 주소가 192.168.99.1은 아니지만, 예시로 이 주소를 쓰겠다.본인이 공유기에서 빼온 랜선, 또는 무선 인터넷을 사용한다면, 192.168.0.1로 접근이 가능할 것이다.

이렇게 게이트웨이 라우터 페이지에 접속하게 되면, 로그인 페이지가 나온다. 로그인해준다. 처음 접속하면, 해당 페이지에 로그인 방법이 잘 나와 있을 것이다. 로그인 했으면, 포트포워딩 탭을 찾아야 하는데, 이는 통신사마다 모두 다르기 때문에 그냥 무작정 찾아보면 된다(노가다 별로 안 걸림). SK브로드밴드기준으로 방화벽 > 포트포워딩에 있다. 만약 본인이 공유기를 사용한다면, ipTIME 기준으로 고급 설정 > NAT/라우터 관리 > 포트포워드 설정에 있다.

이 라우터에 특정 포트를 열어준다. SK브로드밴드 인터넷 기준으로 각각 정보를 아래의 표와 같이 넣었다. 원하는 특정 포트는 본인이 알아서 넣으면 된다. 표로 제공하는 이유는 통신사마다 UI가 달라서 포트포워딩 UI도 조금씩 다르기 때문이다. 물론, 들어가는 정보는 거진 전부 같으리라 예상한다. 서비스포트는 서비스할 포트의 영역을 가리키는데, 나의 경우 하나만 쓸 예정이므로 여러개 하지는 않았다. 그리고 포트도 맞춰주는게 좋다. 그리고 내부IP주소는 본인이 직접 찾긴 해야 한다. 윈도우의 경우 위의 명령어 ipconfig치면 나온다. 맥의 경우 표 아래 명령어를 확인하자.

서비스포트프로토콜내부IP주소포트설명
5000-5000TCP+UDP192.168.99.1235000비고

MacOS 버전 내부IP주소 확인하기

1
ifconfig | grep inet

결과로 나온 값들 중 192.168.xxx.xxx를 찾으면 된다. 이것이 현재 여러분이 쓰고 있는 내부 IP 주소이다.

만약 Server-side를 WiFi로 구성하게 되면, 이 내부 IP주소가 계속 바뀔 수 있기 때문에, 노트북을 사용하더라도 공유기에서 유선랜을 뽑아서 사용하는 것을 권장한다. WiFi의 경우 DHCP를 통해 IP 주소가 계속 바뀌기 때문에 유선랜으로 고정시켜주어야 한다. 안 그런다면, 다른 주소로 바뀌어 연결 오류가 날 수도 있다. 여기까지 와서 잘 적용했다면, 포트포워딩을 잘 마쳤다.

다음 편에 계속

이번 글은 여기서 마치며, 다음 글에서 계속해서 올리도록 하겠다.

This post is licensed under CC BY 4.0 by the author.