1. 초간단 배경지식 : 공인/사설IP, NAT, 포트포워딩
IPv4는 표현할 수 있는 주소가 약 43억개(32bit)로, 21세기 지구촌의 모든 전자기기를 각각의 IP 주소로 표현하기엔 모자라다. 주소를 표현하기 위해 128비트를 사용하는 IPv6가 등장했지만, 현재 구축되어있는 IPv4 세계를 바꾸기 위해선 천문학적인 비용이 들기 때문에 기존 IPv4의 수명을 늘리는 여러가지 방식들이 고안되고 있다.
그 중 하나가 사설IP와 공인IP를 이용한 NAT와 포트포워딩이다. 말한 것처럼 존재하는 모든 기기에 고유한 IP 주소를 붙이는 것은 주소의 낭비가 심하므로, 하나의 네트워크 단위로 네트워크 내부에서만 유효한 사설 IP를 할당하는 방법을 이용한다.
공인 IP주소는 전세계 IP주소를 관리하는 공식 기관이 관리한다. 공식 기관이 각 나라에 특정 범위의 IP 주소를 할당하면, 또 각 나라의 공식 기관이 나라의 인터넷 서비스 제공자들에게 일정 범위의 IP주소를 할당하고, 서비스 제공자들이 서비스 구매자들에게 IP를 할당하는 식으로 작동한다. 요컨데 특정 공인 IP 주소를 가진 네트워크 기기는 전 세계에 오직 1개이다.
보통 이렇게 공인 IP 주소를 가진 기기는 서버 컴퓨터를 제외하면 L3 스위치 혹은 라우터, 가정이나 회사의 공유기 등 하나의 LAN을 이루는 작은 네트워크 단위인 경우가 많다.
사설 IP주소는 이런 네트워크 단위 내에서 각 기기를 구분하기 위해 사용하는 내부 IP 주소이다. 같은 공유기를 쓰는 노트북이나 핸드폰 등의 네트워크 기기가 가진 공인 IP 주소는 같지만, 각각이 네트워크 안에서 가진 사설 IP 주소는 다르다. 사설IP는 같은 공인IP를 사용하는 네트워크 내부에서 겹쳐선 안되지만 다른 네트워크를 사용하는 기기들과는 겹쳐도 된다. 같은 네트워크 안에서 서로를 구분하기 위해 사용하는 주소이기 때문이다.
문제는 네트워크 내의 기기가 네트워크 바깥과 통신할 때 발생한다. 사설 IP 주소를 가지고 어떻게 바깥과 통신할까?
바깥 네트워크에 요청을 보낼 때, 사설 IP주소를 가진 내부 기기는 자신이 속한 네트워크의 공인 IP 주소를 달고 나간다. 이것을 NAT(Network Address Translation)라고 한다. 요청에 대한 응답을 받을 땐 라우터나 공유기가 요청 기록을 토대로(이때 포트번호를 포함해서 기기를 구분하는 NAPT가 사용되는데 관습적으로 NAT라고 부르는듯) 방금 전 요청을 보낸 기기에게 응답을 전달한다.
더 큰 문제는 바깥에서 요청이 들어올 때다. 위의 그림 예시에서 123.123.123.123:80에 요청이 들어왔다고 해보자. 공유기 1은 내부에 있는 6개의 네트워크 기기 중 어떤 기기에게 해당 요청을 전달해야할까? 이 때 사용하는 것이 포트포워딩이다. 사전에 '특정 포트로 들어온 요청은 네트워크 내에 특정 사설IP 주소를 가진 기기에게 전달해주자' 라고 정해놓는 것이다. 포트 번호를 이용해서 내부 기기로 패킷을 이동시키는 과정이므로 "포트포워딩"이라는 용어는 적절한 것 같다.
그림을 보자. 사전에 공유기 포트포워드 설정을 "나에게 온 80번 요청은 192.168.0.20:80으로 보내자" 라고 설정하면 요청 패킷은 주황색 화살표의 경로로 이동한다. 물론! 내부 네트워크 기기의 어떤 포트로 정해줄 것인지 역시 설정할 수 있다. 이 때 123.123.123.123의 공인 IP 주소를 가진 공유기에게 직접적으로 요청이 들어온 포트번호(예시에선 80번)을 외부 포트, 패킷을 전달할 내부 네트워크 기기에 포트 번호를 내부 포트라고 한다.
위 개념을 실제로 실습해보겠다. 실습 과정은 다음과 같다!
- nginx로 노트북 컴퓨터에 웹서버를 설치하고 특정 포트(5270)에 nginx 서버를 열어두겠다.
- 우리집 공유기에 포트포워딩 규칙을 설정하겠다. 대충 55555번 포트로 들어온 요청을 노트북 컴퓨터의 nginx 서버가 돌아가는 5270번 포트로 이동시키겠다.
- 휴대폰 셀룰러 데이터로 "{우리집 공유기 IP주소}:55555" URL로 접속해보겠다.
2. Nginx ?!
1) 초초초간단 nginx 설명
Nginx란? 웹서버 프로그램이다. 특정 IP 주소를 가진 컴퓨터의 특정 포트에 nginx 서버를 열 수 있다. 그럼 컴퓨터는 해당 포트로 들어온 사용자의 요청에 응답을 내리는 서버로 동작한다. 근데 보통 생각하는 웹 어플리케이션 서버처럼 동적 페이지를 제공하는 등의 대단한 역할을 할 수 있는건 아니고, 그냥 정적 컨텐츠를 내려보내줄 뿐이다.
WAS 시대에 이런 웹 서버를 사용하는 이유는 로드 밸런싱, 리버스 프록시 등이 있다는데 그것은 나~중에 웹서버 관련해서 공부할 때 살펴보도록 하고! 눈 앞에 닥친 과제를 하자.
2) 설치
내 컴퓨터 환경은 .. hombrew랑 그를 이용한 mysql 하나가 깔린 맥북이다. (끝)
가장 먼저 brew를 이용해 nginx를 설치했다.
$ brew install nginx
수십 초를 기다리면 다운로드가 완료되고, configuration 파일의 위치를 알려준다. 아마 버전 차이 탓일 것 같은데, 인터넷으로 찾은 통상적 config파일의 위치(/usr/etc/nginx)랑 달랐다.
/opt/homebrew/etc/nginx/nginx.conf
나의 경우는 위와 같았다.
하여튼, Nginx가 성공적으로 설치되었으므로 실행시켜보자.
$ brew services start nginx
그러면 맥북의 경우 백그라운드에서 실행될 수 있는 프로그램 어쩌고 알림이 뜨는데 무시하고, 크롬 주소창에 localhost:8080으로 접속해보자. 포트 번호가 8080인 이유는 nginx의 초기 설정 포트 번호가 8080이기 때문이다. 이 설정은 당연히 cofig 파일에서 바꿀 수 있다.
nginx 서버가 잘 ! 띄워졌다. 내 컴퓨터의 IP주소(localhost, 127.0.0.1)에 해당하는 포트번호(8080)로 네트워크 통신을 시도하면 잘 된다는 것을 실제로 확인했다.
3) configuration
이제 configuration을 진행해보자. nginx가 알려준 configuration 파일로 이동하자. 에디터로는 vim을 쓸 것이다.
$ vi /opt/homebrew/etc/nginx/nginx.conf
좍좍좍 내리다보면 http 부분이 나오는데, 여기서 server.listen 항목이 nginx 서버가 열린 포트번호이다. 원하는 번호로 바꾸자.
나같은 경우는 내가 좋아하는 가수의 생일인 5270으로 바꿔줬다.
그리고 기본으로 나오는 "Welcom to nginx!" 외 그 문구들도 맘에 안든다. index.html을 수정하고 싶다. index.html이 존재하는 디렉토리로 이동하자.
$ cd /opt/homebrew/Cellar/nginx/1.25.0/html
참고로 하위 디렉토리는 당연 버전마다 다르며, 이는 설치할 때 설치완료 후 내뱉는 설정 로그드를 참고하거나 `$ nginx -V`를 통해 정보를 확인해야 한다. ls를 통해 확인해보면 index.html 파일이 있다. 입맛에 따라 index 페이지 문구를 수정하자.
그 뒤, nginx 서버를 재시작했다.
$ brew services restart nginx
이제 "localhost:{방금 설정한 포트번호}"로 접속해보면!
3. 포트포워딩 해보기!!
우리집 공유기에 포트포워딩 규칙을 설정하자. 우리집 공유기의 IP주소를 알아야한다. 네이버에 냅다 내 IP 주소 확인을 검색해도 되고, 터미널에서 확인할 수도 있다.
$ curl ifconfig.me
그 뒤 인터넷 브라우저에 해당 IP 주소를 입력하면 공유기 설정 화면으로 들어갈 수 있다. 설정의 NAT관리, 포트포워드 설정에 들어가자!
그리고 내부 IP주소, 외부 포트, 내부 포트를 위와 같이 수정했다. 외부 포트는 그냥 내 마음대로 정했고, 내부 포트는 nginx 서버를 열었던 5270번이다. 내부 IP 주소는 nginx 서버가 열린 이 노트북이 공유기 범위 내에서 가지는 사설 IP 주소이다.
정리하면, 공유기 IP 주소의 외부 포트 55555번 포트로 들어온 요청은, 내부 IP 주소의 내부 포트 5270 번으로 포트포워딩 해주세요~ 정도이겠다. 설정 완료를 하자. 그리고 휴대폰 와이파이 연결을 끊고, "{공유기 IP주소}:55555"로 접속하자.
아무튼. 잘 됐다! 셀룰러 데이터를 이용한 내 휴대폰에서 내 노트북의 웹서버에 접속되는 과정을 그림으로 나타내보았다.
오른쪽에 192.168.x.x의 IP 주소를 가진 다른 기기들은 우리집 와이파이를 이용하는 TV, 데스크탑, 아이패드 등 다른 기기들이다.
nginx 웹서버의 응답은 공유기 IP 주소인 121.165.213.185를 달고 같은 경로를 통해 나간다. 이때 NAPT가 이용되는 것이다.
REFERENCE
https://kibbomi.tistory.com/219