서버 운영
서버 방화벽 설정할 때 실수하지 않는 방법
방화벽 규칙을 추가할 때 원인 추적과 안전성을 잃지 않는 체계적인 접근법.
서버 운영을 하다 보면 방화벽을 만질 일이 자꾸 생긴다. "왜 연결이 안 되지?"라는 질문의 답이 보통 방화벽이기 때문이다. 하지만 방화벽은 보안의 마지막 방어선이라서 함부로 손댔다가는 서버가 노출될 수 있다.
현재 상태부터 확인하자
# 현재 열려있는 포트 확인
sudo ss -lntp
# 방화벽 규칙 확인
sudo ufw status
# 더 자세히
sudo ufw status verbose
이 정보를 먼저 적어둔다. 나중에 뭔가 잘못되었을 때 이 상태로 돌아가려면 기록이 필요하다.
포트별로 확인해야 할 것
웹 서버 (80, 443)
# HTTP/HTTPS가 열려있는가?
sudo ufw status | grep -E 'http|https'
# 실제로 연결되는가?
curl -I http://example.com
curl -I https://example.com
SSH (22)
# SSH 포트가 제한되어 있는가?
sudo ufw status | grep ssh
# 특정 IP에서만 허용하기
sudo ufw allow from 203.0.113.0/24 to any port 22
데이터베이스 (5432, 3306 등)
데이터베이스는 외부에 절대 노출되면 안 된다.
# PostgreSQL이 내부 트래픽만 듣고 있는가?
sudo ss -lntp | grep 5432
# 127.0.0.1:5432로 보여야 함
# 만약 0.0.0.0:5432면 위험함
방화벽 규칙 추가할 때의 순서
항상 이 순서를 따르자.
- 현재 상태 기록
sudo ufw status verbose > ~/firewall-backup-$(date +%Y%m%d-%H%M%S).txt
- 규칙 추가
sudo ufw allow 8080/tcp # 한 포트만
- 즉시 테스트
telnet localhost 8080
# 또는
curl http://localhost:8080
- 외부에서 테스트 (중요!)
# 다른 머신에서
curl http://<server-ip>:8080
- 만약 안 되면 즉시 되돌리기
sudo ufw delete allow 8080/tcp
자주 놓치는 실수
규칙 순서 무시
# ❌ 나쁜 예: 차단 규칙 뒤에 허용 규칙 추가
sudo ufw default deny incoming
sudo ufw allow 80/tcp
# 이미 'deny all'이 먼저라서 80도 안 됨
# ✅ 좋은 예: 허용 규칙을 먼저 지정
sudo ufw allow 80/tcp
sudo ufw default deny incoming
로컬에서 테스트만 하기
# ❌ 로컬에서만 확인
sudo ss -lntp # 포트가 보이면 OK라고 생각
# ✅ 실제 외부 테스트 필요
# 다른 장비에서: curl http://your-server-ip:port
SSH 차단
# ⚠️ 매우 위험
sudo ufw deny 22/tcp # SSH를 막으면 원격 접근 불가
# 물리적으로 접근 가능할 때만 복구 가능
디스크와 프로세스도 함께 확인
# 디스크 여유 공간
df -h
# 활동 중인 프로세스
sudo ss -lntp | grep LISTEN
# 로그 파일 크기
du -sh /var/log/
포트가 열려있어도 실제 서비스가 죽어있으면 소용없다.
권한 확인도 함께
# 설정 파일이 올바른 소유권을 가지고 있나?
ls -la /etc/nginx/nginx.conf
ls -la /etc/mysql/my.cnf
# 서비스 계정이 필요한 권한을 가지고 있나?
sudo ls -la /var/www/html/
최종 체크리스트
- 변경 전 상태 백업
- 한 번에 한 가지만 수정
- 로컬과 외부에서 모두 테스트
- 실제 트래픽으로 검증 (중요!)
- 변경 사항과 이유를 기록
- 필요하면 즉시 되돌릴 수 있도록 준비
방화벽은 보안이 목적이니까, "일단 되게 하고 나중에 닫자"는 태도는 위험하다. 처음부터 최소한의 권한만 부여하는 게 좋다.