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로 맞추고, 보안 패치를 자동으로 적용하고, 스왑 파일로 메모리 부족에 대비하는 방법을 다룬다.