현대 인터넷 환경에서 웹 서버는 매일 수많은 악성 공격에 노출됩니다. 해커들은 자동화된 도구를 사용해 취약점을 찾고 무차별 공격을 시도하며, 이러한 위협으로부터 서버를 보호하는 것은 더 이상 선택이 아닌 필수가 되었습니다.
다행히 AbuseIPDB라는 글로벌 악성 IP 데이터베이스와 CSF(ConfigServer Security & Firewall) 방화벽을 연동하면, 복잡한 보안 지식 없이도 전문가 수준의 서버 보안 자동화 시스템을 구축할 수 있습니다. 이 가이드는 모든 Linux VPS 환경에서 사용 가능하며, 각 단계를 상세히 설명하여 초보자도 쉽게 따라할 수 있도록 구성했습니다. 한 번 설정하면 여러분의 서버가 24시간 자동으로 악성 IP를 차단하며 스스로를 보호하게 될 것 입니다.

이 가이드로 만들 수 있는 것
- 자동 악성 IP 차단: 12시간마다 최신 악성 IP 목록을 받아와 자동 차단
- 실시간 모니터링: 웹 브라우저에서 차단 현황을 실시간으로 확인
- 무인 운영 시스템: 한 번 설정 후 관리자 개입 없이 자동 운영
- 범용 호환성: 모든 Linux VPS와 웹 패널에서 사용 가능
시작하기 전 준비사항
서버 보안 자동화 필요한 환경
- Linux VPS 서버 (Ubuntu, CentOS, Debian 등)
- CSF(ConfigServer Security & Firewall) 설치됨
- 웹서버 (Apache/Nginx) 및 PHP 설치됨 (모니터링 페이지용)
- SSH 접속 가능한 관리자 권한
1단계: 서버 SSH 접속
VPS 대시보드에서 서버 정보를 확인하고 SSH로 접속하세요.
ssh root@your-server-ip2단계: 필수 프로그램 설치
다음 명령어를 실행하세요.
# 패키지 목록 업데이트
sudo apt update
# 필수 도구 설치
sudo apt install jq curl nano -y각 프로그램의 역할:
jq: JSON 데이터 처리 도구curl: API 호출을 위한 도구nano: 파일 편집기
3단계: AbuseIPDB API 키 발급
- 웹브라우저에서 AbuseIPDB 웹사이트 접속
- 회원가입 후 로그인
- 상단 우측 계정 ID를 클릭하여 Account 메뉴 선택
- 상단 메뉴의 "API" 클릭
- "Create Key" 버튼을 눌러 API 키 생성
- 생성된 API 키를 메모장에 복사해두기 (나중에 사용)
4단계: 자동 차단 스크립트 만들기
4-1. 스크립트 파일 생성
sudo nano /usr/local/sbin/update-abuseipdb.sh4-2. 스크립트 내용 입력
나노 편집기가 열리면, 다음 내용을 복사해서 붙여넣기 하세요.
#!/bin/bash
# === 설정 변수 ===
API_KEY="YOUR_ABUSEIPDB_API_KEY_HERE"
LOG_FILE="/usr/local/sbin/abuseipdb.log"
CSF_DENY_FILE="/etc/csf/csf.deny"
TEMP_LIST_FILE="/tmp/abuseipdb_list.txt"
COMMENT_TAG="# AbuseIPDB Auto-Block"
WEB_STATUS_DIR="/home/domain.com/public_html/status"
# === 로그 기록 시작 ===
echo "========================================" > "$LOG_FILE"
echo "스크립트 실행 시작: $(date)" >> "$LOG_FILE"
# === AbuseIPDB API 호출 및 임시 파일 저장 ===
API_RESPONSE=$(curl -s -G "https://api.abuseipdb.com/api/v2/blacklist" \
-d confidenceMinimum=100 \
-H "Key: $API_KEY" \
-H "Accept: application/json")
# === API 응답 유효성 검사 ===
if echo "$API_RESPONSE" | jq -e '.data[0].ipAddress' > /dev/null 2>&1; then
echo "$API_RESPONSE" | jq -r '.data[].ipAddress' > "$TEMP_LIST_FILE"
IP_COUNT=$(wc -l > "$LOG_FILE"
# [핵심] 1. 기존에 추가했던 AbuseIPDB 목록을 csf.deny에서 제거
grep -v "$COMMENT_TAG" "$CSF_DENY_FILE" > "$CSF_DENY_FILE.tmp" && mv "$CSF_DENY_FILE.tmp" "$CSF_DENY_FILE"
echo "기존 AbuseIPDB 목록을 정리했습니다." >> "$LOG_FILE"
# [핵심] 2. 새로운 IP 목록을 주석과 함께 csf.deny 파일에 직접 추가
sed "s/$/ $COMMENT_TAG/" "$TEMP_LIST_FILE" >> "$CSF_DENY_FILE"
echo "새로운 IP 목록을 csf.deny 파일에 직접 추가했습니다." >> "$LOG_FILE"
# [핵심] 3. 방화벽 재시작으로 즉시 적용
csf -r >> "$LOG_FILE" 2>&1
echo "방화벽이 성공적으로 재시작되었습니다." >> "$LOG_FILE"
# 상태 확인 페이지용 파일 업데이트
cp "$TEMP_LIST_FILE" "$WEB_STATUS_DIR/blocked_ips.txt"
else
echo "오류: AbuseIPDB로부터 유효한 IP 목록을 받아오지 못했습니다." >> "$LOG_FILE"
echo "API 응답 내용: $API_RESPONSE" >> "$LOG_FILE"
> "$WEB_STATUS_DIR/blocked_ips.txt"
fi
# === 로그 및 상태 페이지 정리 ===
cp "$LOG_FILE" "$WEB_STATUS_DIR/execution_log.txt"
chmod 644 "$WEB_STATUS_DIR/blocked_ips.txt"
chmod 644 "$WEB_STATUS_DIR/execution_log.txt"
echo "스크립트 실행 완료: $(date)" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"4-3. 웹 패널별 경로 설정
스크립트에서 WEB_STATUS_DIR 부분을 여러분의 웹 패널 환경에 맞게 수정하세요:
일반적인 Apache/Nginx:
WEB_STATUS_DIR="/var/www/html/status"cPanel 환경:
WEB_STATUS_DIR="/home/username/public_html/status"CyberPanel 환경:
WEB_STATUS_DIR="/home/domain.com/public_html/status"Plesk 환경:
WEB_STATUS_DIR="/var/www/vhosts/domain.com/httpdocs/status"4-4. API 키 입력
YOUR_ABUSEIPDB_API_KEY_HERE 부분을 3단계에서 받은 실제 API 키로 교체하세요.
4-5. 파일 저장 및 권한 설정
- Ctrl + O → Enter → Ctrl + X 순서로 저장하고 종료
- 실행 권한 부여:
sudo chmod 755 /usr/local/sbin/update-abuseipdb.sh
5단계: CSF 방화벽 설정하기
대량의 IP를 차단할 수 있도록 CSF 설정을 조정합니다.
sudo nano /etc/csf/csf.confCtrl + W를 눌러서 DENY_IP_LIMIT를 검색하고 수정하세요.
# 기존
DENY_IP_LIMIT = "200"
# 수정 후
DENY_IP_LIMIT = "15000"저장 후 CSF를 재시작합니다:
sudo csf -r6단계: 모니터링 웹페이지 만들기
6-1. 상태 페이지 폴더 생성
웹 패널별 폴더 생성 방법
일반 Apache/Nginx:
sudo mkdir -p /var/www/html/status
sudo chown www-data:www-data /var/www/html/statuscPanel:
sudo mkdir -p /home/username/public_html/status
sudo chown username:username /home/username/public_html/statusCyberPanel:
sudo mkdir -p /home/domain.com/public_html/status
sudo chown cyberpanel:cyberpanel /home/domain.com/public_html/status6-2. 모니터링 페이지 코드 작성
위에서 생성한 status 폴더 안에 index.php 파일을 만드세요.
# 경로는 위에서 생성한 폴더에 맞게 수정하세요
sudo nano /home/yourdomain.com/public_html/status/index.php다음 코드를 복사해서 붙여넣으세요.
<?php
date_default_timezone_set('Asia/Seoul');
// Define the files to be read
$blocklist_file = 'blocked_ips.txt';
$logfile = 'execution_log.txt';
// Function to read and display a file's content
function display_file_content($filepath, $title) {
echo "<h2>" . htmlspecialchars($title) . "</h2>";
echo "<h4>File Path: " . htmlspecialchars($filepath) . "</h4>";
if (is_readable($filepath)) {
// Get the last modified time
$last_modified = date("Y-m-d H:i:s", filemtime($filepath));
echo "<p><strong>Last Updated:</strong> " . $last_modified . "</p>";
// Read and display the content
$content = file_get_contents($filepath);
echo "<pre style='background-color: #f4f4f4; border: 1px solid #ddd; padding: 10px; white-space: pre-wrap; word-wrap: break-word;'>";
echo htmlspecialchars($content);
echo "</pre>";
} else {
echo "<p style='color: red;'><strong>Error:</strong> Cannot read the file. Please check file permissions or PHP's open_basedir restrictions.</p>";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AbuseIPDB Status Viewer</title>
<style>
body { font-family: sans-serif; line-height: 1.6; margin: 20px; }
</style>
</head>
<body>
<h1>AbuseIPDB Script Status</h1>
<hr>
<?php
display_file_content($blocklist_file, "Blocked IP List");
display_file_content($logfile, "Execution Log");
?>
</body>
</html>
7단계: 자동 실행 설정하기
crontab -e처음 실행 시 편집기 선택 메뉴가 나오면 1 (nano) 선택
파일 맨 아래에 다음 줄을 추가하세요:
# AbuseIPDB 자동 업데이트 - 매일 0시와 12시에 실행
0 */12 * * * /usr/local/sbin/update-abuseipdb.sh >> /usr/local/sbin/abuseipdb.log 2>&1Ctrl + O → Enter → Ctrl + X로 저장하고 종료하세요.
8단계: 시스템 테스트하기
8-1. 수동으로 스크립트 실행
sudo /usr/local/sbin/update-abuseipdb.sh8-2. 결과 확인
# 로그 파일 확인
cat /usr/local/sbin/abuseipdb.log
# 차단된 IP 개수 확인
grep "AbuseIPDB Auto-Block" /etc/csf/csf.deny | wc -l8-3. 웹 모니터링 페이지 확인
웹브라우저에서 다음 주소로 접속하세요.
https://yourdomain.com/status문제 발생 시 해결 방법
1단계: "명령어를 찾을 수 없습니다" 오류
증상: jq: command not found 또는 curl: command not found 메시지가 나타남
원인: 필수 프로그램이 설치되지 않음
해결방법:
# Ubuntu/Debian
sudo apt update && sudo apt install jq curl nano -y
# CentOS/RHEL
sudo yum install jq curl nano -y2단계: "권한이 거부되었습니다" 오류
증상: Permission denied 메시지가 나타남
원인: 스크립트 실행 권한이 없음
해결방법:
# 스크립트 권한 설정
sudo chmod 755 /usr/local/sbin/update-abuseipdb.sh
# 로그 파일 권한 설정
sudo touch /usr/local/sbin/abuseipdb.log
sudo chmod 666 /usr/local/sbin/abuseipdb.log3단계: "API 호출 실패" 문제
증상: 로그에 "유효한 IP 목록을 받아오지 못했습니다" 메시지
원인: API 키 문제 또는 네트워크 문제
해결방법:
# 1. API 키 재확인
nano /usr/local/sbin/update-abuseipdb.sh
# API_KEY 부분이 올바른지 확인
# 2. 네트워크 연결 테스트
curl -I https://api.abuseipdb.com
# 3. API 수동 테스트 (실제 API 키 입력)
curl -G "https://api.abuseipdb.com/api/v2/blacklist" \
-d confidenceMinimum=100 \
-H "Key: YOUR_API_KEY" \
-H "Accept: application/json"4단계: "웹페이지가 보이지 않음" 문제
증상: 브라우저에서 404 오류 또는 빈 페이지
원인: 웹 경로 설정 오류 또는 권한 문제
해결방법:
웹 패널별 올바른 경로 확인
# Apache 기본 경로 확인
ls -la /var/www/html/
# 웹서버 상태 확인
sudo systemctl status apache2 # Ubuntu/Debian
sudo systemctl status httpd # CentOS/RHEL
sudo systemctl status nginx # Nginx 사용 시
# 파일 권한 확인
ls -la /var/www/html/status/5단계: "CSF 방화벽 오류" 문제
증상: 스크립트 실행 시 CSF 관련 오류 메시지
원인: CSF 서비스 문제 또는 설정 오류
해결방법:
# CSF 서비스 상태 확인
sudo systemctl status csf
# CSF 설정 검사
sudo csf -t
# CSF 수동 재시작
sudo csf -r
# CSF 로그 확인
sudo tail -f /var/log/lfd.log6단계: "크론 작업이 실행되지 않음" 문제
증상: 12시간 후에도 IP 목록이 갱신되지 않음
원인: Cron 서비스 문제 또는 설정 오류
해결방법:
# Cron 서비스 상태 확인
sudo systemctl status cron # Ubuntu/Debian
sudo systemctl status crond # CentOS/RHEL
# Cron 로그 확인
sudo tail -f /var/log/cron
# Cron 작업 목록 확인
crontab -l
# Cron 서비스 재시작
sudo systemctl restart cron7단계: "메모리 부족" 문제
증상: 서버가 느려지거나 응답하지 않음
원인: 대량의 IP 차단으로 인한 메모리 부족
해결방법:
# 메모리 사용량 확인
free -h
# CSF에서 IP 제한 줄이기
sudo nano /etc/csf/csf.conf
# DENY_IP_LIMIT를 10000 또는 5000으로 감소
# 불필요한 IP 정리
sudo csf -tf # 임시 차단 모두 해제
sudo csf -r # CSF 재시작마무리
이번 가이드를 통해 AbuseIPDB와 CSF를 활용한 자동 보안 시스템을 성공적으로 구축하셨기를 바랍니다. 어떤 Linux VPS 환경에서도 전문가 수준의 서버 보안이 가능하다는 것을 경험하셨을 것입니다.
이제 여러분이 얻은 것들
- ✅ 24시간 자동 운영되는 보안 시스템
- ✅ 실시간 모니터링 웹 인터페이스
- ✅ 수만 개의 악성 IP 자동 차단
- ✅ 모든 VPS 환경에서 범용 사용 가능
지속적인 보안을 위한 팁
- 월 1회 정도 모니터링 페이지에서 시스템 상태 확인
- 서버 성능 모니터링으로 과도한 차단이 성능에 영향을 주지 않는지 점검
- AbuseIPDB API 사용량 주기적 확인 (무료 계정 월 1,000회 제한)
📢 이 글이 도움이 되셨다면 댓글로 설치 후기나 궁금한 점을 남겨주세요! 여러분의 피드백은 더 나은 보안 가이드를 만드는 데 큰 도움이 됩니다.
🛡️ 안전한 서버 운영하세요! 이제 해커들의 공격으로부터 한층 더 안전해진 여러분의 서버가 24시간 든든하게 여러분을 지켜줄 것입니다.



