본문으로 건너뛰기

fn-knock를 만든 이유

많은 사용자가 사진, 파일과 개인 서비스를 직접 관리하기 위해 NAS를 구입합니다. 설치를 마치고 나면 외부에서 홈 네트워크의 NAS에 접속할 경로가 필요합니다.

가장 직접적인 방법은 포트 포워딩입니다. 사진 라이브러리, 다운로드 도구, 관리 패널에 포트를 하나씩 열면 접속은 간단합니다. 그러나 포트를 인터넷에 공개하는 순간 사용자와 가족뿐 아니라 공인 주소를 상시 탐색하는 자동화 스캐너에도 노출됩니다. 사용자에게는 홈 네트워크의 서비스지만 공격자에게는 반복해서 탐색할 수 있는 진입점입니다.

fn-knock는 인터넷 접근 구성을 단순화하기 위해 시작된 프로젝트입니다. 기존 서비스는 그대로 유지하고 외부 진입점은 fn-knock가 통합합니다. 방문자의 로그인과 접근 권한을 확인한 뒤에만 게이트웨이가 NAS로 요청을 전달합니다.

서비스 앞에 문을 하나 더 두는 이유

2026년 초 fnOS에서 심각한 보안 사고가 발생했습니다. fnOS 팀은 이후 공개한 사고 설명에서 당시 권한 없는 접근, 경로 순회 및 인증 우회 취약점 세 가지를 발견해 수정했다고 밝혔습니다. 일부 공격 방식이 공개된 뒤 아직 업데이트하지 않은 기기를 대상으로 광범위한 탐색과 공격이 시작되었습니다.

Qi-Anxin XLab의 악성 샘플 분석에 따르면 감염된 일부 기기는 Netdragon 봇넷에 편입되어 DDoS 공격과 원격 명령 실행에 사용되었습니다. 악성 프로그램은 방화벽 규칙과 hosts 파일도 변경해 기기가 업데이트를 받지 못하게 방해했습니다.

이 사고는 매우 현실적인 교훈을 남겼습니다. 로그인 페이지와 2단계 인증은 정상적인 로그인 절차만 보호할 수 있습니다. 로그인 전에 취약점이 있거나 공격자가 기존 인증을 우회할 수 있다면 인증 요소를 아무리 많이 추가해도 해당 요청을 막을 수 없습니다.

이는 fnOS만의 문제가 아닙니다. NAS 시스템, 서드파티 애플리케이션 및 Docker 컨테이너는 모두 코드가 업데이트되며 새로운 취약점이 생길 수 있습니다. 업데이트는 여전히 제때 해야 하지만 “최신 버전이니 괜찮다”는 생각에 모든 것을 맡길 수는 없습니다. 진입점을 하나 덜 공개할 때마다 공격자가 서비스에 직접 닿을 수 있는 경로도 하나씩 줄어듭니다.

Basic Auth의 한계

Lucky나 Nginx 같은 도구를 사용하면 페이지에 Basic Auth를 간편하게 추가할 수 있습니다. 페이지를 임시로 보호하거나 무작위 스캔을 일부 걸러 내는 데 유용합니다.

하지만 Basic Auth는 일반적으로 장기간 사용하는 계정과 비밀번호 한 쌍입니다. 네트워크로 전달되는 자격 증명은 Base64로 인코딩될 뿐 암호화되지 않으므로 반드시 HTTPS와 함께 사용합니다. MDN에서도 이를 명확하게 경고합니다. 자격 증명이 한 번 유출되면 이를 얻은 사람이 계속 사용할 수 있습니다.

실제 사용 환경에서는 호환성 문제도 있습니다. 브라우저, WebDAV, 미디어 플레이어 및 모바일 클라이언트마다 인증 헤더를 처리하는 방식이 완전히 같지 않습니다. 로그인 대화상자가 반복해서 나타나거나 특정 클라이언트를 아예 사용할 수 없는 경우도 흔합니다. 결국 경로나 클라이언트별 예외를 계속 추가하게 됩니다.

Basic Auth는 보조 수단으로 사용할 수 있지만 NAS의 인터넷 접근을 보호하는 유일한 자격 증명으로는 충분하지 않습니다. fn-knock는 독립적인 로그인 자격 증명과 세션을 사용합니다. TOTP, 패스키 및 외부 계정을 추가하고 세션을 확인하거나 취소할 수 있으며 자격 증명마다 접근 가능한 서비스도 제한할 수 있습니다.

