OPNsense IDS를 AI로 30분 만에 실전 차단으로 — 방화벽 켜놓고 방치하지 않기
방화벽을 설치하고 IDS를 켜놓는 것만으로는 충분하지 않습니다. 저도 OPNsense에 Suricata IDS를 활성화한 뒤 한동안 방치했습니다. 알림은 65건이 쌓여 있었고, 전부 allowed 상태였습니다. 공격이든 정상 트래픽이든 구분 없이 그냥 통과시키고 있었던 겁니다.
AI와 OPNsense REST API를 조합해 상태 파악부터 DROP 규칙 적용, 정상 트래픽 suppress, cron 자동화까지 약 30분으로 마무리한 과정을 공유합니다.
22건
실제 공격 차단
2,310개
DROP 규칙 활성화
30분
AI와 대화 소요 시간
매일
규칙 자동 업데이트
1방화벽을 켜놓기만 하면 끝인가
OPNsense에는 Suricata 기반의 IDS/IPS가 내장되어 있습니다. 메뉴에서 활성화하고 ruleset을 다운받으면 알림이 쌓이기 시작합니다. 여기까지만 하고 넘어가는 경우가 많습니다.
문제는 IDS는 탐지(Detection)만 하고, 차단(Prevention)은 별도 설정이 필요하다는 겁니다. 기본 상태에서는 의심스러운 패킷을 발견해도 로그에만 남길 뿐 통과를 허용합니다. 수개월간 IDS를 켜놓고도 실질적인 차단이 전혀 없었던 이유가 여기 있었습니다.
점검 전 상태
IDS 알림 65건 — 전부 allowed. 공격 시도와 정상 트래픽이 같은 처리를 받고 있었습니다. DROP 규칙 0개. 규칙 파일은 3개월 이상 업데이트 없음.
2IDS를 켜놓고도 안 막히는 이유 3가지
Policy Action을 Drop으로 바꿔도 규칙 파일에 반영 안 됨
OPNsense GUI에서 Policy → Action을 Drop으로 변경해도, 변경 사항은 즉시 적용되지 않습니다. configctl ids update 명령으로 규칙 파일을 재생성해야 실제로 DROP이 작동합니다. 설정 저장과 규칙 적용은 별개 단계입니다.
규칙 자동 업데이트 cron이 비활성화 상태
IDS 탐지 능력은 규칙 파일의 최신성에 달려 있습니다. 설치 직후 cron을 활성화하지 않으면, 처음 다운받은 규칙 파일 그대로 수개월이 지나갑니다. 새로운 CVE 탐지 규칙이 전혀 추가되지 않은 상태에서 운영됩니다.
정상 트래픽 suppress 미처리
백업 서버로의 SSH 연결, GitHub CDN에 대한 npm 패키지 다운로드 등은 IDS가 의심 트래픽으로 감지합니다. suppress 설정 없이 전체 DROP을 걸면 이 트래픽까지 차단됩니다. 정상/비정상 분류 없이는 실전에 쓸 수 없습니다.
3준비 — SSH 키 등록과 API 접근
AI가 OPNsense를 직접 제어하려면 두 가지 접근 방법이 필요합니다. SSH를 통한 직접 명령 실행과, REST API를 통한 설정 변경입니다.
SSH 키 등록
서버에서 공개키를 확인한 뒤, OPNsense 웹 GUI의 System → Access → Users → root → Authorized keys에 붙여넣으면 됩니다. 간단해 보이지만 OPNsense가 FreeBSD 기반이라 몇 가지 주의가 필요합니다.
FreeBSD 기반 주의사항
sed -i명령이 동작하지 않습니다 (GNU sed와 BSD sed 차이)- 기본 셸이
csh이므로 bash 스크립트 직접 실행에 주의 - 패키지 관리자가
apt가 아니라pkg - 파일 편집은 GUI Authorized keys 항목을 직접 사용하는 것이 가장 안전
API 키 생성
OPNsense 웹 GUI에서 System → Access → Users의 API 탭에서 API Key와 API Secret을 생성합니다. 생성 즉시 다운로드되며, 이후에는 Secret을 다시 확인할 수 없습니다.
4OPNsense API 활용
OPNsense는 대부분의 기능을 REST API로 제어할 수 있습니다. AI에게 API_KEY와 API_SECRET 변수를 환경변수로 전달하면, curl 한 줄로 방화벽 상태를 조회하고 설정을 변경할 수 있습니다.
# 기본 설정
API="https://192.168.1.1/api"
AUTH="$API_KEY:$API_SECRET"
# 펌웨어 상태 확인
curl -sk "$API/core/firmware/status" -u "$AUTH"
# IDS 알림 조회 (최근 100건)
curl -sk "$API/ids/service/queryAlerts" \
-u "$AUTH" -X POST \
-d '{"current":1,"rowCount":100}'
# 규칙 업데이트 적용
curl -sk "$API/ids/service/updateRules" \
-u "$AUTH" -X POST
# IDS 서비스 재시작
curl -sk "$API/ids/service/restart" \
-u "$AUTH" -X POSTAI가 이 API들을 순서대로 호출하면서 현재 상태를 파악하고, 변경 사항을 적용하고, 결과를 검증하는 흐름으로 진행됩니다. 사람이 GUI를 클릭하는 것보다 훨씬 빠르고 일관성 있게 처리됩니다.
자체 서명 인증서 처리
OPNsense는 기본으로 자체 서명 인증서를 사용합니다. curl -sk의 -k 플래그로 인증서 검증을 건너뜁니다. 내부 네트워크에서만 사용하므로 보안 위험은 낮습니다.
5AI가 수행한 과정
AI에게 API 접근 정보를 주고 “방화벽 보안 상태를 점검하고 실전 차단 체계를 만들어달라”고 요청했습니다. 약 30분의 대화 동안 아래 순서로 진행됐습니다.
전체 상태 파악
펌웨어 버전, 인터페이스 구성, 게이트웨이 상태, 현재 IDS 알림 65건, NAT 설정, WireGuard VPN 상태, ZFS 풀 상태를 일괄 조회했습니다.
IDS 알림 65건 분석 및 분류
알림을 외부 공격(CVE 익스플로잇, 포트 스캔, Zmap)과 정상 트래픽(내부 백업 SSH, GitHub npm CDN)으로 분류했습니다. 차단해야 할 트래픽과 오탐으로 suppress해야 할 트래픽을 구분했습니다.
IDS 정책 변경 및 규칙 업데이트
Policy Action을 Alert에서 Drop으로 변경하고, ids/service/updateRules API로 규칙 파일을 재생성했습니다. 이 단계에서 2,310개의 DROP 규칙이 활성화됐습니다.
정상 트래픽 suppress 처리
외부 백업 서버 2대의 SSH 접속(sig_id 2001978)과 GitHub Actions SSH(20.200.245.247)를 suppress 규칙으로 등록해 오탐 알림을 제거했습니다.
규칙 자동 업데이트 cron 활성화
매일 00:00에 IDS 규칙을 자동 업데이트하도록 cron을 활성화했습니다. 이후부터는 새로운 CVE 탐지 규칙이 자동으로 반영됩니다.
6설정 후 결과
설정 전후를 비교하면 변화가 명확합니다. 65건 전부 통과에서 22건 차단, 15건 정상 허용으로 정리됐습니다.
| 항목 | 설정 전 | 설정 후 |
|---|---|---|
| IDS 알림 처리 | 65건 전부 allowed | 22건 blocked, 15건 allowed |
| DROP 규칙 수 | 미적용 (0개) | 2,310개 활성 |
| 규칙 업데이트 | 수동 (3개월 이상 방치) | 매일 00:00 자동 |
| 정상 트래픽 분류 | 미처리 | suppress 3건 처리 |
| 점검 기록 | 없음 | 날짜별 마크다운 저장 |
Suppress 설정 예시
sig_id 2001978은 “ET POLICY SSH session in progress on non-standard port” 규칙입니다. 외부 백업 서버 2대가 SSH로 접속하는 트래픽이 이 규칙에 걸렸습니다. 정상 트래픽이므로 해당 목적지 IP만 예외 처리했습니다.
# OPNsense IDS Suppress 설정 suppress gen_id 1, sig_id 2001978, track by_dst, ip 14.51.225.150 # 외부 백업 서버 A suppress gen_id 1, sig_id 2001978, track by_dst, ip 211.213.5.223 # 외부 백업 서버 B suppress gen_id 1, sig_id 2001978, track by_dst, ip 20.200.245.247 # GitHub SSH
7차단된 실제 공격
DROP 규칙 적용 직후부터 실제 공격이 차단되기 시작했습니다. 공인 IP(218.48.87.25)로 향하는 트래픽 중 아래 공격들이 IDS에 의해 차단됐습니다.
차단된 공격 (blocked)
| 소스 IP | 국가 / 출처 | 공격 유형 | 결과 |
|---|---|---|---|
| 188.132.249.102 | 터키 | CVE-2020-10173 Command Injection | blocked |
| 86.183.56.241 | 영국 | CVE-2020-10173 Command Injection | blocked |
| 102.210.56.230 | 아프리카 | CVE-2020-10173 Command Injection | blocked |
| 20.65.195.112 | Azure | Zmap 포트 스캔 | blocked |
| 45.33.109.8 | Linode | Zmap 포트 스캔 | blocked |
| 40.76.124.166 | Azure | Zmap 포트 스캔 | blocked |
| 172.202.118.20 | Azure | Zmap 포트 스캔 | blocked |
정상 트래픽 (allowed 유지)
| 소스 IP | 용도 | 결과 |
|---|---|---|
| 199.232.162.172 | GitHub CDN (npm 패키지 다운로드) | allowed |
| 3.129.187.38 | SSH on 443 — 정보성 감지, 차단 불필요 | allowed |
CVE-2020-10173이란
Comtrend VR-3033 라우터의 Command Injection 취약점입니다. 2020년에 공개된 취약점임에도 터키, 영국, 아프리카 등 다양한 국가에서 여전히 스캐닝이 이루어지고 있습니다. IDS 규칙 업데이트가 없었다면 탐지조차 못 했을 공격입니다.
8방화벽 관리 팁
emerging-policy.rules는 DROP에 넣지 말 것
Emerging Threats의 emerging-policy.rules는 SSH 세션 감지, ZIP 내 EXE 파일 감지 등 정보성 규칙을 포함합니다. 이 규칙셋을 DROP 정책에 포함하면 정상적인 SSH 접속과 파일 다운로드가 차단됩니다. 반드시 Alert 또는 제외 처리해야 합니다.
# 정보성 규칙셋 — Alert만 설정, DROP 제외 emerging-policy.rules → Action: Alert (DROP 아님) emerging-exploit.rules → Action: Drop (실제 공격 탐지) emerging-scan.rules → Action: Drop (포트 스캔 탐지)
점검 결과를 날짜별 마크다운으로 저장
방화벽 점검 결과를 날짜별 마크다운 파일로 기록해두면 두 가지 장점이 있습니다. 추후 보안 감사 때 바로 꺼내 쓸 수 있고, 시간에 따른 공격 패턴 변화를 추적할 수 있습니다.
# 점검 기록 파일 예시 firewall-review/ ├── 2026-04-06.md ← IDS 활성화, DROP 규칙 2310개, suppress 3건 ├── 2026-05-01.md └── 2026-06-01.md
IDS 점검 주기
정리
IDS는 켜놓는 것과 실제로 작동하는 것 사이에 꽤 큰 차이가 있습니다. Policy 변경 후 규칙 재적용, cron 활성화, suppress 처리 — 이 세 단계가 빠지면 IDS는 로그 수집 도구에 불과합니다.
AI와 API를 활용하면 이 과정을 30분 만에 완료할 수 있습니다. 알림 분류도, suppress 설정도, cron 활성화도 AI가 순서대로 처리합니다. 월 1회 점검 루틴에 AI를 포함시키면 방화벽 관리 부담을 크게 줄일 수 있습니다.
댓글
(5)로그인 하면 댓글을 작성할 수 있습니다.
점검 결과를 날짜별 마크다운으로 기록하는 팁이 좋네요. 보안 감사 때 바로 꺼내 쓸 수 있겠어요. emerging-policy.rules를 DROP에서 빼야 한다는 것도 실제로 겪어봐야 알 수 있는 내용입니다.
FreeBSD 기반이라 sed -i 안 되고 기본 셸이 csh인 부분에서 막힌 적 있었는데 잘 정리해주셨네요. Azure IP 대역에서 Zmap 스캔이 이렇게 많이 오는 줄은 몰랐습니다.
저도 IDS 알림이 수백 건인데 전부 allowed 상태라 뭔가 잘못된 것 같았는데, 이 글 보고 원인을 찾았습니다. 규칙 자동 업데이트 cron이 꺼져 있는 게 저도 문제였네요.
관련 글
© 2026 TreeRU. All rights reserved.
본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.