SSH 22번 포트 자동 복구 시스템 구축하기 (feat. 서버 잃고 뇌 약간 고치기 ㅠ)

2025. 10. 24. 17:34·Infra/DevOps

열어줘잉...

쏘 큩..

하... 나의 사랑스런 홈서버들과 10km 떨어진 카페에서 k8s 구축을 하고 있었다
근데 자꾸 삽질 드릅게 많이하고 안돼서 킹받던 도중 iptable 다 닫아버리는 명령어를 위화감 없이 실행해버림
그대로 SSH 접속 중이던 터미널까지 '자동'으로 끊김...
 
VPN 써서 내부망으로 접속 중이라 그랬는지는 몰라도 내겐 마지막 터미널 이딴 기회 없었음 ㅠ
(나는 22번 포트가 닫혀도 접속 중이던 터미널은 끊기지 않는다는 이야기를 무척 좋아한다)
 
웃긴건 집에서 나올 때 노트북에 충전선이랑 LAN선 꼽아주는걸 깜빡해서 서버가 3대 밖에 안남은 상황
뭐 어떻게 해.. k8s는 안타깝게도 서버 2대로 진행하게 되어야지..
 
그치만... 백업 시스템의 필요성을 느껴서 소 잃고 뇌 약간.. 서버 약간.. 고치기로 했다 ㅠ
지금 부터 우리 목표는 '닫힌 ssh 간단하게 살리기'이다


1. 스크립트

- 간단하게 짰다 (복잡하게 짜봤자 안돌아가고 터지면 뭔 소용이겠어요... 따흐흑..)
- 일단 서버 상태가 조졌다면 내가 알긴 해야하니까 알림 기능을 넣었음
- 기본적으로 ufw를 사용하도록 짰다
- iptable로도 짤 수 있긴한데 우리의 목표는 '닫힌 ssh 간단하게 살리기' 라는 것을 잊지말자
- ufw를 안 쓰고 있다면 쓰게 해줄 것이고, 열려있다면 패스하고 바로 22번 포트 체크할 것이다

sudo vim ssh-guard.sh
#!/bin/bash
# SSH 자동 복구 스크립트
# by Ratatou2

# 0. 환경 변수 불러오기
source /.env

# 1. Telegram 전송 함수
function send_telegram() {
  local MESSAGE="$1"
  curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
    -d chat_id="${TELEGRAM_CHAT_ID}" \
    -d text="$MESSAGE" > /dev/null
}

# SSH 포트 확인 (기본 22)
PORT=22

# 2. UFW 상태 확인
UFW_STATUS=$(sudo ufw status | grep "$PORT/tcp")

# 포트가 막혔는지 테스트
if ! echo "$UFW_STATUS" | grep -q "ALLOW"; then
  send_telegram "🫠 [WARN] SSH 포트가 닫혀있습니다. 복구 시도 중... 🫠 "

  # 4. UFW 활성화 여부 확인
  if ! sudo ufw status | grep -q "Status: active"; then
    send_telegram "[INFO] UFW가 비활성화 상태여서 활성화합니다."
    sudo ufw --force enable
  fi

  # 5. SSH 포트 허용 (중복 허용 방지)
  if ! sudo ufw status | grep -q "$PORT/tcp"; then
    sudo ufw allow $PORT/tcp
    send_telegram "[INFO] SSH 포트($PORT) 방화벽 허용 완료"
  fi

  # 6. UFW 규칙 적용
  sudo ufw reload

  # 로그 남기기
  send_telegram "😎 [INFO] SSH 포트($PORT) 복구 완료 $(date) 😎"
fi
sudo chmod +x ssh-guard.sh

2. systemd 필요 파일

- crontab에 등록할까 했는데 취지 상 systemd가 더 나을 것 같다는 판단을 내렸다
- 판단의 근거는 따로 찾아보고 공부했는데 간단하게 정리해둘 예정

 

포스팅 완료!!

https://ratatou2.tistory.com/296

 

cron vs systemd 더 안정적인 것은?? (feat. 세계관 최강자의 대결)

세계관 최강자 둘의 대결;;;지난번 포스팅 때, 자동화 스크립트를 cron과 systemd 둘 중 어디에 등록할지 고민하다가 systemd를 선택했다고 적어뒀었다https://ratatou2.tistory.com/288 SSH 22번 포트 자동 복구

ratatou2.tistory.com


1) .service 파일 만들기

