쉽게 이해하는 NAT (공유기) 원리로 NAT 루프백(헤어핀 NAT)을 알아보기

정말 쉽게 우리가 쓰는 공유기가 어떻게 동작하고 있는지를 알아보고, NAT 루프백(헤어핀 NAT)을 이해해보고자 합니다.

사실 흔히 쓰는 공유기의 NAT, NAPT 개념은 쉬워서 찾아보면 쉽게 설명한것부터 전문적으로 설명한것 까지 많은 글들이 있지만 이를 NAT 루프백(헤어핀 NAT) 이라고 하는 개념을 이해하는 데 쓰기에 좀 어렵더라구요. 제가 네트워크 인프라 전문가는 아니여서 궁금한 내용이다보니 내용을 정리해보고 이해한 내용을 바탕으로 작성했습니다. 약간 잘못된 정보고 있을 수 있지만 큰 틀에서는 이해하시는데는 문제가 없을 것 같습니다. 혹시 잘못된 정보가 있다면 언제든지 알려주시면 감사하겠습니다!


NAT 기능과 DHCP 서버가 있는, 흔히 쓰는 공유기는 하나의 인터넷 회선으로 여러대의 네트워크 장비에 인터넷을 연결할 수 있게 도와줍니다. 이런 장비 안에서 외부주소로 내부의 서버에 접근하는게 안되는 문제를 이해하기 위해서는 일단 어떻게 가정에서 쓰는 공유기가 동작하는지를 이해하는게 좋습니다.

공유기 하단에 있는 PC, 네트워크 장비는 공유기의 DHCP가 부여한 IP, 혹은 수동 설정한 가지고 있을 겁니다. 이 장비는 본인의 IP가 외부에서 어떻게 보이는지는 중요하지 않고 오로지 본인이 알고 있는 IP가 본인 것이라고 이해합니다. 그래서 만약 외부 서버에 정보를 받기 위해 요청시에는 본인이 알고 있는 IP로 응답해달라고 보냅니다.

중간의 공유기는 이 요청을 받고 어떻게 할지 결정합니다. 요청한 네트워크 장비가 누구고, 목적지는 어디인지를 기록하고 네트워크 내에 다른 장비에서도 동일한 서버로 요청을 할 수 있으니 포트번호도 임의로 바꿉니다. 이를 SNAT 라고 합니다. 그리고 이를 매핑테이블에 기록합니다.

예시 그림상으로는 192.168.0.10의 16000번 포트로 응답해 주세요라고 하지만, 공유기에서는 본인 IP의 17000번으로 응답해 달라고 했다고 공유기 내의 메모리에 기록하고 실제로 서버에 요청합니다.

그러면 서버는 실제로는 192.168.0.10의 PC가 요청했다고 받는게 아닌 123.456.789.0의 장비가 요청했다고 알고 그에 맞춰 데이터를 준비합니다. 서버가 응답할 데이터를 준비해서 보내면, 요청한 주소로 보내게 될 겁니다. 위 그림상으로는 123.456.789.0의 17000번 포트로 보내겠죠.

공유기는 서버가 보낸 정보를 수신합니다. 앞에서 기록한 내용을 바탕으로 이게 내 네트워크 안에 누구가 요청했는지 검색합니다. 위 표에 잘 기록해 뒀으니, 목적지 987.654.321.0에 17000번 포트로 요청했던 원래의 출발지는 192.168.0.10이고 포트번호가 16000임을 찾을 수 있습니다.

그러면 공유기는 목적지 정보를 바꿔서 내부 네트워크의 192.168.0.10 이라는 장비에 전송해주게 됩니다. 목적지 주소가 바뀌게 된 것이죠. 이게 DNAT입니다. 192.168.0.10이라는 장비는 어쨌거나 본인이 원하는대로 데이터를 요청했더니 받았기 때문에 그 이후가 어떻게 되었든 계속 서비스가 제공되는 것으로 보고 계속 사용 가능합니다.

