AWS Lightsail에서 Ubuntu 서버를 관리하던 중, SSH 접속과 FTP 접속이 모두 안되는 문제가 생겼습니다. 백업 해 놓은 파일도 없어서 막막한 상황이었습니다. 그래서 처음에는 라이트세일에서 스냅샷을 만들고 그것으로 새 인스턴스를 생성해봤지만 역시나 SSH는 검은 화면만 나오고 FTP도 접속이 안되었습니다. 그래도 이 문제가 발생하기 직전 썼던 명령어는 기억이 났기에 해결 방법을 찾았습니다. 혹시 저와 같은 문제가 생기는 분이 있을지 모르니 도움이 되도록 문제가 생겼던 명령어와 해결 방법을 정리하겠습니다.
문제의 원인으로 추정되는 명령어
문제는 제가 보안 설정 중 다음 두 명령어를 입력하면서 시작되었습니다.
sudo ufw enable
sudo systemctl restart systemd-resolved
왜 그 명령어 때문에 SSH 접속이 끊겼을까?
1. sudo ufw enable
- UFW(방화벽)를 켜는 명령입니다.
- 하지만 기본 상태에서 SSH 포트(22번) 허용 설정이 없는 경우, 서버는 자기 자신도 차단합니다.
- 결과적으로 외부에서 들어오는 모든 연결, SSH 포함, 거부됨.
2. sudo systemctl restart systemd-resolved
- systemd-resolved는 DNS 이름 해석을 담당하는 서비스입니다.
- 이걸 무심코 재시작하면
/etc/resolv.conf
링크가 끊기거나 DNS가 무효화되면서 외부 DNS(도메인 이름) 연결 실패가 발생합니다. - 이로 인해 서버 내부 프로세스가 SSH 연결 시도 시 이름을 못찾아 실패하거나, 인증 처리에 문제가 생길 수 있습니다.
해결 방법: 시작 스크립트(Launch Script) 활용
다행히 AWS Lightsail에서는 새로운 인스턴스를 만들면서 부팅 시 자동 실행될 스크립트를 지정할 수 있는 기능이 있습니다. 이 기능을 활용하면 “접속이 불가능한 서버”도 복원할 수 있는 가능성이 생깁니다. 현재 서버는 실행되지만 SSH가 차단되어 있으므로 SSH를 차단했던 명령어를 풀어 줄 스크립트를 넣어주면 끝 입니다. 다행히도 어떤 명령어 때문에 먹통이 된 건지 알고 있어서 해결 방법이 쉬운편이었습니다.
스냅샷 생성

스냅샷으로 인스턴스 생성 후 스크립트 추가
생성된 스냅샷에서 “Create new instance” 클릭 → “+ Add launch script” 클릭
#!/bin/bash
# ----------------------------------------
# 1. DNS 설정 복구 (systemd-resolved 정상화)
# ----------------------------------------
echo -e "[Resolve]\nDNS=8.8.8.8\nFallbackDNS=8.8.4.4\nDNSStubListener=no" > /etc/systemd/resolved.conf
rm -f /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved
# ----------------------------------------
# 2. UFW 비활성화 및 정책 초기화 (필요한 경우에만 활성화 권장)
# ----------------------------------------
ufw disable
systemctl stop ufw
systemctl disable ufw
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# ----------------------------------------
# 3. SSH 보안 설정 강화
# ----------------------------------------
# PermitRootLogin no
# 루트 계정으로 직접 SSH 접속을 금지 (보안상 매우 중요)
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
# PasswordAuthentication no
# 비밀번호 로그인 금지 (공개키 기반 인증만 허용)
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
# 만약 설정이 없었던 경우를 대비해 아래 줄을 추가
grep -q '^PermitRootLogin' /etc/ssh/sshd_config || echo "PermitRootLogin no" >> /etc/ssh/sshd_config
grep -q '^PasswordAuthentication' /etc/ssh/sshd_config || echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
# ----------------------------------------
# 4. SSH 서비스 재시작
# ----------------------------------------
systemctl enable ssh
systemctl restart ssh
# ----------------------------------------
# 5. SSH 포트만 방화벽에서 허용 (선택사항)
# ----------------------------------------
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw default deny incoming
ufw enable
# ----------------------------------------
# 완료 메시지
# ----------------------------------------
echo "✅ SSH 보안 설정 완료: 루트 로그인 및 비밀번호 인증 비활성화됨"
📌 스크립트 특징 요약
기능 | 설명 |
---|---|
DNS 설정 복구 | systemd-resolved가 깨졌을 때 복구 |
방화벽 초기화 | UFW와 iptables 상태 정리 |
SSH 보안 강화 | root 접속 금지 + 비밀번호 로그인 차단 |
안전한 재시작 | SSH 접근 차단 없이 재시작 가능 |
PasswordAuthentication를 쓰려면 SSH 키로 접속 중인지 확인 필요 (~/.ssh/authorized_keys
존재 여부 OK)
AWS의 경우에는 기본으로 SSH키로 접속 중이므로 쓰는게 좋음
이 설정의 의미?
설정 | 의미 |
---|---|
PermitRootLogin no | 루트 계정으로 직접 로그인 차단 |
PasswordAuthentication no | 비밀번호 로그인 차단 (SSH 키 기반 인증만 사용) |