WAF와 fn-knock의 역할

SafeLine 같은 WAF는 공개 웹사이트를 보호하는 데 적합합니다. 공개 웹사이트는 원래 모든 방문자를 받아야 하며 WAF는 요청에서 SQL 삽입, XSS, 경로 순회 및 악성 봇을 식별합니다.

NAS 관리 패널, 다운로드 도구 및 개인 사진 앨범은 일반적으로 모르는 방문자를 받을 필요가 없습니다. 모든 요청이 서비스에 먼저 닿은 뒤 공격 여부를 판단하게 하기보다 로그인하지 않은 사람은 아예 서비스에 도달하지 못하게 하는 편이 낫습니다.

두 가지를 함께 사용할 수 있습니다. fn-knock도 WAF, 스캔 차단, 차단 목록 및 요청 제한을 제공합니다. 로그인은 방문자에게 권한이 있는지 확인하고 WAF는 게이트웨이에 들어온 요청에 이상이 있는지 계속 검사하며 각자의 역할을 수행합니다.

Tailscale 또는 ZeroTier와의 차이

Tailscale, ZeroTier, EasyTier 및 WireGuard는 모두 성숙한 가상 네트워크 솔루션입니다. 사용하는 기기가 비교적 고정되어 있고 모든 기기에 클라이언트를 설치할 수 있다면 훨씬 철저하게 네트워크를 격리할 수 있습니다.

문제는 휴대전화, 태블릿 및 컴퓨터를 모두 가상 네트워크에 먼저 연결해야 한다는 점입니다. 다른 기기를 잠시 사용하거나 가족에게 서비스를 공유할 때마다 클라이언트 설정을 다시 구성합니다. 기기에서 다른 VPN이나 프록시를 이미 사용하고 있다면 라우팅, DNS 또는 시스템 VPN 권한이 충돌할 수도 있습니다.

fn-knock는 다른 사용 방식을 지향합니다. 브라우저를 열고 자신의 도메인을 입력한 뒤 로그인해서 바로 사용합니다. 모든 기기에 가상 네트워크 클라이언트를 설치할 필요가 없으며 기기 전체의 네트워크 출구를 제어하지도 않습니다.

어느 한 방식이 항상 더 나은 것은 아닙니다. 인터넷 진입점을 전혀 공개하지 않으려면 가상 네트워크를 선택합니다. 가족 구성원이 사진 앨범이나 미디어 라이브러리 같은 웹 서비스에 간편하게 접속해야 한다면 인터넷 진입점에 fn-knock를 배치할 수 있습니다.

fn-knock가 실제로 하는 일

웹 서비스를 예로 들면 서비스마다 서브도메인을 할당할 수 있습니다.

text
auth.example.com    로그인 진입점
nas.example.com     NAS
media.example.com   미디어 라이브러리
download.example.com 다운로드 도구

이 도메인은 모두 fn-knock 게이트웨이에 먼저 도달합니다. 로그인하지 않은 방문자는 인증 페이지로 이동하며, 로그인에 성공하면 게이트웨이가 요청을 해당 내부 서비스로 전달합니다. 외부에는 통합 진입점 하나만 공개하고 서비스별 원본 포트는 공개하지 않습니다.

집에 공인 IP가 없다면 FRP나 Cloudflared로 리버스 프록시 모드를 구성할 수 있으며 로그인과 서비스 매핑의 사용 방식은 그대로입니다. TCP / UDP 원본 포트를 꼭 유지해야 하는 일부 서비스는 호스트 방화벽 제어를 지원하는 플랫폼에서 직접 연결 접근 허용을 사용할 수 있습니다.

한 번의 접근은 대략 다음 단계를 거칩니다.

  1. 게이트웨이가 스캔 동작, 차단·허용 목록 및 접근 출발지를 확인합니다.
  2. 로그인이 필요한 서비스에서 현재 세션을 확인합니다.
  3. 사용자가 TOTP, 패스키, 계정 비밀번호 또는 외부 계정으로 로그인합니다.
  4. 게이트웨이가 해당 자격 증명에 현재 서비스 접근 권한이 있는지 확인합니다.
  5. 요청이 WAF 등의 검사를 통과한 뒤 내부 서비스로 전달됩니다.
  6. 접근 결과가 요청 로그에 기록되며 이상이 있으면 알림을 보낼 수 있습니다.

