System/Linux

[Linux] FTP

Yoonsoo Park 2024. 10. 7. 16:18

1. 파일 전송 서비스/프로토콜: FTP(File Transfer Protocol)

FTP(File Transfer Protocol)인터넷을 통해 파일을 전송하는데 사용되는 표준 네트워크 프로토콜이자 서비스이다. 하지만 FTP를 이용해서 파일을 다운받아 본 사용자는 거의 없을 것이다. 일반적으로 FTP는 개발자, 엔지니어들이 서버 운영을 위한 목적으로 파일을 업로드/다운로드 할 때 많이 사용하며, 큰 파일이나 많은 파일을 안정적으로 빠르게 업로드/다운로드 할 수 있다는 장점이 있다. 

 

 일반적으로 FTP는 TCP 20, 21번 포트를 이용한 평문 통신으로 알려져 있지만, 실제로는 통신 방식에 따라서 랜덤 포트를 사용하는 경우도 있다(뒤에 FTP의 동작 방식과 관련한 부분에서 더 자세히 다루도록 하겠다).  

 

FTP의 주요 기능들을 조금 더 정리하보면 다음과 같다. 

 

파일 업로드/다운로드

  • 클라이언트는 서버에서 파일을 다운로드 하거나, 파일을 업로드할 수 있다 

디렉토리/파일 관리 

  • 디렉토리 및 파일 생성, 삭제, 변경 가능

Ananymous FTP

  • 특정 계정 없이도 익명으로 FTP 서비스를 사용 가능하다(서버 관리자가 설정 가능하다)

보안 기능 부족

  • 기본적으로 FTP는 평문 통신이기 때문에 보안에 취약하다
  • FTPS(FTP Secure)나 SFTP(SSH FTP)를 대안으로 사용 가능하다
    • FTPS: FTP에 SSL/TLS 암호화를 추가한 프로토콜, 기본 FTP와 호환되지만 암호화가 필요한 환경에서 사용
    • SFTP: SSH의 일종으로 SSH(TCP 22)를 통해 안전하게 파일 전송

 

FTP 서비스를 제공하는 패키지의 종류와 특징에 대해서도 간략하게 알아보자.

 

vsftpd(Very Secure FTP Daemon)

  • 리눅스와 유닉스에서 널리 사용
  • 보안성과 성능이 뛰어남 

ProFTPD

  • 모듈을 통해 확장이 가능해, 높은 유연성이 특징
  • 과거엔 많이 사용했으나 점차 줄어드는 추세..

FileZilla Server

  • 사용자 친화적인 GUI
  • FTP, FTPS 지원
  • 소규모 Windows 같은 환경에서 주로 사용

IIS-FTP(Internet Information Services)

  • Windows 서버에서 기본으로 제공하는 FTP 서버로, GUI 기반
  • Windows 서버 환경에서 FTP 서비스가 필요한 경우

 

 

2. FTP의 통신 방식: 제어 세션데이터 세션 수립 

 FTP에서는 목적에 따라 2가지 방식으로 세션(연결)을 수립하여 통신에 사용한다. 제어 세션(Control Session)데이터 세션(Data Session)이 그 방법들인데, 두 세션에 대해 아래의 설명을 참고하여 간략하게 파악해보자.

 

FTP Control Session(Connection)

  • 파일의 송수신을 제어하기 위한 세션 
  • 최초 접속, 로그인, 로그아웃, 명령어 전달, 결과 확인 등 실제 파일을 주고받는 것을 제외한 나머지 모든 과정이 제어 세션으로 진행된다
  • 포트 번호: TCP 21
  • 예시) 짜장면을 먹고 싶은 사람이 중국집에 전화 걸고, 주문하고, 주문 확인 등을 하기 위한 연결 

FTP Data Session(Connection)

  • 실제 파일 내용을 송수신하는 세션 
  • 포트 번호: Active Mode(TCP 20), Passive Mode(랜덤 포트)
  • 예시: 배달원이 고객에게 짜장면을 배달하기 위한 연결 

 

1) 제어 세션 수립(FTP Control Session)

먼저 제어 세션 수립 과정부터 확인해보자. 다음은 제어 세션 수립에서 FTP 서버와 클라이언트 간의 통신 과정을 정리한 다이어그램이다. 

<FTP COntrol Session>

 

과정 상세 설명

1. TCP 3-Way-Handshake(TCP의 연결 수립 과정)

2. (서) TCP 연결이 수립되면, PSH(push) 플래그로 FTP 220번 응답 코드를 보낸다

  • PSH 플래그: 데이터를 즉시 수신 측으로 전달할 때 사용(입력된 데이터를 지연 없이 처리할 때)
  • FTP 220: 서버가 클라이언트의 연결 요청을 받고, 연결이 가능하며 준비됨을 알림
    • 환영 메세지, ID(유저 네임) 요청

