
슬랙앱을 만들기 위해서 외부에서 접근할 수 있는 주소가 필요했다. 근데, 나는 인터넷으로 slack과 통신하고 있는데 왜 별도의 주소가 필요한지 이해가 안되었다.

AI의 도움으로 ngrok이란것이 필요하다는것을 알게 되었는데, 백엔드 개발자라면 어떻게 동작하는건지는 알고 써야겠다는 생각이 들었다. 이참에 네트워크 기본도 공부하면서, 실제 네트워크 도구들은 어떻게 동작하는지 이해하면 이해할 수 있는 세상이 넓어질 것 같았다.
ngrok 공식 페이지에 들어가게 되면 설명에 gateway, proxy라는 단어가 등장하게 된다. 당연히 무슨 뜻인지 몰라서 처음에 이해하는데 꽤 애먹었다.

Gateway는 네트워크들간 출입문 역할로 이해할 수 있다. 한 네트워크에서 외부로 나가고, 들어오는 유일한 출입구라보면 된다. 네트워크간 사용하는 프로토콜이 다를 수 있는데, 통신이 가능하도록 연결시켜준다.
보통 gateway는 라우터를 사용한다고 한다. 이번에는 어떻게 gateway를 통해서 외부 네트워크에 있는 호스트와 통신하는지를 알아보았다. 돌아보면 어렵지 않은데, 처음에는 ARP나 브로드 캐스팅때문에 애를 먹었다. 이해하기 위해서 '후니의 쉽게 쓴 CISCO 네트워킹'과 기본 게이트웨이 설명 영상을 활용했다. 그러면 대략적인 흐름을 알 수 있는데, 진짜로 그런지 좀 찝찝했다. 그래서 확인하기 위해 CISCO에서 packet tracer라는 도구를 이용해보았다.
packet tracer는 블로그 포스팅 과 사용법 영상을 참고했다. 모두 훌륭한 자료들이였지만, 역시 직접 해보는것만 못했다. 자세한 설정은 내용이 글 보단 사진이 나을 것 같다. 위 자료를 참고하면, 쉽게 따라해볼 수 있다. 가능한 똑같은 컴포넌트를 사용하는게 좋은것같다. 특히 라우터를 2621XM으로 사용해야 ARP를 확인할 수 있었다. 왜 그런지는 모르겠다...

<PC0 설정>


<PC1 설정>


<라우터 설정>


PC0와 외부에 있는 PC1과 통신하기 위해서는 서로의 MAC 주소를 알아야한다. 보통 같은 네트워크에 있는 PC끼리 MAC 주소를 알기 위해서는 브로드 캐스팅을 통해, 특정 IP를 가진 컴퓨터가 MAC 주소를 반환하도록 되어있다. 그런데 다른 네트워크에 있다면, 브로드 캐스팅이 도달하지 못한다. 라우터(게이트웨이)에서 차단하는데, 이럴 경우는 라우터의 MAC 주소를 알아낸 후, 라우터를 통해 PC1과 통신하게 된다.
통신은 ping을 이용해 PC2에서 PC3로 보냈다.



메세지를 전달하기 위해서는 MAC주소가 필요하고, 외부 네트워크의 경우 IP주소라는 나침판이 필요하다. 처음에는 MAC 주소를 알아내기 위해 ARP 통신이 시작되지만, 그 다음부터는 MAC 주소를 알기 때문에 ARP 없이 통신이 가능하다. 같은 통신을 한번 더 수행했지만, APR가 보이지 않는다.

돌아보면 굉장히 간단한데, 연결하고 설정하는 순서에 따라 원하지 못하는 결과를 얻는 경우가 많았다. 먼저 장치끼리 연결을 먼저 한 다음, ip와 MAC 주소를 설정한 다음 마지막에 라우터 포트를 열면, 똑같이 반복할 수 있었다.
그러면 외부에 있는 PC(호스트)와 IP, MAC, 게이트웨이를 통해 통신할 수 있음을 확인했다. 그런데 slack에서는 호스트의 IP로 접근할 수 없었다. 이걸 이해하기 위해서는 사설 IP, 공용 IP 개념을 이해해야 했다.
IP는 두 종류로 사설 IP(private)와 공인 IP(public)로 나뉜다. 공인IP는 ISP에 의해 할당되는 주소이며, 라우터가 IP를 할당받게 된다. 그리고 라우터가 내부 네트워크에 연결된 기기들에게 사설IP를 할당하게 된다.
공인 IP는 인터넷에서 사용되는 식별기능을 가진 주소이기에 유일해야한다. 반면에, 사설 IP는 라우터가 할당한 IP이기 때문에 같은 주소가 여러 네트워크에 존재할 수 있다.
그러면 slack 앱에서 request URL에 기기의 사설 IP를 설정하면, 호스트까지 요청이 전달되어야한다. 그러나 사설 IP는 인터넷에서 사용되는 IP가 아니므로 메세지가 전달되지 않는다. 그래서 공인 IP를 이용해 라우터까지 보내야한다. 그러나 라우터에서 사설 네트워크의 어떤 기기로 보낼지를 모르기에 요청이 전달되지 않는다.

