Ubuntu 서버 초기 설정 ② — SSH 포트 변경, UFW 방화벽, fail2ban

Ubuntu 서버 초기 설정 ② — SSH 포트 변경, UFW 방화벽, fail2ban

비밀번호를 끈 것만으로는 부족하다. 포트를 바꾸고, 벽을 세우고, 반복 침입자를 자동으로 차단하자.

1편에서 SSH 키 인증으로 전환하고 root 로그인을 차단했다. 하지만 22번 포트는 여전히 열려 있고, 봇은 쉬지 않는다. 이번 편에서는 SSH 포트 변경, UFW 방화벽, fail2ban 자동 차단 세 가지 방어선을 순서대로 구축한다.

SSH 포트 변경하는 방법

기본 22번 포트는 전 세계 모든 자동 스캔 봇의 1순위 타겟이다. 포트 번호를 바꾸면 자동화된 공격의 99%가 제거된다. 보안 강화라기보다는 소음 제거에 가깝지만, 효과는 즉각적이다.

포트 번호 선택

범위 설명 추천
0~1023 잘 알려진 포트 (Well-known) ❌ 충돌 위험
1024~49151 등록된 포트 (Registered) ⚠️ 일부 서비스와 충돌 가능
49152~65535 동적/사설 포트 (Dynamic) ✅ 권장

이 가이드에서는 2222를 예시로 사용한다. 실제 서버에서는 더 예측하기 어려운 번호를 선택하자.

설정 변경

sudo nano /etc/ssh/sshd_config
# 기본 포트 변경
Port 2222

🔴 주의: 포트를 변경하기 전에 반드시 다음 섹션의 UFW에서 새 포트를 먼저 허용해야 한다. 순서가 뒤바뀌면 현재 접속이 끊긴 뒤 다시 접속할 수 없다. 그러므로 sshd를 아직 재시작하지 않고, UFW 설정 후 함께 적용한다.


sshd_config 보안 강화 옵션

포트 변경과 함께 추가 보안 옵션도 설정한다. 같은 파일(/etc/ssh/sshd_config)에서 아래 항목들을 수정한다.

# 로그인 대기 시간 제한 (기본 120초 → 30초)
LoginGraceTime 30

# 인증 실패 허용 횟수 (기본 6회 → 3회)
MaxAuthTries 3

# 접속 허용 사용자 제한 (1편에서 만든 계정만 허용)
AllowUsers deploy

# 유휴 접속 자동 종료 (5분간 무응답 시 끊김)
ClientAliveInterval 300
ClientAliveCountMax 2

# X11 포워딩 비활성화 (서버에 GUI 불필요)
X11Forwarding no
옵션 효과
LoginGraceTime 30 30초 안에 인증 안 하면 연결 끊김 → 느린 봇 차단
MaxAuthTries 3 3회 실패 시 연결 끊김 → 무차별 대입 속도 저하
AllowUsers deploy 지정한 사용자만 SSH 접속 가능 → 다른 계정 접근 원천 차단
ClientAliveInterval 좀비 세션 정리 → 리소스 낭비 방지

⚠️ AllowUsers에 자신의 사용자명을 정확히 입력해야 한다. 오타가 있으면 아무도 접속할 수 없다.


UFW 방화벽 설정 방법

UFW(Uncomplicated Firewall)는 Ubuntu의 기본 방화벽 도구다. 이름처럼 복잡하지 않다.

기본 정책 설정

# 들어오는 모든 트래픽 차단 (기본값)
sudo ufw default deny incoming

# 나가는 모든 트래픽 허용 (서버가 외부에 요청하는 건 허용)
sudo ufw default allow outgoing

필요한 포트만 열기

# SSH (변경한 포트)
sudo ufw allow 2222/tcp comment 'SSH'

# HTTP (웹 서버용, 4편에서 사용)
sudo ufw allow 80/tcp comment 'HTTP'

# HTTPS (웹 서버용, 4편에서 사용)
sudo ufw allow 443/tcp comment 'HTTPS'

UFW 활성화

sudo ufw enable

Command may disrupt existing SSH connections. Proceed with operation (y|n)?이라는 경고가 나온다. 새 SSH 포트(2222)를 이미 허용했으므로 y를 입력한다.

상태 확인

sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To                         Action      From
--                         ------      ----
2222/tcp                   ALLOW IN    Anywhere        # SSH
80/tcp                     ALLOW IN    Anywhere        # HTTP
443/tcp                    ALLOW IN    Anywhere        # HTTPS

SSH 재시작 및 접속 테스트

이제 SSH 설정 변경(포트 + 하드닝)을 적용한다.

sudo systemctl restart sshd

🔴 현재 접속을 끊지 말고, 새 터미널에서 변경된 포트로 접속을 테스트한다.

# 새 터미널에서 테스트
ssh -p 2222 deploy@서버_IP

접속이 되면 성공이다. 기존 포트(22)로도 시도해본다.

# 22번 포트로 접속 시도 → 실패해야 정상
ssh deploy@서버_IP
# ssh: connect to host x.x.x.x port 22: Connection refused

fail2ban 설치와 SSH 보호 설정

fail2ban은 서버의 CCTV + 자동 잠금장치다. 로그 파일을 실시간으로 감시하다가 같은 IP에서 반복적으로 접속에 실패하면, 해당 IP를 자동으로 방화벽에서 차단한다.

설치

sudo apt install fail2ban -y

설정 파일 생성

fail2ban은 /etc/fail2ban/jail.conf를 직접 수정하지 않고, jail.local 파일을 만들어 덮어쓰기(override) 하는 방식을 사용한다. 업데이트 시에도 설정이 유지된다.

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# 차단 시간 (1시간)
bantime = 3600

# 감시 기간 (10분 이내에)
findtime = 600

# 허용 실패 횟수 (5회 실패 시 차단)
maxretry = 5

# 차단 방법
banaction = ufw

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
설정 의미
bantime 7200 (2시간) SSH 실패 IP는 2시간 동안 접속 차단
findtime 600 (10분) 10분 이내의 실패 횟수를 카운트
maxretry 3 3회 실패 시 차단 발동
banaction ufw 차단 시 UFW 방화벽 규칙으로 추가
port 2222 변경한 SSH 포트

fail2ban 시작

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

상태 확인

sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

Currently banned: 0이면 정상 동작 중이다. 시간이 지나면 차단된 IP가 쌓이는 것을 볼 수 있다.

유용한 fail2ban 명령어

# 차단된 IP 목록 확인
sudo fail2ban-client status sshd

# 특정 IP 수동 차단 해제 (실수로 자신이 차단된 경우)
sudo fail2ban-client set sshd unbanip 123.45.67.89

# 전체 jail 상태 확인
sudo fail2ban-client status

방화벽 상태 확인과 테스트

모든 설정을 마쳤다. 최종 점검 체크리스트로 확인한다.

# 1. UFW 상태
sudo ufw status numbered

# 2. fail2ban 상태
sudo fail2ban-client status sshd

# 3. 열린 포트 확인
sudo ss -tlnp

ss -tlnp 출력에서 22번 포트가 없고, 2222번 포트만 LISTEN 상태인지 확인한다.

State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port
LISTEN  0       128      0.0.0.0:2222          0.0.0.0:*        users:(("sshd",pid=xxx,fd=3))

최종 방어선 요약

인터넷 → [UFW 방화벽: 2222, 80, 443만 통과]
              ↓
         [fail2ban: 3회 실패 → 2시간 차단]
              ↓
         [sshd: 키 인증만 허용, deploy만 접속 가능]
              ↓
         ✅ 서버 접속 성공

📝 정리

  • [x] SSH 포트 변경 — 22 → 커스텀 포트로 변경하여 자동 스캔 봇 제거
  • [x] sshd_config 하드닝 — 로그인 대기 시간, 실패 횟수, 허용 사용자 제한
  • [x] UFW 방화벽 — 기본 차단 + 필요한 포트만 허용 (SSH, HTTP, HTTPS)
  • [x] fail2ban — 반복 실패 IP 자동 차단 (CCTV + 자동 잠금장치)
  • [x] 순서 필수 — UFW에서 새 포트 허용 → SSH 포트 변경 → 접속 테스트 → 기존 포트 차단

다음 편 예고

3편: 타임존, 자동 보안 업데이트, 스왑

서버가 안전해졌으니 기본 체력을 다진다. 타임존을 Asia/Seoul로 맞추고, 보안 패치를 자동으로 적용하고, 스왑 파일로 메모리 부족에 대비하는 방법을 다룬다.