3. (클) ACK로 응답을 받았음을 알리고, 접속할 유저네임을 입력(전송)한다. 

4. (서) ACK로 응답을 받았음을 알리고, PSH(push) 플래그로 FTP 331번 응답 코드를 보낸다

  • FTP 331: 올바른 ID를 입력했음을 확인하고, 비밀번호를 요청

5. (클) ACK로 응답을 받았음을 알리고, 비밀번호를 입력(전송)한다. 

6. (서) ACK로 응답을 받았음을 알리고, PSH(push) 플래그로 FTP 230번 응답 코드를 보낸다

  • FTP 230: 정확한 비밀번호가 입력되어 로그인이 완료됐음을 알림

7. (클) ACK로 응답을 받았음을 알리면, 제어 세션 수립이 완료된다

 

실제로 제어 세션이 수립되는 과정을 wireshark를 통해 보게되면 FTP 응답 코드들을 확인할 수 있다.

<wireshark로 본 제어 세션 수립 과정>

 

2) 데이터 세션 수립(FTP Data Session)

 데이터 세션 수립 방식에는 Active 모드와 Passive 모드 2가지 방식이 있다. 먼저 Active 모드에 대해서 설명하자면, Active 모드로 데이터 세션을 수립하는 과정은 다음과 같다.

<Active 방식으로 데이터 세션 수립하는 과정>

 

과정 상세 설명 

1. (클) 클라이언트가 서버로 Port args(arguments, 명령)으로 데이터 전송을 받을 IP 주소, 포트 번호를 알려준다.

2. (서)  ACK로 응답을 받았음을 알리고, PSH(push) 플래그로 FTP 200번 응답 코드를 보낸다

  • FTP 200: Port args 수신 완료 

3. (클) 입력한 명령어에 따라 어떤 데이터를 전송할지 알린다.

  • NLST: ls, 현재 작업 디렉토리에 있는 파일과 디렉토리 이름 리스트만 출력

----------------------------------------(여기까지는 컨트롤 세션 연결 / TCP 21)---------------------------------------------

 

4. (서) 서버에서 클라이언트로 SYN 패킷을 보내 연결을 시도한다(TWHS)

5. (서) TCP 연결이 수립되면, PSH 패킷으로 FTP 150번 응답 코드를 보낸다

  • FTP 150: 데이터 전송 시작을 알린다

6. 데이터 통신이 이뤄진다

7. TCP 연결을 종료하며(FWHS), PSH 패킷으로 FTP 226번 응답 코드를 보낸다

  • FTP 226: 디렉토리/파일 목록 전송 완료

 

 Active 모드는 과거에 주로 사용하던 방식이었으나, 이 방법을 사용하는데 문제가 생겼다. Port args를 서버가 수신하여 클라이언트가 열어놓은 포트로 데이터 세션 수립을 시도하는데, 방화벽이 도입되면서 데이터 세션 수립을 위해 서버가 전송하는 SYN 패킷(inbound packet)이 차단되는 문제점이 생겼다(방화벽은 일반적으로 정책에 포함되지 않은 모든 인바운드 패킷을 차단하고, 아웃바운드 패킷은 허용한다). 이러한 문제를 해결하기 위한 방법으로는 방화벽을 끄는 방법이 있긴 하나, 이러한 행위는 아주 심각한 보안 문제를 초래할 수 있으므로, 대안으로 도입된 것이 Passive 모드이다. 

<방화벽에 SYN 인바운드 패킷이 막히는 문제가 생긴다>

 

 Active 모드와 Passive 모드의 차이는 '누가 데이터 세션 수립을 시작하느냐'이다. Active 모드에서는 클라이언트가 스스로의 포트 정보를 넘겨주고, 서버 측에서 SYN 패킷을 보내 데이터 세션 수립을 시작했다면, Passive 모드에서는 서버가 스스로의 포트 정보를 클라이언트 측에 넘겨주고, 클라이언트가 서버 쪽으로 SYN 패킷을 보내 연결을 시도한다. Passive 모드 방식으로 데이터 세션을 수립하는 과정을 다음 다이어그램을 참고하여 이해해보자.

<Passive 모드로 데이터 세션 수립하는 과정>

 

과정 상세 설명

1. (클) 서버로 PASV(Passive mode)로 설정함을 알림

2. (서) FTP 227 응답 코드를 보낸다.

  • FTP 227: Entering Passive Mode, 클라이언트가 연결할 서버의 IP주소와 포트 번호(랜덤 포트)를 알려줌

3. (클) 명령어를 입력하여 업로드/다운로드 할 데이터를 결정 

  • RETR: get, 파일 다운로드

4. (클) 클라이언트에서 서버측으로 SYN 패킷을 보내 TCP 연결을 수립한다(TWHS)

