Amazon EC2에서 vsftpd를 이용한 FTP 서버 구축 시 주의할 점
안녕하세요! 클래스메소드 금상원 입니다.
이번 블로그에서는 EC2 에 vsftpd를 이용한 FTP 서버 구축 시 주의할 점에 대해 알아보도록 하겠습니다.
FTP 서버에 EIP 를 설정 합시다.
FTP 클라이언트로 부터 접속할 때 편의성
FTP 서버가 퍼블릭 서브넷에 위치 하고 있으면 FTP 클라이언트는 FTP 서버에 접속할 때 퍼블릭 FTP 서버의 퍼블릭 IP 를 참조해서 접속하게 됩니다.
하지만 AWS 에서 자동 활당되는 퍼블릭 IP 는 서버를 재시작 하거나 재작성 했을 때 변경 됩니다.
이렇게 되면 FTP 클라이언트 매번 접속하기전 FTP 서버의 퍼블릭 IP 를 확인해야하는 수고가 발생 하게 됩니다.
FTP 클라이언트가 올바른 IP로 접속하기 위해서
EIP 를 사용하면 항상 동일한 IP 를 사용하므로 클라이언트가 올바른 IP 로 접속할 수 있습니다.
또한, Passive 모드에서는 FTP 서버에 FTP 클라이언트가 접속해야 할 IP를 설정하기 위해 pasv_address 를 설정 합니다.
설정된 정보를 FTP 클라이언트가 FTP 서버로부터 전달받아 퍼블릭 IP 주소를 사용하여 데이터 채널을 연결합니다.
만약 FTP 서버가 재시작 하거나 재작설 했을 때 pasv_address 에 설정된 IP 가 변경되면, 클라이언트는 잘못된 IP 로 접속하려고 시도하게 되어 연결이 실패합니다.
통신 모드에 따라 보안 그룹 설정이 바뀝니다.
FTP 서버와 클라이언트는 Active 모드와 Passive 모드에 따라 데이터 통신 방식이 달라지므로, 보안 그룹 설정을 신중하게 구성해야 합니다.
Active 모드 vs Passive 모드에 따른 접속 방식
◼️Active 모드
클라이언트가 서버의 포트 21로 연결을 요청하면, 서버가 클라이언트의 임의 포트로 데이터 연결을 시도합니다.
- FTP Server
유형 | 프로토콜 | 포트 범위 | 소스 | |
---|---|---|---|---|
인바운드 | 사용자 지정 TCP | TCP | 21 | Client Server의 IP 주소 |
아웃바운드 | 모든 트래픽 | 전체 | 전체 | 0.0.0.0/0 |
- Client Server
유형 | 프로토콜 | 포트 범위 | 소스 | |
---|---|---|---|---|
인바운드 | 사용자 지정 TCP | TCP | 1024 - 65535 | FTP Server의 IP 주소 |
아웃바운드 | 모든 트래픽 | 전체 | 전체 | 0.0.0.0/0 |
◼️Passive 모드
클라이언트가 서버의 포트 21로 연결한 후, 서버가 특정 포트 범위를 열어 클라이언트가 직접 접속하도록 합니다.
- FTP Server
유형 | 프로토콜 | 포트 범위 | 소스 | |
---|---|---|---|---|
인바운드 | 사용자 지정 TCP | TCP | 21 | Client Server의 IP 주소 |
인바운드 | 사용자 지정 TCP | TCP | (예)50000-510000 | Client Server의 IP 주소 |
아웃바운드 | 모든 트래픽 | 전체 | 전체 | 0.0.0.0/0 |
- Client Server
유형 | 프로토콜 | 포트 범위 | 소스 | |
---|---|---|---|---|
아웃바운드 | 모든 트래픽 | 전체 | 전체 | 0.0.0.0/0 |
Passive 모드에서 데이터 연결 시 퍼블릭 IP가 아닌 프라이벳 IP가 반환될 경우
# 에러 내용
227 Entering Passive Mode (10,0,2,137,197,57).
ftp: connect: Connection timed out
-------------------------------------------------------------
# 해결 방법
# /etc/vsftpd/vsftpd.conf 파일에 추가
pasv_address=< FTP 서버의 EIP >
# vsftpd 서비스 재시작
sudo systemctl restart vsftpd
위의 문제를 해결하기 위해서는 「vsftpd.conf」 에서 Passive 명령에 글로벌 EIP 를 반환 하도록 위의 「pasv_address=< FTP 서버의 EIP >」 설정을 추가 하는 것으로 해결할 수 있습니다.
원인으로는 클라이언트가 인터넷을 통해 데이터 연결을 실시했을 때, AWS 의 EC2 는 자신에게 할당된 EIP 의 존재를 모르기 때문에 Passive 명령에 대해 프라이빗 IP 주소를 반환합니다. FTP 클라이언트는 프라이빗 IP 주소에 접속하려 하기 때문에 데이터 연결이 실패하게 됩니다.
그렇기 때문에 EIP 를 반환할 수 있도록 설정을 변경해 주어야 합니다.
Passive 모드에서 데이터 연결 시 퍼블릭 IP가 아닌 0.0.0.0 이 반환될 경우
# 에러 내용
227 Entering Passive Mode (0,0,0,0,198,41).
ftp: connect: Connection refused
-------------------------------------------------------------
# 해결 방법
# /etc/vsftpd/vsftpd.conf 파일에서 수정
listen=YES
listen_ipv6=NO
# vsftpd 서비스 재시작
sudo systemctl restart vsftpd
위의 문제를 해결하기 위해서는 아래와 같이 IPv4 주소를 올바르게 반환하도록 설정을 변경하여 해결할 수 있습니다.
- listen=NO → listen=YES
- listen_ipv6=YES → listen_ipv6=NO
FTP 클라이언트가 Passive 모드로 접속할 때, 서버는 클라이언트가 접속해야 할 EC2의 EIP 주소와 포트 번호를 반환합니다.
하지만 「listen_ipv6=YES」 가 설정되어 있으면, vsftpd 가 IPv6 전용 소켓을 우선적으로 사용하면서 IPv4 주소 반환이 정상적으로 동작하지 않는 버그가 발생합니다.
그 결과, FTP 클라이언트가 0.0.0.0로 접속을 시도하게 되며, 데이터 연결이 실패하게 됩니다.
마무리
이번 블로그에서는 제가 EC2 에 vsftpd를 이용해 FTP 서버를 작성했을 때 부딪쳤던 문제들을 공유해 보았습니다.
저와 같은 문제가 발생해서 곤란한 분들께 조금이나마 도움이 되었으면 좋겠습니다.
참고 자료