중간에 공유기는 이런 요청을 자신 아래에 있는 네트워크 장비들이 계속 요구해서 저 테이블이 계속 쌓였다가 시간이 지나면 좀 버려지고, 내부 네트워크에서 요청이 들어오면 바꿔서 실제로 외부로 던져주고, 외부에서 받은 데이터는 내부 네트워크에서 온 요청중에 찾아 적절히 바꿔서 특정 장비에 전달해주는 역활을 꾸준히 해옵니다.

그래서 이 SNAT, DNAT를 해주는 성능이 얼마나 빠른지, 그리고 저 테이블에 얼만큼 저장할 수 있는지에 따라 공유기 성능이 달라지게 됩니다. 가정용 기준하에 이제는 어느정도 충분한 수준까지 발전한 상황이라서 사실 일반적인 사용에서는 그렇게 성능이 느려지거나 하지는 않을겁니다.

전채 개념으로 보면 이렇습니다. 앞에서는 생략되었지만 우리가 ip주소로 직접 접근을 안할테니 DNS 서버에 이 주소가 어느 IP인지를 물어봅니다. 이게 첫번째로, IP주소가 결정되면, 그 이후는 위에서 설명한 대로 운영된다고 생각하시면 됩니다.


이제 NAT 루프백, 헤어핀 NAT이 동작하지 않는 경우가 어떤지를 봅니다. 그러니까 우리가 보통 NAS에 외부 도메인을 할당하거나 DDNS를 쓰는 경우에 외부망에서는 잘 동작하는데, 내부망에서 내부망으로는 동작하지 않는 경우가 이 경우입니다.

일단 내부망의 장비는 내가 연결할 서버의 주소를 가지고 DNS서버에서 찾아 목적지의 IP주소를 결정합니다. 목적지 IP가 결정이 되면, 내 출발지 주소와 목적지 주소, 데이터를 실어 보냅니다. 이렇게 일단 내부망의 장비는 외부주소로 내부망의 서버에 요청하기 위해 데이터를 전송합니다.

여기서부터는 간략하게 하기 위해 DNS 쿼리부분은 제외하였습니다. 중간의 공유기는 이제, 내부망의 한 장비에서 요청을 받아 처리를 진행해야 합니다. 원래대로라면 출발지 주소는 SNAT로 변경되면서 내부의 NAT 테이블에 기록하고 관리를 해주고 외부 네트워크로 변경된 출발지 정보를 가지고 데이터를 전달해줘야 하지만, 공유기는 목적지 IP를 보고 본인 IP 라는것 을 알게 됩니다. 이렇게 될 경우 네트워크 구성상 상위 네트워크로 데이터를 전송하지 않고 자체적으로 처리를 진행하게 됩니다. 공유기 설정상 포트포워딩 정책에 따라 이 포트로 수신 된 데이터는 특정 IP의 특정 포트로 전송하라는 규칙이 있으므로, 이에 맞춰서 포트 포워딩 하여 내부의 우리가 원하는 서버로 일단은 데이터를 전송하게 됩니다. 즉 전송자체는 성공하게 됩니다. 출발지 주소가 공유기가 아닌채로 말이죠.

이게 공유기라는 물건이 생긴 목적 때문에 그렇습니다. 일반적인 라우터라면 갖가지 설정을 다 가지고 있고, 표준 프로토콜을 준수하여 만들지만, 공유기의 경우 그만큼 전문적인 용도가 아닌 일반적인 가정의 용도로 산정하고 만든 물건이기 때문에 많은 기능들이 생략되어 있습니다. 그리고 그만큼 하드웨어 성능도 빈약합니다. 그렇기 때문에 공유기는 본인 IP임을 알게 된다면 성능을 굳이 잡아먹지 않고 빠르게 전송하기 위해 포트포워딩 규칙만 적용하고 내부 서버에 전송하게 되는 것이죠.

이렇게 되면 이제 삼각형이 그려집니다. 요청을 받은 우리 내부의 192.168.0.200 이라는 서버는 요청이 들어왔으니 이를 분석하고 그에 맞는 응답을 할 겁니다. 근데 보니까 출발지가 192.168.0.10의 16000번 이네요. 네트워크는 내부간에는 직접 연결이 가능하므로 응답 데이터를 바로 요청한 장비로 쏴주게 됩니다. 즉 응답은 합니다.

