STUN 서버란?
STUN 서버에 대한 내용은 잘 정리된 블로그가 많으니 링크로 대체.
구글 등 무료로 제공되는 STUN 서버들이 많으니 STUN 서버를 구축할 필요는 없지만.
TURN 서버는 STUN 을 포함한 기능이기에 STUN에 대해 알아볼겸 보고있다.
STUN 서버 RFC5389
- STUN protocol에 대해 알아본다.
STUN Message Header
STUN 메시지 헤더는 위와 같이 구성되어있다.
- 2bit 00
- 14bit STUN Message Type ( 이중 2bit 는 class, 나머지 12bit 는 method)
- 16bit Message Length (STUN Message Header의 20byte 는 제외)
- 32bit Magic Cookie (0x2112A442 으로 fixed , RFC5389 STUN 구분용도)
- 96bit TransactionID
STUN Message Header — STUN Message Type Field
- M11 ~ M0 : 12 bit 는 method를 나타낸다.
- C1 , C0 : 2bit 는 class 를 나타낸다.
class bit 가 00 -> request
class bit 가 01 -> indication
class bit 가 10 -> success response
class bit 가 11 -> error response
Example >
Binding Request(class = 00, method = 000000000001) -> hex = 0x0001Binding Response(class = 10, method = 000000000001) -> hex = 0x0101
STUN Attribute
- STUN Attributes 의 포멧은 아래와 같다.
STUN Attribute Registry 섹션을 확인하자.
- STUN Attribute Type 은 Hex number 0x0000–0xFFFF 의 범위로 구성
- 0x0000-0x7FFF 범위는 considered comprehension-required
- 0x8000-0xFFFF 범위는 considered comprehension-optional
Comprehension-required range (0x0000-0x7FFF):
0x0000: (Reserved)
0x0001: MAPPED-ADDRESS
0x0002: (Reserved; was RESPONSE-ADDRESS)
0x0003: (Reserved; was CHANGE-ADDRESS)
0x0004: (Reserved; was SOURCE-ADDRESS)
0x0005: (Reserved; was CHANGED-ADDRESS)
0x0006: USERNAME
0x0007: (Reserved; was PASSWORD)
0x0008: MESSAGE-INTEGRITY
0x0009: ERROR-CODE
0x000A: UNKNOWN-ATTRIBUTES
0x000B: (Reserved; was REFLECTED-FROM)
0x0014: REALM
0x0015: NONCE
0x0020: XOR-MAPPED-ADDRESS
Comprehension-optional range (0x8000-0xFFFF)
0x8022: SOFTWARE
0x8023: ALTERNATE-SERVER
0x8028: FINGERPRINT
- 클라이언트의 reflexive transport address 를 나타낸다.
- 앞의 8bit는 32bit 단위로 구성하기위해 0으로 설정된다.
- 8 bit family , 16bit port , ip 주소를 나타내는 고정길이 값으로 구성.
- family가 IPv4 인 경우 주소 길이는 32bit
- family가 IPv6 인 경우 주소 길이는 128bit
- 모든 필드는 네트워크 바이트 순서여야 한다.
- MAPPED-ADDRESS 는 RFC-3489 클라이언트와의 하위 호완성을 위해
서버에서만 사용된다.
- reflexive transport address 가 XOR 난독화 되는 부분을 제외하면
MAPPED-ADDRESS 속성과 동일하다. - X-Port 는 port 정보 16bit 가 magic cookie의 앞 16bit 와 XOR 연산 된다.
- family가 IPv4 인 경우 X-ADDRESS는 32 bit로 magic cookie와 XOR 연산 된다.
- family가 IPv6 인 경우 X-ADDRESS는 128 bit 로 magic cookie + TrasactionID 와 XOR 연산 된다.
- 메시지 무결성을 위해 사용된다.
- 메시지 무결성 검사에 username과 password조합이 사용된다
- USERNAME의 값은 가변길이 값이다
- 값은 반드시 513bytes 보다 적은 UTF-8 [RFC3629] 인코딩된 시퀀스를 포함해야하며
, SASLprep [RFC4013] 를 사용하여 처리되어진 것이어야 한다.
Packet Sender 툴로 구글 STUN 서버(stun.l.google.com)를 호출해 보았다.
Binding Request Packet 은 아래와 같은 Hex data를 갖는다.
00 01 00 00 21 12 A4 42 6A 54 44 79 57 6F 42 62 37 30 36 48
구글 STUN 서버 호출 후 응답
Binding Response Packet Hex data는 아래와 같다.
01 01 00 0C 21 12 A4 42 6A 54 44 79 57 6F 42 62 37 30 36 48 XX XX XX
XX XX XX XX XX XX XX XX XX -- attribute 는 데이터는 XX처리 했다.
STUN 통신 프로토콜이 어찌되는지 찾아보다 정리했다.