NAT(network address translation)뒤에 있는 사설 네트워크를 사용하는 두 client끼리 직접 통신을 할 수 있게 만들어 주는 것을 말한다.

이는 NAT뒤에 있지 않는 서버를 통해 서로 응답하는 방법으로도 해결할 수 있지만, 결국 서버를 거쳐서 보내야하기 때문에 속도가 느려질 수 있다.

Hole Punching이 이루워지는 과정은 다음과 같다.

제목 없음.jpg

  1. NAT뒤에 사설네트워크를 사용하는 두 client가 STUN 서버로 자신의 private IP, port를 보내준다. 그렇게 되면 STUN 서버는 두 client의 public IP,port와 private IP, port를 알게 된다.
  2. STUN 서버는 연결하려는 두 CLIENT에게 상대방의 public IP,port와 private IP, port를 알려준다. 이렇게 되면 서로는 서로의 public IP,port와 private IP, port를 알게 된다.
  3. 우선 같은 network에 존재할 수 있기 때문에 private IP, port로 연결을 시도한다.
  4. 실패할 경우 public IP,port로 연결을 시도한다

만약 연결이 되지 않았으며, 포트를 바꾸는 등의 여러 시도를 해도 연결이 되지 않았을 때에는 중간에 TURN 서버를 둔 다음 TURN 서버가 중계할 수 있게 만들어 연결하는 방법을 사용한다.

제목 없음.jpg

TURN 서버의 경우 NAT 뒤에 있는 사설 네트워크를 사용하지 않음으로 이를 해결할 수 있지만, 결국 사설 TURN 서버를 거쳐가야 하기 때문에 속도가 현저히 낮아진다.

모든 NAT가 Hole Punching이 가능한 것은 아니다.

<aside> 💡

NAT은 다음과 같이 크게 4가지 방식이 있다.

Full Cone NAT

가장 간단한 NAT방식으로 private IP/port가 매핑되면, 누구든 간에 그 public/port로 접근 시, host에게 통신을 시도할 수 있는 방식이다.

Restricted Cone NAT

Full Cone NAT에서 제한이 걸린 방식으로 기존에 통신하던 Service의 IP가 아니라면 Host에게로 패킷이 도달하지 않는다. 이때 다른 port까지는 허용한다.

Port Restricted Cone NAT

Restricted Cone NAT에서 제한이 더 걸린 방식으로 기존에 통신하던 Service의 IP뿐 아니라 port까지도 같지 않으면 Host에게로 패킷이 도달하지 않는다.

Symmetric NAT

Host가 통신하는 대상에 따라 각각 다른 매핑정보를 가져가는 방식으로 매핑 정보가 계속해서 변한다고 말할 수 있다.

</aside>

이 4가지 방식중 Symmetric NAT 방식은 통신하는 대상에 따라 다른 public IP, port를 부여함으로 STUN서버로는 통신할 수 없고 TURN서버를 사용해야 통신할 수 있다.