문제는 192.168.0.10 장비 입장에서는 192.168.0.200 서버에 요청한 적은 없습니다. 이 192.168.0.10 장비는 123.456.789.0 이라는 장비에 요청해서 응답이 올 때 까지 기다리고 있는 상황입니다. 네트워크는 연결하고자 하는 곳에 연결해줘! 하면 상대쪽 장비가 가능하다면 그래! 하고, 그러면 연결하고자 한 장비는 그러면 우리 이렇게 연락주고받자! 라고 하는 과정을 거치는데, 192.168.0.10 장비 입장에서는 갑자기 192.168.0.200 이 ‘니가 원한거 줄게’ 하고 문 두드리는 상황이 발생한 거죠. 당연히 192.168.0.10 입장에서는 서로 약속을 한 적이 없기 때문에 192.168.0.10 장비는 192.168.0.200 이라는 장비에서 온 데이터를 모두 드롭합니다.

이게 바로, NAT 루프백이 동작하지 않을 경우 발생하는 과정이고, 장애가 발생하는 원인입니다.


그러면 어떻게 하면 이 문제를 해결 할 수 있을까요. 정석적인 NAT 과정을 거쳐주면 됩니다. 위에서 설명한 대로 현재 상황은 SNAT가 되지 않아 출발지 IP가 바뀌지 않고 그대로 전송되었기 때문에 발생한 겁니다. 이를 정석적으로 SNAT를 적용시켜주는것이 NAT 루프백을 적용하는 것으로 일반적으로 통용되는 방법입니다.

이 그림, 앞에서 NAT 동작에 대해 설명할때랑 사실상 같죠? 구분을 위해 일부러 공유기를 위에 얹어둔거고, 잘 보시면 외부 통신과 완전히 동일한 구성임을 알 수 있습니다. 해설을 하자면,,,

192.168.0.10은 외부에서 알려준 123.456.789.0 주소로 8080포트를 통해 데이터를 요청합니다. 그러면, 123.456.789.0 공유기는 확인해서 SNAT 을 하여 라우팅 테이블에 올려놓은 다음, 생각해보니 이거 내 IP네? 하고 다시 내부로 전송할 곳을 찾아봅니다. 8080포트로 수신되면 80번 포트로 192.168.0.200에 전달해주라는 포트포워딩 규칙이 있기 때문에 이를 따라 내부의 192.168.0.200에 전달하게 됩니다. 192.168.0.200은 요청받은 데이터를 처리하고 응답을 하는데, 받은 데이터의 출발지가 123.456.789.0:17000이니까 그쪽으로 던져줍니다. 123.456.789.0의 공유기는 확인해보니 기존에 17000번으로 온 건 192.168.0.10이 16000번 포트로 요청했던 거니까, 이에 맞춰서 DNAT 하여 목적지 주소를 바꿉니다. 그리고 192.168.0.10 으로 전달하게 됩니다. 192.168.0.10은 본인이 요청한 내용에 정상적으로 답을 받았으므로 서로 만족하는 네트워크를 구성한 것입니다.

이렇게 되면, 네트워크 상으로는 아주 문제 없이 정상적으로 서로 연결되고 데이터를 주고 받을 수 있습니다. 라우터가 본인 역할을 다 하고 있는 상황이기 때문에 192.168.0.10은 라우터랑 서로 연결되어 주고 받았고, 마찬가지로 192.168.0.200 서버도 라우터랑 서로 연결되어 주고받았습니다. 다만 이로인해 라우터는 바쁘게 SNAT, DNAT 과정을 하고 있습니다. 평소라면 외부랑 통신하기 때문에 한세트만 하면 되는데, 지금 양쪽으로 한세트, 총 두세트의 작업을 하고 있기 때문에 그만큼 부하가 심하죠. 포트포워딩 규칙으로 라우팅 하는것도 사실은 공유기의 빈약한 하드웨어로는 부담이기 때문에, 사실 이렇게 될 경우 전반적으로 속도가 떨어지고 네트워크가 불안정해지기도 합니다.