5. (서) TCP 연결이 수립되면, PSH 패킷으로 FTP 150번 응답 코드를 보낸다

6. 데이터 통신이 이뤄진다

7. TCP 연결을 종료하며(FWHS), PSH 패킷으로 FTP 226번 응답 코드를 보낸다

 

Windows cmd를 통해 FTP에 접속하는 것은 Active 모드만을 지원하기 때문에, Passive 모드로 FTP 서버를 이용하기 위해서는 FileZilla와 같이 Passive 모드를 지원하는 클라이언트 툴(도구)를 이용하면 된다. 

 

 

 

3. vsftpd(FTP) 서비스 설정 및 사용법

1) vsftpd 서비스 패키지 설치(dnf, rpm)

**아직 방화벽 설정 방법을 모르므로, 원활한 통신을 위해 서버 방화벽을 해제하고 실습을 진행한다.

dnf install vsftpd
rpm -ivh vsftpd-[버전]-[릴리즈].[아키텍처].rpm

2) 서비스 데몬 실행

systemctl start vsftpd
systemctl enable vsftpd
systemctl status vsftpd

netstat -anpt|grep 'vsftpd*'

<vsftpd 설정 상태 확인

 

3) FTP 서비스에 접속할 사용자 계정 생성 및 접속 

useradd [사용자 계정명]
passwd [사용자 계정명]

ftp [서버 주소]  //ftp 서버 접속 방법

<FTP 서버 접속 화면>

 

**Anonymous 설정: 계정 없이 FTP 서버에 접속 가능

<Anonymous 설정>

 

Windows FTP 사용법과 명령어

 

1) FTP 서버 연결 및 인증 

  • ftp [서버의 IP 주소] : 서버에 접속하는 기본 명령어 
  • bye/quit : FTP 서버에서 로그아웃

2) 디렉토리 탐색 및 관리 

  • 현재 디렉토리의 확인 및 목록 출력
    • ls : 서버 명령어 (Linux)
    • !dir: 클라이언트 명령어(Windows)
  • 디렉토리 변경 명령어 
    • cd : 서버 명령어 (Linux)
    • lcd : 클라이언트 명령어(Windows)
  • pwd : 서버 디렉토리의 경로를 표시 

3) 파일 전송 명령어

  • 서버에서 클라이언트로 파일 다운로드
    • get [파일명] : 파일 1개 다운로드
    • mget [파일명] : 여러 파일 다운로드
  • 클라이언트에서 서버로 파일 업로드
    • put : 파일 1개 다운로드 
    • mput : 파일 여러 개 다운로드

4) 기타 명령어 

  • mkdir : 서버에 새 디렉토리 생성
  • rmdir : 서버에 디렉토리 삭제

 

 

** 데이터 세션 연결 실패 및 해결 방법 

 FTP 서버를 이용하다보면 FTP 서버에 접속은 되는데, ls와 같은 명령어를 쳤을 때, 다음과 같은 오류가 발생하는 경우가 생긴다. 

<오류 상황>

 

문제 상황을 파악하기 위해 wireshark를 통해 패킷을 확인하면 다음과 같은 현상이 포착된다. 이것이 바로 Active 모드를 사용해서 FTP 서버와 통신했을 때 방화벽과 SELinux가 서버에서 보낸 SYN 패킷을 차단하기 때문에 발생하는 오류 상황이다. 

*SELinux: 리눅스 커널에 포함된 보안 모듈

<wireshark>

 

 실습을 위해 임시로 해결할 수 있는 방법은 방화벽과 SELinux를 모두 해제하는 것이다. 다음과 같은 방법으로 설정 가능하다.

systectl stop firewall.service

setenforce 0  // SELinux를 해제한다 
getenforce  // SELinux의 설정 상태 확인(permissive, enforcing)

 

하지만 해당 방법들은 서버의 보안 수준을 크게 낮출 수 있기 때문에 임시일 뿐, 권장되지 않는 방법이다. 근본적으로 해당 오류를 해결할 수 있는 방법은 앞서 언급한 Passive 모드를 지원하는 FileZilla와 같은 클라이언트 툴을 사용하는 것이다.

 

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디,

"When you have confidence, you can have a lot of fun. And when you have fun, you can do amazing things", John Namath

 

"내게 오는 시련들을 이겨낼 수 있다는 자신감을 갖고, 내가 하는 모든 것들을 즐기기 위해 노력하자"

 

'System > Linux' 카테고리의 다른 글

[Linux] Local Repository 만들기  (2) 2024.10.16
[Linux] e-mail(Mail Server)  (8) 2024.10.09
[Linux] DNS part 2  (2) 2024.10.03
[Linux] DNS part 1  (0) 2024.10.01
[Linux] 원격 관리 서비스(Telnet, SSH)  (1) 2024.09.26