반응형

Cloudflare Tunnel은 공유기 포트 개방 없이 NAS에 구축한 서비스를 외부에 공개할 때 사용하는 솔루션이다. 도커(Docker)에 cloudflared 컨테이너를 실행하면 암호화된 터널을 통해 트래픽을 중계한다. cloudflared는 통신 효율을 위해 QUIC 프로토콜을 우선적으로 사용한다.

QUIC은 UDP의 빠른 속도와 TCP의 신뢰성을 결합한 차세대 전송 프로토콜이다. 연결 설정 과정(Handshake)을 최소화하여 초기 접속 속도가 매우 빠르고, 여러 데이터 스트림을 독립적으로 처리해서 다른 스트림 전송에 미치는 영향을 최소화한다.

 

리눅스 기반인 시놀로지 NAS는 컨테이너 로그에 다음과 같은 경고 메시지가 표시될 수 있다.

failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 7168 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.

 

이 메시지는 cloudflared가 QUIC 프로토콜을 사용할 때 필요한 UDP 수신 버퍼 크기를 충분히 확보하지 못했다는 의미다.

 

리눅스 운영체제는 기본적으로 네트워크 버퍼 크기에 상한선을 두고 있다. QUIC은 UDP 기반 프로토콜이므로 높은 네트워크 처리량을 확보하려면 비교적 큰 버퍼 공간이 필요하다. 그러나 호스트 OS에 설정된 상한선 때문에 cloudflared가 원하는 크기만큼 수신 버퍼를 늘리지 못한 것이다.

 

이 경고가 표시되더라도 터널 연결 자체가 실패하지는 않는다. 일반적인 사용 환경에서는 큰 영향을 주지 않으므로 무시해도 된다. 다만 네트워크 처리량이 많은 환경에서는 성능 저하가 발생할 수 있으므로 버퍼 크기를 조정하는 것이 좋다.

 

 

수정 방법


먼저 NAS에 SSH(접속 가이드)로 접속한 뒤 UDP 송수신 버퍼의 최대 크기를 확인한다. 기본값이 적용된 상태에서는 다음과 같이 약 208 KiB로 표시된다.

sysctl net.core.rmem_max
sysctl net.core.wmem_max

# net.core.rmem_max = 212992
# net.core.wmem_max = 212992

 

net.core.rmem_max는 소켓 하나가 사용할 수 있는 수신 버퍼의 최대 크기, net.core.wmem_max는 송신 버퍼의 최대 크기다. cloudflared는 QUIC 연결을 사용할 때 약 7 MiB의 UDP 수신 버퍼를 요청한다.

 

다음 명령어를 실행해서 UDP 송수신 버퍼의 최대 크기를 7,500,000 bytes로 늘린다.

sudo sysctl -w net.core.rmem_max=7500000
sudo sysctl -w net.core.wmem_max=7500000

 

설정값이 반영됐는지 다시 확인한다.

sysctl net.core.rmem_max
sysctl net.core.wmem_max

# net.core.rmem_max = 7500000
# net.core.wmem_max = 7500000

 

이제 cloudflared 컨테이너를 재시작하고 로그를 확인해 보자. 기존 경고 메시지가 더 이상 표시되지 않으면 설정이 정상적으로 적용된 것이다.

 

 

작업 스케줄러 등록


sysctl -w 명령어로 변경한 값은 NAS를 재부팅하면 초기화된다. 재부팅 후에도 설정을 유지하려면 DSM 작업 스케줄러에 부팅 시 실행되는 스크립트를 등록해야 한다.

 

DSM 제어판 > 작업 스케줄러 > 생성 > 트리거된 작업 > 사용자 정의 스크립트를 클릭한다.

 

[일반] 탭에서 작업 이름, 사용자, 이벤트를 설정한다.

  • 작업: Increase UDP Buffer Size
  • 사용자: root
  • 이벤트: 부트업 (부팅 시 실행)

 

[작업 설정] 탭에서 사용자 정의 스크립트를 입력한다.

 

사용자 정의 스크립트 ▼

#!/bin/sh

sysctl -w net.core.rmem_max=7500000
sysctl -w net.core.wmem_max=7500000

 

작업을 등록한 뒤 NAS를 재부팅하고 SSH에 접속해서 버퍼 최대 크기를 확인해 보자. 아래 명령어 출력값이 모두 7500000으로 표시되면 부팅 스크립트가 정상적으로 실행된 것이다.

sysctl net.core.rmem_max
sysctl net.core.wmem_max

# net.core.rmem_max = 7500000
# net.core.wmem_max = 7500000

 

 

레퍼런스


 

 

UDP Buffer Sizes

A production-ready QUIC implementation in pure Go. Contribute to quic-go/quic-go development by creating an account on GitHub.

github.com

반응형