IP 차단 여부를 자주 체크해서 전달해야 하는 일이 있는데,

굳이 우리팀에서 확인해서 알려주지 않아도 되도록 스크립트를 작성했다.

OliveTin에서 실행결과를 출력해주기 때문에

다른팀에서 터미널 접속할 필요없이 OliveTin만 실행해서 결과확인이 가능하게 되었다.

 

 

구성요소는

디렉토리 2개

  • ip_list - 전체 차단 된 ip 목록
  • diff - 이전에 있던 전체 차단 된 ip 목록의 변경사항

쉘 스크립트 1개

  • denied_ip.sh - 실행 스크립트

텍스트 및 기타로그파일 1개

  • target_list.txt - 차단 된 ip 목록 파일의 경로가 적힌 파일

이렇게 구성되어있다.

 

우선

전체 차단 ip 목록을 생성

이후 전체 차단 ip목록 파일을 diff로 비교하여 차이점 발생 시 diff 폴더에 저장

이후 오래된 전체 차단 ip 목록 삭제

 

diff 파일 확인하여 최근 차단된 ip로 표시하여 출력

diff에는 있으나 전체 차단 ip 목록에 없는 경우 차단해제 표시하여 출력

 

 

 

 

 

 

 

#!/bin/bash
cd /root/denied_ip
DATE=$(date '+%Y%m%d_%H:%M:%S')
LOG_DIR="ip_list"
DIFF_DIR="diff"
TMP_DIFF="$DIFF_DIR/tmp_diff.log"

mkdir -p "$LOG_DIR" "$DIFF_DIR"
LOGFILE="denied_ip_$(date '+%Y%m%d_%H%M%S').log"
FULL_PATH="$LOG_DIR/$LOGFILE"

DIFF_FILE="diff_$(date '+%Y%m%d_%H%M%S').log"
DIFF_PATH="$DIFF_DIR/$DIFF_FILE"

target_list="target_list.txt"

# all denied ip listi
echo "###" > "$FULL_PATH"
echo "### iptables" >> "$FULL_PATH"
echo "###" >> "$FULL_PATH"

sudo iptables -L INPUT -n -v | awk 'NR>2 && $1 ~ /^[0-9]+$/ {print $8}' >> "$FULL_PATH"
echo -e "\n\n" >> "$FULL_PATH"

while IFS= read -r SRC
do
  # 빈 줄이나 #로 시작하는 줄 스킵
  case "$SRC" in
    ''|\#*) continue ;;
  esac
  echo "###" >> "$FULL_PATH"
  echo "### $(basename "$SRC")" >> "$FULL_PATH"
  echo "###" >> "$FULL_PATH"
  awk '$1 ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { print $1 }' "$SRC" >> "$FULL_PATH"
  echo -e "\n\n" >> "$FULL_PATH"
done < "$target_list"
# compare all denied ip lists
log_files=($(ls -1t "$LOG_DIR"/denied_ip_*.log 2>/dev/null))

if [ ${#log_files[@]} -ge 2 ]; then
    NEW_FILE="${log_files[0]}"
    OLD_FILE="${log_files[1]}"

    diff "$OLD_FILE" "$NEW_FILE" \
      | grep '^>' \
      | grep -v '#' \
      | sed "s/^> \(.*\)/\1 $DATE/" > "$TMP_DIFF"

    # ip diff save
    if grep -qE '([0-9]{1,3}\.){3}[0-9]{1,3}' "$TMP_DIFF"; then
        mv "$TMP_DIFF" "$DIFF_PATH"
    else
        rm -f "$TMP_DIFF"
    fi

    # old diff file remove
    ls -t "$DIFF_DIR"/diff*.log 2>/dev/null | tail -n +7 | xargs -r rm -f
    rm -f "$OLD_FILE"
fi


############################## result
echo "#######################"
echo "### 최근 차단된 IP  ###"
echo "#######################"
diff_files=($(ls -1t "$DIFF_DIR"/diff*.log 2>/dev/null))

if [ ${#diff_files[@]} -gt 0 ]; then
    for file in "${diff_files[@]}"; do
        while read -r ip; do
            # IP 형식만 추출 (예: "pass 1.2.3.4" 또는 "1.2.3.4 YYYYMMDD_HH:MM:SS")
            target_ip=$(echo "$ip" | awk '{print $1}')
            [[ "$target_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(/[0-9]+)?$ ]] || continue

            if grep -qwF "$target_ip" "$FULL_PATH"; then

                echo "차    단$ip"
            else
                echo "차단해제$target_ip"
            fi
        done < "$file"
    done
 #   echo $DIFF_DIR'/'*
else
    echo "there is no file"
fi
echo ""
echo "######################"
echo "### 모든 차단된 IP ###"
echo "######################"
echo ""
cat "$FULL_PATH"
#echo "$(date '+%H:%M:%S.%3N') - $ip"
sleep 0.5s
exit 0

 

'Linux' 카테고리의 다른 글

ssh 접속한 사람 잡기  (0) 2026.06.01
ulimit -a  (0) 2025.09.11
[shell script] 조건문에 사용되는 연산자  (0) 2025.05.08
/run,tmpfs, journalctl  (0) 2025.03.19
자바 버전 설정 alternatives  (0) 2025.03.11

+ Recent posts