sudo vim /etc/systemd/system/ssh-guard.service

- 스크립트 경로는 각자 환경에 맞춰서 진행하면 됨

[Unit]
Description=SSH Port Auto-Recovery

[Service]
Type=oneshot
ExecStart=/ssh_guard.sh

2) .timer 파일 만들기

- 10분마다 반복하도록 세팅해뒀다 (원하는 시간 조절하시면 될듯함)

sudo vim /etc/systemd/system/ssh-guard.timer
[Unit]
Description=Run SSH Port Guard every 10 minutes

[Timer]
OnBootSec=1min
OnUnitActiveSec=10min
Unit=ssh-guard.service

[Install]
WantedBy=timers.target

3) 적용하기 

sudo systemctl daemon-reload
sudo systemctl enable --now ssh-guard.timer
sudo systemctl list-timers | grep ssh-guard

3. 테스트

- 테스트를 위해 33번 포트를 닫아둔채로 적용했다
- 알림이 잘 오고 있는 모습

이런다고 맥미니는 돌아오지 않아... 알아?

- 정상적으로 추가된 모습을 확인할 수 있다

맥미니는 이미 죽었다고!!


번외

일단 첫번째로 이런 바보같은 실수를 하다니 믿을 수가 없고
두번째로는 이렇게 작성해놔도 집에 가지 않는 이상 맥미니를 살릴 수 없다니 이것도 믿을 수가 없었다
 
권한과 명령어는 신중하게 살펴보고 실행해도 늦지 않음을 백번 천번 다시금 체감했다
(회사 서버였다고 생각해봐 주말에 회사 출근? 그게 맞냐? 그냥 죽ㅇ...)

 

ps. 집에 와보니 맥미니의 ufw가 꺼져있었다 (대체 뭔 생각으로 ufw disable 명령어를 실행한거냐?)

스크립트에 ufw를 활성화 하는 명령어도 있으니까 일단 저것으로 잘 해결될 것이다

반응형

'Infra > DevOps' 카테고리의 다른 글

Fail2Ban, nftables 체제로 완전 전환하기 (feat. 눈물겨운 이유와 Ubuntu 22.04)  (0) 2025.11.15
Fail2Ban 돌연사 사건 및 해결방법 (feat. 그지같은 nftables)  (0) 2025.11.15
나만의 VPN 서버 만들기 (feat. 홈서버 + WireGuard)  (4) 2025.10.23
서버 부하 테스트 해보기 (feat. K6 스트레스 테스트 & 분산 구조 튜닝)  (0) 2025.10.23
홈서버 4대로 분산 시스템 구축 해보기 (feat. 생각보다 겁나 쉬움!)  (0) 2025.10.21
'Infra/DevOps' 카테고리의 다른 글
  • Fail2Ban, nftables 체제로 완전 전환하기 (feat. 눈물겨운 이유와 Ubuntu 22.04)
  • Fail2Ban 돌연사 사건 및 해결방법 (feat. 그지같은 nftables)
  • 나만의 VPN 서버 만들기 (feat. 홈서버 + WireGuard)
  • 서버 부하 테스트 해보기 (feat. K6 스트레스 테스트 & 분산 구조 튜닝)
Ratatou2
Ratatou2
온갖 정보들을 기록해두는 메모보드 블로그
  • Ratatou2
    nak-z
    · Ratatou2 ·
  • 전체
    오늘
    어제
  • 공지사항

    • 블로그 이전 진행 중 (24.11.25 ~)
    • 분류 전체보기 (303) N
      • OS (89) N
        • Linux (39)
        • Window (24)
        • Mac (21) N
        • Android (5)
      • Infra (83) N
        • DevOps (38) N
        • Docker (14)
        • Jenkins (9)
        • n8n (13)
        • Nextcloud (8)
        • Rasberry Pi (1)
      • Dev (17)
        • JAVA (7)
        • Python (1)
        • DB (3)
        • Vue (2)
        • AI (4)
        • Git (0)
      • Tools (10)
      • Study (69)
        • Algorithm (66)
        • CS (3)
      • Game (10)
        • Project Zomboid (9)
        • Don't Starve Together (1)
      • etc (24)
        • Temp (0)
      • 개발 외 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Ratatou2
SSH 22번 포트 자동 복구 시스템 구축하기 (feat. 서버 잃고 뇌 약간 고치기 ㅠ)
상단으로

티스토리툴바