그래서 일부 공유기들, 특히 예전에 주로 유통된 공유기들이나, 기능이 다양하지 않고 특수 목적으로 제공되는 공유기나 제품이 출시된 그 목적상 안정성과 적당한 성능이 중시되는 공유기(대표적으로 통신사 공유기)들은 해당 기능을 활성화 하지 않았습니다. 문제는 NAS를 들여놓은 그 순간, 일반적인 가정에서 사용하는 구성은 벗어났기 때문에 제한이 발생하고 장애가 생기게 되는 것이죠. 과거에는 일반적인 단방향으로 사용하는 인터넷 환경에서 이럴 일이 없을 거라고 가정하고 설정이 되지 않았거나 기능 자체가 제공되지 않았습니다. 하지만, 지금은 그렇지 않아진것이고, 그로인해 사실 좀 오래전부터 홈 라우터 제품들은 이 기능이 동작하도록 만들었습니다. 사실 지금 이 기능이 없는 홈 라우터를 찾기는 어려울거예요. 다만, 이 개념 자체는 네트워크를 구축할때 꼭 알아야 하는 사실이기도 하고, 본격적인 라우터를 핸들링 하는 인프라 업무를 하는 분들이라면, 가끔 만나기도 하는 상황이기 때문에 개념적으로 이해해 두는것은 나쁘지 않습니다.


사실 정석적인 방법은 따로 있습니다. 애초에 내부망 간에는 내부 IP로 통신하는 것이 가장 베스트입니다. 라우터를 꼭 거칠 필요 없어 네트워크 혼잡이 완화되고, 라우터 성능을 사용하지도 않습니다. 직관적인 만큼 연결을 위한 단계나 구조가 간단해지기 때문에 응답속도 및 대여폭등등 모든 면에서 장점입니다. 이 방법은 바로 우리가 내부망에서 직접 NAS에 접근하기 위해 쓰는 NetBIOS 이름을 통한 접근이나, NAS에 할당된 IP로 직접 접근하는 방법입니다.

하지만 요즘 네트워크를 통한 서비스에는 보안 통신을 위해 인증서를 주고받고 암호화하는 과정으로 사용하는것을 강제하기도 합니다. 이 경우 보안 프로토콜과 정해진 포트를 사용하더라도 서명된 도메인 이름이 아니면 안전하지 않다고 안내하고 경우에 따라서 통신을 허용하지 않기도 합니다. 잘못된 설정이나 구성으로 인해서도 IP나 NetBIOS 이름으로 접근하면 오동작 하는 경우도 존재합니다. 즉 꼭 도메인으로 접속해야 정상적으로 동작하는 경우가 많습니다.

이럴때에는 DNS 서버도 같이 운영하시는게 좋습니다. 예전에는, 혹은 DNS서버를 구축하기 어려울 경우에는 보통 host파일을 핸들링 하는 방법으로 특정 도메인은 이 아이피다 라고 고정해놓고 쓰기도 했는데, 이정도로 고민하실 분들이라면 가지고 있는 NAS와 같은 서버에 DNS 서버를 구축해놓고, DNS에 이 도메인은 내부 주소로 접속하도록 하라고 안내해줄 수 만 있다면 깔끔합니다. DNS 설정시 특정 주소 외에 나머지 모든 주소 쿼리는 외부 저명한 DNS 서버를 릴레이해주도록 설정합니다. 그리고 공유기 내부 네트워크 설정에 DNS주소를 결정하는 곳이 있을 것이고, 여기다가 내부에 구축해 둔 DNS 서버 주소를 넣어두면 구축은 끝납니다.

그렇게 되면 해당 공유기 아래에 붙은 모든 장비들은 네트워크에 접속시 DHCP 규칙에 따라 DNS는 이 서버를 사용하라고 통보해 줍니다. 해당 네트워크에 붙은 장비들은 별도 설정을 하지 않았다면 DNS 쿼리시 위와 같은 그림으로 구축한 서버를 통해 진행하고, 그렇게 전달받은 IP주소를 가지고 직접 통신을 진행할 겁니다. 만약 이 상태에서 다른 네트워크에 붙는다면, 외부 통신이 되면서 DNS서버는 그쪽 네트워크의 설정에 따르거나 고정된 값을 가질테니 별다른 고려사항 없이 아주 자연스럽게 사용할 수 있습니다.

Views: 1575

Leave a Comment