매핑에 로그인 보호를 활성화했다면 유효한 세션이 없는 요청은 업스트림으로 전달되지 않습니다. 이 보호가 효과를 내려면 모든 인터넷 트래픽이 fn-knock를 거쳐야 하며 기존 서비스 포트를 별도로 공개하지 않습니다.

요청 흐름

text
방문자

DNS / 라우터 / CDN / 터널

fn-knock 게이트웨이
  ├─ 로그인, 세션, 허용 목록, WAF, 요청 로그
  └─ 도메인, 경로 또는 프로토콜에 따라 내부 네트워크 서비스 선택

NAS, 파일 서비스, 미디어 서비스 또는 기타 자체 호스팅 서비스

관리 패널은 관리자가 fn-knock를 설정할 때만 사용하며 일반 방문자를 위한 서비스 진입점이 아닙니다. 실제 실행에는 다음 세 가지 구성 요소가 함께 작동합니다.

구성 요소역할
Rust 서비스관리 패널, 로그인 인증, 보안 정책, 인증서, DDNS, 터널 및 운영 작업 관리
Go 게이트웨이외부 요청을 받고 로그인 검사, 서비스 라우팅 및 리버스 프록시 수행
SQLite설정과 실행 데이터를 저장하며 Redis를 별도로 설치할 필요가 없음

관리 페이지는 설치 패키지와 이미지에 포함되어 있어 정상 실행에 Node.js를 설치할 필요가 없습니다. 플랫폼마다 관리 포트, 게이트웨이 포트 및 수신 범위가 다르므로 배포할 때는 포트, 진입점 및 접근 경로를 확인합니다.

fn-knock가 보호할 수 있는 것과 없는 것

fn-knock는 게이트웨이를 거치는 요청만 보호할 수 있습니다. 라우터에서 기존 관리 포트를 계속 포워딩하거나 클라우드 플랫폼에 다른 오리진 주소가 남아 있으면 공격자가 여전히 우회할 수 있습니다.

설치한 뒤에도 다음 항목을 유지합니다.

  • NAS 시스템, Docker 이미지 및 서비스를 제때 업데이트합니다.
  • 더 이상 사용하지 않는 인터넷 공개 포트와 오리진 주소를 닫습니다.
  • 라우터, CDN 및 리버스 프록시가 방문자 IP를 올바르게 전달하도록 설정합니다.
  • 계정마다 필요한 서비스만 할당하고 높은 권한의 자격 증명을 공유하지 않습니다.
  • 설정, 인증서 및 중요 데이터를 정기적으로 백업합니다.
  • 모바일 데이터로 전체 인터넷 로그인 절차를 테스트합니다.

fn-knock는 홈 네트워크에서 바로 사용할 수 있도록 일부 LAN, 루프백 및 사설망 출발지를 기본적으로 허용합니다. 따라서 LAN에서 페이지가 열린다고 인터넷 로그인 구성이 올바른 것은 아닙니다. 모바일 데이터 같은 실제 외부 네트워크에서 테스트합니다.

먼저 문을 통과한 뒤 서비스에 접근

보안 도구에는 흔히 두 가지 문제가 있습니다. 간단한 기능만으로는 부족하고 전문 도구는 설정하기 어렵습니다. 많은 사용자는 휴대전화에서 집의 사진과 파일을 안전하게 열고 싶을 뿐, 리버스 프록시, 방화벽, 인증서와 다양한 인증 프로토콜부터 모두 배우고 싶지는 않습니다.

fn-knock는 이러한 단계를 한곳에 모아 사용자가 휴대전화만으로도 설치, 로그인, 서비스 매핑 및 기본 보호를 마칠 수 있게 하려 합니다. 서비스에 취약점이 생길 가능성은 사라지지 않지만 로그인하지 않은 사람이 서비스에 먼저 닿을 수 없게 하면 위험을 크게 줄일 수 있습니다.

fn-knock를 설치하면 절대 안전하다고 약속하지 않으며 이를 이유로 시스템 업데이트를 중단하라고 권하지도 않습니다. 이 제품은 한 가지 현실적인 일을 합니다. 방문자가 누구인지 먼저 확인하고 문을 열지 결정합니다.

서비스 하나를 먼저 연결해 사용해 볼 수 있습니다.

참고 자료

최종 업데이트:

QQ 커뮤니티: 1081609274