Unraid [1부] Unraid 보안의 기본 : CrowdSec 설치 및 Raw Table 강제 차단 가이드
* 본 글은 실제 Unraid 서버 운영 환경에서 철저한 검증 및 튜닝을 거쳐 작성된 실전 구축 가이드입니다.
Unraid에서 Nextcloud를 비롯한 개인 웹 서비스를 운영할 때 Cloudflare Proxy(오렌지 구름)를 켜두면 디도스 방어와 IP 은닉에는 유리하지만, 무료 플랜 특유의 100MB 단일 파일 업로드 제한과 해외 우회 라우팅으로 인한 속도 저하 때문에 대용량 파일 전송 시 답답함을 느끼게 됩니다.
이 문제를 해결하기 위해 Cloudflare를 DNS Only(직통 연결)로 전환하여 1Gbps~10Gbps의 회선 대역폭을 100% 온전히 사용하되, 외부에 노출된 서버의 보안 공백을 Nginx Proxy Manager(NPM) + CrowdSec(L7 침입 탐지) + iptables Raw Table(L3/L4 커널 레벨 사전 차단) 조합으로 완벽하게 방어하는 프로덕션급 방어망 구축법을 정리합니다.
[보안 레이어가 적용된 Unraid 인프라 개념도]💡 왜 일반 iptables 대신 'Raw Table'이어야 하는가?
Docker 컨테이너가 브리지 네트워크(`br0` 등)를 사용할 때 패킷은 호스트 OS의 일반 `INPUT` 체인을 완전히 우회하여 `PREROUTING → FORWARD → DOCKER-USER`로 직행합니다. 또한 대규모 무차별 대입 공격(Brute Force)이나 스캔 패킷이 유입될 때 리눅스의 연결 추적(Conntrack) 테이블이 가득 차면 서버 자체가 다운됩니다. 따라서 연결 추적이 시작되기도 전인 최상위 `raw` 테이블의 PREROUTING 단계에서 악성 IP를 즉시 DROP시키는 것이 무중단 고속 방어의 핵심입니다.
1. 구축 환경 및 준비물
- OS: Unraid 6.9 이상
- Reverse Proxy: Nginx Proxy Manager (공식 Docker)
- Target App: Nextcloud (AIO 또는 일반 Docker)
- Security Agent: CrowdSec (공식 Docker)
- Firewall Bouncer: CrowdSec-Firewall-Bouncer (Host 네트워크 + Privileged 모드)
- 플러그인: User Scripts (Community Applications에서 설치)
2. 사전 필수 작업: 실제 IP 보존 및 로깅 설정 (Self-Ban 방지)
CrowdSec이 공격자를 식별하려면 "실제 공격자의 공인 IP"가 로그 파일에 기록되어야 합니다. 이 단계를 누락하면 Nextcloud가 모든 접속자를 NPM 프록시 IP로 인식하여, 외부 공격 발생 시 NPM 자체를 차단(Self-Ban)해 버려 집안의 모든 웹 서비스가 오프라인이 됩니다.
2-1. Nextcloud config.php 수정
경로: /mnt/user/appdata/nextcloud/www/nextcloud/config/config.php
// 파일 로그 활성화
'log_type' => 'file',
'logfile' => 'nextcloud.log',
'loglevel' => 2,
// [필수] 역방향 프록시(NPM)를 신뢰하여 실제 클라이언트 원본 IP 기록
'trusted_proxies' =>
array (
0 => '192.168.0.0/16', // 내부 공유기 로컬 대역
1 => '172.16.0.0/12', // Docker 브리지 네트워크 대역
),
'forwarded_for_headers' =>
array (
0 => 'HTTP_X_FORWARDED_FOR',
),
3. CrowdSec (Agent) 설치 및 볼륨 마운트
3-1. CrowdSec 컨테이너 생성 시 필수 체크
- 포트 매핑: 호스트
8081→ 컨테이너8080(Unraid 기본 WebGUI 및 타 도커와의 포트 충돌 방지) - 볼륨 매핑 1 (NPM 로그):
/mnt/user/appdata/Nginx-Proxy-Manager/data/logs→/var/log/npm:ro - 볼륨 매핑 2 (Nextcloud 로그):
/mnt/user/appdata/nextcloud/data→/var/log/nextcloud:ro
3-2. acquis.yaml 설정 (로그 수집 대상 등록)
경로: /mnt/user/appdata/crowdsec/acquis.yaml
filenames:
- /var/log/npm/proxy-host-*_access.log
- /var/log/npm/default-host_access.log
labels:
type: nginx-proxy-manager
---
filenames:
- /var/log/nextcloud/nextcloud.log
labels:
type: Nextcloud
3-3. 필수 파서 설치 및 Bouncer API Key 생성
Unraid 터미널(Web CLI)을 열고 다음 명령어들을 실행합니다.
# 1. NPM 및 Nextcloud 전용 파서/시나리오 컬렉션 설치
docker exec crowdsec cscli collections install crowdsecurity/nginx-proxy-manager
docker exec crowdsec cscli collections install crowdsecurity/nextcloud
# 2. CrowdSec 엔진 재시작
docker restart crowdsec
# 3. 방화벽 Bouncer용 신규 API 키 발급
docker exec crowdsec cscli bouncers add UnraidBouncer
📌 3번 명령어 실행 후 화면에 출력되는 API Key(예: BSDAF32f8M...)는 단 한 번만 표시되므로 반드시 메모장에 안전하게 복사해 두세요.
4. Firewall Bouncer 설정 (핵심 연동)
실질적으로 커널 레벨의 ipset을 생성하고 관리하는 Bouncer 컨테이너를 설치합니다.
⚠️ 주의: Docker 템플릿 설정에서 반드시 Network Mode를 'Host'로, Privileged 모드를 'On'으로 활성화해야 리눅스 커널 방화벽에 접근할 수 있습니다.
설정 경로: /mnt/user/appdata/crowdsec-firewall-bouncer/crowdsec-firewall-bouncer.yaml
mode: iptables
update_frequency: 10s
# API 설정 (브리지 게이트웨이 172.17.0.1 및 8081 포트 지정)
api_url: http://172.17.0.1:8081/
api_key: [3-3 단계에서 발급받은 API 키]
log_mode: file
log_dir: /var/log/
log_level: info
insecure_skip_verify: false
disable_ipv6: false
deny_action: DROP
deny_log: false
# [핵심] 차단 스크립트가 식별할 ipset 이름 패턴
blacklists_ipv4: crowdsec-blacklists
blacklists_ipv6: crowdsec6-blacklists
ipset_type: nethash
iptables_chains:
- INPUT
- FORWARD
- DOCKER-USER
nftables:
ipv4:
enabled: false
ipv6:
enabled: false
5. 상세 가이드: 텔레그램 실시간 알림 연동
공격자가 감지되어 차단될 때마다 모바일로 실시간 알림을 받아볼 수 있도록 텔레그램 봇을 연동합니다.
설정 경로: /mnt/user/appdata/crowdsec/notifications/http.yaml
type: http
name: telegram_notification
log_level: info
format: |
{
"chat_id": "본인의_텔레그램_CHAT_ID",
"text": "🚨 [CrowdSec 차단 알림] 🚨\n{{range . -}}\n► 탐지 사유: {{.Scenario}}\n{{range .Decisions -}}► 차단 IP: {{.Value}}\n► 차단 기간: {{.Duration}}\n{{end -}}{{end -}}"
}
url: https://api.telegram.org/bot본인의_텔레그램_BOT_TOKEN/sendMessage
method: POST
headers:
Content-Type: application/json
파일 저장 후 /mnt/user/appdata/crowdsec/profiles.yaml 파일 상단의 notifications: 항목 아래에 - telegram_notification을 추가하고 컨테이너를 재시작(docker restart crowdsec)하면 즉시 적용됩니다.
6. 핵심: Raw Table 강제 차단 스크립트 (User Scripts)
Unraid 브리지 네트워크 구조상 일반 INPUT 체인이 무시되는 문제를 완벽히 해결하기 위해, 패킷 처리 최상위 단계인 raw 테이블의 PREROUTING에 Bouncer의 ipset 목록을 직접 연결합니다.
User Scripts 등록
- Unraid 웹 GUI → Settings → User Scripts 이동
- Add New Script 클릭 → 이름:
CrowdSec-RawTable-Link입력 - 스케줄을 At Startup of Array로 설정하고 아래 스크립트를 저장합니다.
#!/bin/bash
# ----------------------------------------------------------------
# CrowdSec Raw Table 연동 및 Conntrack 바이패스 차단 스크립트
# ----------------------------------------------------------------
BOUNCER_CONTAINER="CrowdSec-Firewall-Bouncer"
IPV4_PATTERN="crowdsec-blacklists-"
IPV6_PATTERN="crowdsec6-blacklists-"
MAX_RETRIES=30
WAIT_INTERVAL=5
echo "⏳ [$(date)] CrowdSec Bouncer 컨테이너 및 ipset 대기 시작..."
# 1. Bouncer 컨테이너 실행 확인 및 ipset 생성 대기 (최대 150초 타임아웃 안전장치)
COUNT=0
while [ $COUNT -lt$MAX_RETRIES ]; do
if [ "$(docker inspect -f '{{.State.Running}}'$BOUNCER_CONTAINER 2>/dev/null)" != "true" ]; then
docker start $BOUNCER_CONTAINER >/dev/null 2>&1
fi
if ipset list -n | grep -q "${IPV4_PATTERN}0" 2>/dev/null; then
echo "🛡️ ipset 생성 확인 완료 (소요 시간: $((COUNT * WAIT_INTERVAL))초)"
break
fi
sleep $WAIT_INTERVAL
((COUNT++))
done
# 2. Raw 테이블 PREROUTING 체인에 즉각 DROP 규칙 주입 (IPv4 & IPv6 동시 적용)
for IPT in "iptables" "ip6tables"; do
PATTERN=$IPV4_PATTERN
[ "$IPT" == "ip6tables" ] && PATTERN=$IPV6_PATTERN
for SET_NAME in $(ipset list -n | grep "$PATTERN" 2>/dev/null); do
# 중복 방지를 위해 기존 룰 삭제 후 최상단(-I) 주입
$IPT -t raw -D PREROUTING -m set --match-set "$SET_NAME" src -j DROP 2>/dev/null
$IPT -t raw -I PREROUTING -m set --match-set "$SET_NAME" src -j DROP 2>/dev/null
done
done
echo "✅ [$(date)] CrowdSec Raw Table 연동 완료! 악성 패킷이 Conntrack 진입 전 완벽히 차단됩니다."
7. 최종 동작 검증
설정을 완료한 후 Unraid 터미널에서 다음 3가지 명령어로 정상 방어 상태를 확인합니다.
# 1. Bouncer와 메인 엔진 간 연결 상태 확인 (Valid 표시 확인)
docker exec crowdsec cscli bouncers list
# 2. raw 테이블 PREROUTING에 차단 룰 및 패킷 카운트 확인
iptables -t raw -L PREROUTING -v -n | grep crowdsec
# 3. 현재 등록된 활성 차단 IP 목록 확인
docker exec crowdsec cscli decisions list
마치며
이제 대용량 파일 전송을 저해하던 Cloudflare Proxy 없이도, 원본 1Gbps~10Gbps 속도를 만끽하며 서버 리소스 낭비 없는 강력한 엔터프라이즈급 침입 차단 시스템을 갖추게 되었습니다.
다음 2편에서는 이렇게 구축된 튼튼한 방화벽 기반 위에서 온 가족 기기의 광고를 박멸하고 어디서나 내 집 네트워크로 안전하게 터널링하는 AdGuard Home & WireGuard 최적화 구축 가이드를 다루겠습니다.