Engineering/etc.

STUN 서버 구축하기

mutjang2 2025. 5. 7. 16:32

STUN(Session Traversal Utilities for NAT)이란?

 

클라이언트가 NAT 환경에 있을때, 자신의 Public IP와 포트를 알아내는 용도의 프로토콜이다.

STUN 클라이언트는 외부에 위치한 STUN 서버에게 자신의 Private IP를 담은 STUN 패킷을 보내면, STUN 서버는 실제 전달 받은 IP와 Port를 비교와 판단을 하고, 응답메세지에 Public IP를 담아 클라이언트에 전송한다. 클라이언트는 그렇게 얻은 자신의 Public IP를 활용하여 peer to peer 통신을 할 수 있게된다.

 

하지만 두 단말이 같은 NAT 환경에 있을때와 어플리케이션 별로 NAT 테이블을 갱신하는 Symmetric NAT 환경의 사설망에서는 STUN을 사용할 수 없다. 이러한 경우에는 TURN(Traversal Using Relays around NAT) 프로토콜을 사용한다. TURN 클라이언트가 외부 인터넷에 위치한 TURN 서버에게 패킷을 전달하면, 서버가 패킷을 목적지로 릴레이하는 방식이다.

 

프로젝트에 필요한 서버는 STUN 서버이다. 오픈소스로 공개된 coturn을 이용하여 STUN 서버를 아주 간단히 설치할 수 있다.


coturn 패키지 설치

$ yum install -y coturn

epel 레포에서 coturn 패키지를 설치한다.

 

 

설정파일 작성 후 systemd unit 구동

$ vi /etc/coturn/turnserver.conf 

listening-port=3478
listening-ip=${Your IP}
relay-ip=${Your IP}
realm=stun_test_realm
fingerprint
lt-cred-mech
stun-only
:wq!

$ systemctl start coturn

 

테스트 하기

하기 url로 이동하여 구축한 STUN 서버로 패킷을 보내본다.

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

 

stun url 설정 후 Add Server

 

Gather candidates를 눌러 패킷을 보냄. 현재는 NAT긴 하지만 사설 대 사설이기 때문에 사설 IP를 응답 받았다.

 

패킷을 캡처해봐도 정상적으로 동작하는 것을 확인할 수 있다.