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

쿠버네티스의 서비스가 트래픽을 올바른 파드(Pod)로 전달하도록 중간에서 라우팅·포워딩을 해주는 구성 요소

요청으로 온 cluster IP를 실제 Pod IP와 연결해준다.

 

대표적으로 kube-proxy가 있으며 3가지 방식으로 움직인다.

 

iptables - 서비스의 가상 IP와 포트를 커널레벨의 iptables 규칙으로 등록 후 패킷을 해당 서비스의 파드로 NAT

 

IPVS - 리눅스 커널의 IPVS 모듈을 이용 - 대규모 작업에 효과적

 

userspace - kube-proxy 프로세스가 직접 소켓을 포워딩하는 형식(현재는 거의 안쓰임)

 

 

iptables 방식

# ClusterIP로 들어온 패킷을 서비스 체인으로 이동
-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp --dport 80 \
  -j KUBE-SVC-XXXXXXX

# 서비스 체인 → 엔드포인트 체인 (라운드 로빈)
-A KUBE-SVC-XXXXXXX -m statistic --mode random --probability 0.333333 \
  -j KUBE-SEP-AAAAAAA
-A KUBE-SVC-XXXXXXX -j KUBE-SEP-BBBBBBB
...

# 엔드포인트 체인에서 DNAT 수행
-A KUBE-SEP-AAAAAAA -j DNAT --to-destination 10.244.1.5:80

 

  • 커널수준에서 처리하기에 빠른 편이고, 의존성이 적다는 장점이 있다.
  • 서비스나 파드수가 늘어날수록 규칙이 더 복잡해지기 때문에 업그레이드 시 성능저하의 위험이 있다.

 

 

 

 

IPVS 방식

 

  • 원리: Linux 커널의 IPVS (IP Virtual Server) 모듈을 사용
  • IPVS는 iptables보다 더 전문적인 L4 로드밸런싱 엔진
  • kube-proxy가 ipvsadm 명령을 통해 서비스와 엔드포인트를 커널에 등록
  • 커널 내부에서 해시 테이블로 매핑 → 검색과 라우팅 속도가 훨씬 빠름

 

TCP  10.96.0.1:80 rr
  -> 10.244.1.5:80  Masq    1  0  0
  -> 10.244.2.8:80  Masq    1  0  0
  -> 10.244.3.12:80 Masq    1  0  0
  • 커널 레벨 해시 기반 → 규칙이 많아져도 빠름
  • 다양한 LB 알고리즘 지원 (rr, lc, sh 등)
  • iptables보다 업데이트 시 부하 적음
  • IPVS 모듈이 커널에 로드되어 있어야 함 (추가 설정 필요할 수도 있음)

 

 

 

apache와 php-fpm으로 구성 된 환경에서

php-fpm의 conf 파일에서 pool의 설정에 chroot를 적용 시 file not found라는 메세지와 함께 저런 로그가 발생했다.

 

CentOS 6의 환경과는 달라서 그런지 기존 서버에서 사용중인 세팅을 그래도 적용해서 발생하는 듯하다.

 

pool 설정에 access log를 추가해서 일단 확인해 보았다.

일단 chroot가 적용된 상태에서의 파일 경로를 잘 보고 있었다.

 

그렇다면 apache와 fpm간의 문제가 있다는 것이다.

 

< ps aux | grep php > 명령어를 이용해 pid를 알아낸 후

strace -p <pid>

로 아래와 같이 보면 경로를 잘못 받아 에러가 발생한 것을 확인할 수 있다.

 

 

 

apache의 conf 파일에서 filesMatch로 받아오던 부분을 ProxyPassMatch로 받아와 해결했다.

'오픈소스' 카테고리의 다른 글

Signoz 에러 Key not found  (0) 2025.12.18
rsnapshot - 오픈소스 백업 솔루션  (0) 2025.07.17
Warpgate - 사용자 관리 툴  (0) 2025.07.09
SoftEhter VPN - 윈도우 설치 public ip  (0) 2025.03.05
choco 설치  (2) 2025.01.06

html을 asp와 같은 기능으로 동작하도록 처리기 매핑을 사용한다.

스크립트 매핑 추가를 선택

 

 

 

URL이 가리키는 대상을 설정

 

요청 하는 방식 설정 PUT, DELETE는 어지간 하면 넣지 않음 웹 요청은 저 3개로 커버가능

 

 

 

실행은 실행 파일을 실행시킬 수 있는 권한 이라고 한다.

html 스크립트에 접근할 것이므로 스크립트에 체크 후 확인

 

 

이후 web.config에서

 

<add name="HTMLtoASP" 
    path="*.html" 
    verb="GET,HEAD,POST" 
    modules="IsapiModule" 
    scriptProcessor="%windir%\system32\inetsrv\asp.dll" 
    resourceType="File" />

 

위와 같은 태그를 입력하면 html을 asp로 동작할 수 있게 해준다.

 

보안 필터에 누락되지 않도록 주의하는 것이 좋다.

+ Recent posts