Ubuntu 24.04 서버를 준비하고 SSH, 방화벽, Nginx, HTTPS를 설정하는 절차입니다. FTP 서버 설정은 필요한 경우에만 진행합니다.
1. 사전 확인
- 클라우드 콘솔에서 서버의 공인 IP와 SSH 키를 확인합니다.
- 클라우드 방화벽/보안 목록에서 사용할 포트를 허용할 수 있는지 확인합니다. 서버 내부 방화벽과 클라우드 방화벽은 별도로 관리됩니다.
- 아래 명령의
<서버_IP>,<키_파일>및 도메인을 실제 환경에 맞게 바꿉니다. - SSH 설정이나 방화벽을 변경하기 전 현재 SSH 세션을 유지하고, 가능하면 클라우드 콘솔 접속 수단도 준비합니다.
2. 최초 접속 및 시스템 업데이트
로컬 컴퓨터에서 SSH 키를 이용해 접속합니다.
ssh -i <키_파일> ubuntu@<서버_IP>
서버에서 패키지 목록과 설치 패키지를 갱신하고 기본 도구를 설치합니다.
sudo apt update
sudo apt upgrade -y
sudo apt install -y vim net-tools
net-tools는 ifconfig 등 구형 네트워크 명령이 필요한 경우에만 설치하면 됩니다. 최신 Ubuntu에서는 ip 명령 사용을 권장합니다.
3. SSH 포트 변경 (선택)
SSH 포트 변경은 무단 접속 시도를 줄이는 보조 조치이며, 인증 키 사용을 대체하지 않습니다. SSH 설정을 바꾸기 전에 새 포트를 클라우드 방화벽과 서버 방화벽에서 먼저 허용합니다.
SSH 설정 파일을 엽니다.
sudoedit /etc/ssh/sshd_config
파일에서 기존 Port 항목을 확인한 뒤 다음처럼 설정합니다. sshd_config 문법은 Port=2022가 아니라 공백을 사용하는 Port 2022입니다.
Port 2022
문법을 확인한 다음 SSH 서비스를 재시작합니다.
sudo sshd -t
sudo systemctl restart ssh
sudo systemctl status ssh --no-pager
현재 세션을 닫기 전에 새 터미널에서 새 포트로 접속되는지 확인합니다.
ssh -i <키_파일> -p 2022 ubuntu@<서버_IP>
새 연결이 확인된 뒤에만 기존 포트 허용 규칙을 정리합니다. SSH 포트 변경이 필요 없다면 기본 포트 22를 유지해도 됩니다.
4. 방화벽 및 포트
원본 메모는 iptables를 사용합니다. 규칙은 INPUT 체인의 기존 REJECT 규칙보다 앞에 있어야 하며, 서버에 따라 기본 규칙과 번호가 다를 수 있으므로 먼저 현재 규칙을 확인합니다.
sudo iptables -L INPUT -v -n --line-numbers
예를 들어 SSH를 2022번으로 변경했고 웹 서버를 운영한다면 필요한 포트만 허용합니다. 다음은 REJECT 앞에 규칙을 삽입하는 예입니다. 적용 위치가 환경의 기존 규칙과 맞는지 확인하십시오.
sudo iptables -I INPUT 5 -p tcp --dport 2022 -j ACCEPT
sudo iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 5 -p tcp --dport 443 -j ACCEPT
MySQL과 FTP 포트는 원격 사용이 꼭 필요한 경우에만 별도로 허용합니다. MySQL은 가능하면 허용 대상 IP를 제한하고, 전체 인터넷에 포트를 공개하지 마십시오.
규칙을 다시 확인하고 영구 저장 패키지를 설치·저장합니다.
sudo iptables -L INPUT -v -n --line-numbers
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
저장된 IPv4 규칙을 복원하는 예:
sudo iptables-restore < /etc/iptables/rules.v4
iptables -F는 현재 방화벽 규칙을 모두 지우므로 원격 서버에서 실행하면 접근 제어가 의도와 다르게 바뀔 수 있습니다. 규칙 초기화 목적으로 무심코 실행하지 마십시오.
5. Nginx 설치 및 확인
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
sudo systemctl status nginx --no-pager
브라우저에서 http://<도메인> 또는 http://<서버_IP>로 접속해 기본 응답을 확인합니다. 도메인을 사용할 경우 DNS의 A/AAAA 레코드가 서버를 가리켜야 합니다.
Nginx 설정을 변경한 뒤에는 문법을 확인하고 설정을 다시 불러옵니다.
sudo nginx -t
sudo systemctl reload nginx
6. HTTPS 인증서 발급
도메인이 서버를 가리키고 외부에서 TCP 80/443 포트에 접근할 수 있는지 확인합니다.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d <도메인>
안내에 따라 이메일 주소와 서비스 약관 동의 여부를 입력합니다. 발급이 완료되면 https://<도메인>으로 접속합니다.
자동 갱신 점검:
sudo certbot renew --dry-run
실패하면 Certbot과 Nginx 로그, DNS, 방화벽의 80/443 포트 및 도메인 설정을 확인합니다.
7. FTP 서버 설정 (선택)
FTP가 꼭 필요한 경우에만 진행합니다. FTP는 계정 정보가 평문으로 전송될 수 있으므로 가능하면 SSH 기반 SFTP를 사용하십시오. SFTP는 SSH 서비스가 제공하므로 보통 별도의 FTP 서버 설치가 필요 없습니다.
vsftpd 설치 및 서비스 활성화:
sudo apt install -y vsftpd
sudo systemctl enable --now vsftpd
sudo systemctl status vsftpd --no-pager
설정 파일을 편집합니다.
sudoedit /etc/vsftpd.conf
수동/수동형 FTP가 필요한 경우의 설정 예입니다. 포트는 SSH 포트와 겹치지 않도록 합니다.
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50010
원본 메모의 listen_port=2022는 SSH를 2022번으로 설정한 경우 포트 충돌을 일으킵니다. FTP를 비표준 포트로 운영해야 한다면 SSH와 다른 포트를 선택하고, FTP 클라이언트 및 방화벽 설정도 일치시킵니다. 수동형 FTP 사용 시 TCP 21과 설정한 수동형 포트 범위를 클라우드·서버 방화벽 양쪽에 허용해야 합니다. NAT 환경에서는 공인 IP에 맞는 추가 설정이 필요할 수 있습니다.
설정 확인 및 재시작:
sudo systemctl restart vsftpd
sudo systemctl status vsftpd --no-pager
8. 기본 점검 명령
sudo systemctl --failed
sudo journalctl -u nginx -n 50 --no-pager
sudo journalctl -u ssh -n 50 --no-pager
sudo ss -lntp
클라우드 방화벽, Ubuntu 방화벽, 서비스의 수신 포트, DNS가 모두 일치해야 외부에서 서비스에 연결할 수 있습니다.