위와 같이 작성된 스크립트를 추가하고 인스턴스 생성
적용 방법 요약
- Lightsail → Create snapshot 스냅샷 생성 클릭
- 생성된 스냅샷 → Create new instance 새 인스턴스 생성
- 하단의 Optional → Add launch script에 위 스크립트 붙여넣기
- 인스턴스 생성 기다리기
- SSH 콘솔에서 정상 접속 확인
이후 주의할 점
1. UFW 설정 시 포트 허용 먼저!
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
2. DNS 설정 조작은 신중히!
systemd-resolved
를 끌 경우 반드시/etc/resolv.conf
설정을 수동으로 해야 합니다.- DNS 이름 해석이 안 되면 인증, 패키지 설치, 심지어 SSH도 꼬일 수 있습니다.
3. 스냅샷은 반드시 만들자
- 실서버 변경 전엔 스냅샷 필수! 백업 필수!
추가 내용
systemd-resolved
와 /etc/resolv.conf
관계 이해하기
systemd-resolved
와 /etc/resolv.conf
개념이해
- 서버가 인터넷에 접속하거나 도메인 주소(
google.com
)를 IP 주소로 바꿔야 할 때,
“DNS 이름 해석”이라는 과정을 거칩니다. - 이때 사용하는 설정 파일이 바로 “
/etc/resolv.conf
” 입니다. - 여기에 어떤 DNS 서버(예: 8.8.8.8)를 쓸지 명시되어 있어야
google.com
→142.250.206.206
같은 변환을 할 수 있습니다
systemd-resolved
는?
- Ubuntu 시스템에서는 DNS를 관리하는 데
systemd-resolved
라는 서비스를 사용합니다. - 이 서비스는
/run/systemd/resolve/resolv.conf
라는 파일을 실시간으로 만들어두고,/etc/resolv.conf
는 이걸 심볼릭 링크로 연결해둡니다.
즉:
/etc/resolv.conf → /run/systemd/resolve/resolv.conf
이런 식으로 동작하게 됩니다.
문제는 여기서 발생합니다
만약 systemd-resolved
를 꺼버리면?
/run/systemd/resolve/resolv.conf
는 더 이상 생성되지 않습니다.- 그런데
/etc/resolv.conf
는 여전히 그 파일을 가리키고 있어요. - 이 상태에서 DNS 요청을 하면? → “DNS 서버를 못 찾겠어요” → 이름 해석 실패
systemd-resolved
꺼버린 결과
현상 | 왜 발생하는지 |
---|---|
apt install 안 됨 | archive.ubuntu.com 주소를 못 찾아서 |
ssh , ping 안 됨 | 도메인 → IP 로 변환을 못 해서 |
일부 인증 실패 | 인증 도메인 확인 실패 (예: Google OAuth 등) |
systemd-resolved
껐을 때 해결 방법
systemd-resolved
를 껐으면, 직접 DNS 서버를 지정해야 합니다.
echo "nameserver 8.8.8.8" > /etc/resolv.conf
이렇게 하면, /etc/resolv.conf
는 이제 Google DNS를 직접 바라보게 되고,
DNS 이름 해석이 다시 정상 작동합니다.
systemd-resolved
문제 요약
항목 | 설명 |
---|---|
systemd-resolved | DNS 주소 관리 서비스 (자동) |
/etc/resolv.conf | DNS 주소를 실제로 참조하는 설정 파일 |
이 둘이 끊기면 | 도메인 주소를 IP로 변환 못함 = 인터넷 끊긴 것처럼 됨 |
해결책 | resolv.conf 를 수동으로 작성해 DNS 주소 직접 지정 |
마무리
이번 경험을 통해 느낀 점이 있습니다.
“작은 실수로 서버에 접속이 안될 수 있으니 큰 작업이 아니더라도 주기적으로 백업을 하자.”
AWS Lightsail의 시작 스크립트 기능 덕분에 다행히도 복원할 수 있었습니다.
다음번에는 이런 문제를 EC2에서 해결하는 방법으로 글을 쓰겠습니다.
이 글이 같은 문제로 고생하는 분들에게 도움이 되길 바랍니다.
추가 문의나 경험 공유는 언제든 환영합니다!