[네트워크] Symmetric NAT 방식

Robert.Yang·2023년 6월 4일
1

Network

목록 보기
46/59
post-thumbnail

이 포스트는 널널한 개발자님 강의를 참조하며 작성하였습니다.

Symmetric NAT 방식

NAT방식 중에 Symmetric 방식에 대해 이야기 해보겠다. NAT는 기본적으로 IP주소를 변환한다고 했는데 포트도 같이 변환한다. 패킷이라는 것은 IP header와 TCP header가 오고 그 다음으로 payload가 나온다. 이렇게 나오는 IP header, TCP header를 바꿔치기 하는 것이 기본적인 방식이다. 그러면 우리는 이 바꿔치기가 어떻게 되는지를 잘 파악해야 한다. 위의 그림을 통해 예시로 알아보자. 위의 그림처럼 공유기가 있으면 안쪽이 내부가 되고 바깥이 외부가 되는데 내부에서 사용되는 private IP주소라는 것은 인터넷이라는 public 네트워크에서는 통용이 안된다. 위 그림을 보면 NAT Gateway가 있는데 보통 인터페이스는 2개이다. 그 중에 안쪽에 할당되는 주소가 192.168.0.1이고 그러면 호스트 입장에서 gateway는 192.168.0.1이 되는 것이다. 그런데 사설주소로는 인터넷을 못하는데 ISP를 사용하면 ISP에서 global IP주소를 할당해준다. 그게 3.3.3.3이라고 가정하자. 그러면 예를들어 공유기 안쪽에 사설주소인 192.168.0.10인 호스트가 있다고 하자. 그리고 이 호스트에 브라우저로 www.abc.com이라는 웹서버에 접속한다고 하다. 그러면 DNS한테 www.abc.com에 해당되는 IP주소를 받게 될 것이고 그게 위의 그림처럼 15.15.15.15라고 하자. 그러면 일단 웹서버와 TCP연결을 한 뒤에 HTTP 통신을 할 것이다. 그래서 호스트단에서 패킷이 전달될때 구조는 어떻게 될까? 일단 출발지 주소는 자신의 사설 IP주소일 것이고 포트는 OS가 가능한 포트를 할당시켜줄 것이다. 그리고 목적지 주소는 웹서버 주소일 것이다. 즉 출발지 주소는 192.168.0.10:3000이라고 하고 목적지는 15.15.15.15:80이라고 하자. 그리고 이 패킷이 NAT Gateway에 도착하는 순간 이 NAT Gateway는 기본적으로 inline구조이고 트래픽이 도착하면 외부로 Outbound할 때 변조를 일으킨다. 그러면 어떻게 변조를 할까?

일단 private IP주소는 인터넷을 쓸 수 없는 주소이므로 외부로 트래픽을 내보낼 때 패킷을 변조한다. 출발지 IP주소를 공유기의 global IP주소로 바꾼다. 그리고나서 출발지 포트번호도 공유기가 지정한 포트로 바꾼다. 즉, 192.168.0.10:3000을 3.3.3.3:23000으로 바꾸게 되는 것이다. 그러니 TCP/IP Header가 조작이된다. 그렇게 해서 트래픽이 인터넷으로 나간다. 그래서 트래픽이 웹서버가지 도착하게 된다. 그러먄 웹서버는 192.168.0.10이 접속했다고 생각을 안 하고 3.3.3.3이 접속을 했다고 생각을 한다. 그래서 이런 이유로 지난 포스트에서 잠깐 애기했던 TCP연결이라는 것은 착각이라고 한 이유가 이것때문이다. 그리고 Outbound는 일종의 트리거 역할을 해주는데 Outbound 트래픽 중심으로 뭔가 변조와 관련된 자료구조가 생겨나는데 그 자료구조를 NAT-Table이라고 한다, NAT-Table은 별거 아니고 간단한 DB라고 생각하면 된다.

예를 들어서 NAT Gateway Outbound할 때 NAT Table 자료구조느 공유기가 가지게 된다. 즉, 공유기의 메모리에 들어가져 있다. 결국 패킷이 날라갈때 어떻게 하냐면 내부에서 Local IP 192.168.0.10을 쓰는 호스트가 자기가 포트 3000번을 열어서 remote IP 15.15.15.15:80에 접속했다는 걸 공유기가 메모리에 기록을 남긴다. 그리고 변조할 대 포트번호를 어느 포트번호로 바꿨는지 External Port에 기록을 한다. 이렇게 이런 정보가 NAT Table에 기록이 되는데 이런 record들이 추가가 되야 하는데 언제 추가가 이뤄지냐면 패킷이 Outbound될 때 이다. 그러면 Inbound될 때는 어떻게 될까? 당연히 추가가 되지 않는다. 그러면 서버입장에서 TCP연결을 할려고 호스트가 SYN을 날렸으면 서버는 그걸 받으면 SYN + ACK를 날려야 하는데 이 때 목적지 IP주소를 무엇으로 할까?

당연한 이야기이지만 출발지 IP/port는 15.15.15.15:80일 것이고 목적지는 3.3.3.3:23000으로 간다. 그러면 SYN+ACK가 공유기에 도착하면 이 때 출발지 IP/port와 목적지 포트를 가지고 공유기가 NAT Table에 검색을 하게된다. 그러면 해당 레코드가 검색이 될 것이고 해당 레코드의 Local IP와 Local Port로 변조해서 내보낸다. 즉, 3.3.3.3:23000을 192.168.0.10:3000으로 변조해서 간다. 이게 웃긴게 서버입장에서는 3.3.3.3:23000하고 HTTP통신을 하려고 할 것이고 클라이언트는 192.168.0.10:3000을 가지고 서버와 HTTP통신을 하려 할 것이다. 이렇게 각자 서버와 클라이언트가 착각을 하게 된다. 그러면 이런 방식이 어떤점이 좋을 것일까?

Semmetric 방식에서 설명을 하면 다음과 같다. 위의 그림처럼 호스트가 여러대 있는데 이 호스트들이 전부 웹서버 A에 접속한다고 해보자. 그러면 호스트 여러대가 웹서버에 접속한거지만 실제 웹서버 A는 3.3.3.3이라는 호스트가 여러번 접속한 것처럼 느꺼질 것이다. 즉, 이렇게 하면 여러대 호스트가 하나의 public IP로 인터넷을 사용할 수 있게 된다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.

0개의 댓글