아래는 추가적으로 사설IP에서 사용할 수 있는 주소 대역폭이다. 일반적인 가정에서는 class C가 사용되는것 같다.

사설 IP와 공인 IP의 차이점도 표로 잘 정리되어있어, 사이트 글을 읽고 공부해보는걸 추천한다.

라우터는 보안의 목적으로 외부 접근을 전부 차단한다. 이 중 일부만을 설정하여 통과시킬 수 있는데, 그게 port forwarding이다. 라우터에게 특정 포트로 들어오는 요청에 대해서 사전에 매핑된 기기의 특정 포트로 전달해달라는 규칙을 만드는 것이다.
사용처는 게임 호스팅, 원격 접속에 주로 사용된다고 나오는데, 앞으로 나오는 tunneling이란 기술도 내부적으로 port forwading을 사용하는것으로 보인다. ngrok은 tunneling을 이용해, 외부에서 접근할 수 있도록 돕는다.
예를 들어 라우터에 80번 포트로 들어오는 요청을 내부 192.68.100.2 주소에 해당되는 2256포트로 전송하라는 규칙을 설정했다고 하자. 그러면 외부에서 라우터의 공인IP에 80번 포트로 접근하는 모든 요청은 매핑된 기기로 전달된다.
port forwarding과 함께 언급되는것이 보안 문제다. 포트를 열여둔다는것은 외부 공격에 노출된다는것과 같다. 이를 개선하기 위해 tunneling 기술이 등장한 것으로 보인다.
port forwaridng 기반으로 개선된 기술이다. 통신 내용을 암호화시킬 수도 있고, 공인IP를 동적을 만들 수도 있다. 보안적으로 더 우수한것은 암호화시킬 수 있다는것도 있지만, 공인IP가 동적으로 생성되니까 외부 공격 타켓으로 삼기 어렵다는 점 같다. tunneling 공인IP는 일시적으로 사용하고, 외부에 알려지지 않아 공격 받을 가능성이 적은 것 같다. 이 부분은 정확히는 모르겠다.
ngrok에서는 secure tunneling이라고 소개하며, 외부 클라우드 서버 공인 IP에 접근하면 터널을 이용해 기기로 접근할 수 있게 만들어준다.
ngrok is a globally distributed reverse proxy 설명에서 ngrok을 reverse proxy라 소개하고 있다. proxy는 호스트 요청이 인터넷으로 빠져나가기 전 거치는 중간 검문소라 보면 된다. 호스트의 요청을 받아, 대신 외부로 보내준다. 이때, 유해 사이트에 접속하는걸 차단하거나, 자주 접근하는 사이트 페이지를 저장했다가 인터넷을 거치지 않게 반환해주기도 한다. 특히, 학교에서 교육을 목적으로 특정 사이트들에 접속하지 못하게 막을 수 있는데, proxy를 이용한 방법들이였다.
proxy는 인터넷을 기준으로 클라언트 네트워크에 속해있었다. reverse proxy는 반대로 서버 네트워크에 포함되어있다. 서버 대신 요청을 먼저 받아 필터링하거나, 캐시로 저장한 내용이면 대신 처리해주거나, 특정 서버에 부하가 쏠리지 않도록 분산시켜주기도 한다.
그래서 ngrok은 reverse proxy라 소개되는데, 로컬 서버(FastAPI)에 접근하기 전에 tunneling 입구에 해당되는 ngrok 서버를 먼저 거쳐야한다. ngrok 서버가 로컬 서버의 reverse proxy 역할을 하게 된다.
ngrok을 이용해 외부에서 접근할 수 있는 터널을 생성하고, 터널의 공인 IP를 slack app request_URL로 설정하면, slack app에서 로컬 서버로 접근할 수 있게 된다.
통신을 검사하는 기능으로 방화벽이 사용되는데, 컴퓨터에서 설정하는 방화벽 외에도 라우터 내부 혹은 앞단에서도 방화벽을 설치할 수도 있고, 특정 통신 레벨을 검사하는 방화벽도 있는것 같다.
다음 글들을 참고하면 좋다.
방화벽1
방화벽2