[ISA 2000] FTP 서버의 동작 원리(#1/#4)

FTP(File Transfer Protocol) 프로토콜은 일반적으로 많이 사용되는 프로토콜이지만 한편으로는 잘못 알고 있는 프로토콜이기도 하다. 방화벽, 라우터 그리고 다른 인터넷 연결 디바이스를 다룰 때 종종 발생하는 문제점으로는 특정한 FTP 클라이언트 또는 서버 구성이 왜 제대로 동작하지 않느냐이다. 네트워크 및 방화벽 관리자들이 FTP 프로토콜의 동작원리를 이해하고 있다면 발생할 수 있는 FTP 관련 문제점들을 쉽게 해결할 수 있을 것이다.


이 강좌는 모두 4개의 장으로 구성되어 있으며, 목차는 다음과 같습니다.

● FTP 프로토콜의 동작 원리
● FTP 모드
● FTP 프로토콜에 관련된 문제 해결하기
● Secure FTP란 무엇인가 ?

이 글에서는 FTP 프로토콜에 대한 연결 부분에 대해서만 살펴 볼 것이다. 다른 말로 표현하자면 FTP 프로토콜이 어떻게 연결을 생성하는지 이러한 연결이 어떻게 서로 관계되는지에 대해서만 관심을 가질 것이다. 특정한 FTP 클라이언트나 FTP 서버 구성에 대해서는 다루지 않는다.


FTP 프로토콜의 동작 원리

1. 역사 속으로
  FTP는 TCP/IP 네트워크 간에 파일을 교환하는 목적의 일환으로 1970년대에 개발되었다. FTP는 유연한 호환성을 염두에 두고 설계되어 TCP/IP 네트워크가 아닌 네트워크에서도 사용될 수 있고 또한 다양한 시스템 간에 파일을 송수신할 수 있는 기능을 가지고 있다.

FTP의 기본 규격은 1985년 10월자로 RFC 959에 명시되어 있다. FTP에 관련된 추가적인 RFC들이 존재한다. FTP에 관련된 모든 기술 문서들은 다음의 URL에서 찾아볼 수 있다.

  http://www.networksorcery.com/enp/default0403.htm

2. FTP 모델
  FTP는 신뢰할 수 있는 종단간 연결을 제공하는 연결 프로토콜로서 TCP를 사용하는데 특이하게도 두 개의 연결이 사용된다 : 첫 번째 연결은 제어 연결, 두 번째 연결은 데이터 연결(데이터 전송을 관리하는데 사용된다). 제어 연결을 수립한 사용자는 클라이언트로 동작하고, 원격 호스트는 서버 기능을 수행한다고 가정한다.

FTP 애플리케이션의 양쪽 링크에는 PI(Protocol Interpreter)와 DTP(Data Transfer Process)가 내장되어 있다. 또한 링크의 클라이언트 측에서는 사용자 인터페이스가 존재하게 된다.

사용자 삽입 이미지

사용자 인터페이스(User Interface)는 제어 연결을 담당하는 PI와 통신한다. PI는 제어 프로토콜에 응답하는 기능을 제외하고도 데이터 연결을 관리한다. 파일이 전송되는 동안 데이터 관리는 DTP가 수행하게 된다.

3. FTP 프로토콜 모드
  FTP는 제어 연결(주 연결)과 데이터 연결(보조 연결)을 사용하기 때문에 매우 복잡하다. FTP 프로토콜 모드에 따라 데이터 연결의 수립이 결정된다. FTP의 모드에는 두 가지가 있다.

  ● 표준 또는 PORT 또는 Active 모드
  ● Passive 또는 PASV 모드

이제 두 가지 연결의 차이점에 대해 좀더 자세히 살펴 보자

4. 제어 연결
  제어 연결은 명령어의 교환 및 응답을 위해 USER-PI와 SERVER-PI간의 통신 경로를 뜻한다. 이 연결은 Telnet 프로토콜의 방식을 따라 하고 있다.

  FTP 클라이언트가 FTP 서버와 파일들을 교환하고자 할 때 FTP 클라이언트는 먼저 제어 연결을 수립해야 한다. 클라이언트는 임의의 특권을 가지지 않는 N(N>1024) 번 포트에서 FTP 서버의 잘 알려져 있는 포트인 21번 포트로 연결을 생성한다.

정보가 어떻게 서로 교환되는지 다음의 그림을 보면서 살펴 보자.

사용자 삽입 이미지

데이터 전송이 진행되는 동안 제어 연결이 열린 채로 남아 있어야 한다는 점을 주목하자. 즉, 데이터 연결은 열려진 제어 연결이 없다면 존재하지 않는다. 한편으로는 데이터 연결은 항상 존재할 필요는 없으며 제어 연결이 이루어지는 동안 많은 수의 데이터 연결이 있을 수 있다. 마지막으로 사용자는 FTP 서비스의 사용을 끝마칠 때 제어 연결을 닫는 요청을 해야 한다.

5. 데이터 연결
  데이터 연결은 실제 데이터의 전송을 위해 USER-DTP와 SERVER-DTP 간의 통신 경로를 의미한다. 선택한 FTP 모드에 기반하여 데이터 연결을 서버(Active 모드) 또는 클라이언트(Passive  모드)에서 초기화된다.
  Active 모드에서 클라이언트는 서버에게 PORT 명령을 전송한다. 기본적으로 이 명령어는 서버가 데이터 연결을 위해 반대로 연결하기 위해 호스트(IP 주소)와 포트 번호(1024보다 큰)를 알려주게 된다. Port 명령어를 수락한 이후에 서버는 서버의 로컬 20번 데이터 포트에서 PORT 명령어에서 알아 낸 IP 주소와 포트 번호로 데이터 연결을 수립할 것이다.

Passive 모드에서는 클라이언트는 서버로 PASV 명령을 전송한다. 기본적으로 이 명령은 서버가 어떤 데이터 포트로 청취할지(기본 20번 포트가 아님) 그리고 하나를 초기화하기보다는 연결을 기다리기를 요청한다.

원문: http://isaserver.org/articles/How_the_FTP_protocol_Challenges_Firewall_Security.html

reTweet
Posted by 문스랩닷컴
blog comments powered by Disqus


    이 글은, 예전에 보아 논 자료로 박승규(NOnvngNO@(at)핫메일(쩜)컴)님이 작성하신 글인데, 약간 보기 편리하도록 간략히 정리하였습니다.


    FTP 서버를 방화벽 내부에서 구동하려면 FTP connection type에 대한 이해가 필요합니다. 이러한 원리를 이해하시려면 tcp/ip, firewall 에 대한 사전 지식이 필요합니다.

    active connection vs. passive connection

    FTP에서 사용되어지는 connection type은 2가지로 나눕니다.

    첫번째가 control connection으로서 FTP client software에 의해 초기화(접속시도)됩니다. 이것은 client:X 에서 server:ftp (port 21)로 접속이 이루어지며 command 전송시 사용되어 집니다.

    클라이언트:X -> 서버:ftp

    여기서 X 는 1023보다 큰 비사용중인 포트를 말합니다.

    두번째는 data connection으로서 이것은 active mode와 passive mode로 나누어지며 data(실제 전송될 파일) 전송시 사용되어 집니다. 이때 일반적인 FTP server는 active mode로 data를 전송합니다.

    active mode는 다음과 같은 절차로 연결을 진행하게 됩니다.

    - FTP client는 data 전송시 passive connection을 사용하는지 요청하게 되고 그렇지 않을 경우 FTP server가 data 전송을 위해 접속하게될 client 자신의 port(Y라고 가정)를 서버에게 알려줍니다.
    - FTP 서버는 ftp-data port(20번)를 통해 client가 알려준 포트로 접속을 시도를 요청합니다. (syn packet 전송)
    - 해당 client는 요청에 대한 수신 확인 및 허락을 전송합니다.(awk+syn packet 전송)
    - server는 client가 보낸 packet에 대한 수신 확인을 전송합니다.(awk packet)
    - 이로서 connection은 형성되고 data를 전송하게 됩니다. (자세한 내용은 RFC 문서를 참고하시기 바랍니다)

    즉 server:ftp-data -> client:Y 형태로 연결됩니다.

    이러한 이유로 방화벽내부에 FTP server를 운영할 경우 command는 전달되나 실제 data가 전송되지 않는 문제가 발생합니다. (ipchains로 설정할 경우, iptables의 경우라면 전송되는 flag에 따라 섬세하게 설정 가능)

    또한 firewall 운영시 내부네트웍에서 외부로 나가는 1023 이상의 포트를 모두 열여 주어야 하는 문제도 발생됩니다. (firewall 제품 active mode에 대해 지원하기도 하고 그렇지 않은 제품도 있습니다)

    passive mode는 다음과 같은 연결을 진행하게 됩니다.

    - FTP client가 data 전송시 FTP server에게 passive connection를 사용하는지 여부를 요청하게 됩니다.
    - passive connection를 사용한다면 FTP server는 client가 data 전송을 위해 Server에 접속할 1023이상의 port를 알려주게 됩니다. (이때 사용할 포트를 N 이라고 정하며, N 값은 FTP server 마다 설정이 다릅니다. 즉 active connection에서 사용하는 ftp-data(20번) port를 사용하지 않습니다.)
    - FTP client는 Server가 알려준 port N으로 접속을 시도하기 위해 syn packet을 자신의 Z(1023이상의 비사용 중인) port을 열어 전송합니다.
    - FTP server는 awk+syn packet을 통해 수신 확인 및 연결을 허락하게 됩니다.
    - FTP client는 awk packet을 전송하여 수신 확인을 하고 connection을 맺은 후 data를 전송하게 됩니다.

    즉 client:Z -> server:N 의 형태로 연결됩니다.

    이러한 경우라면 방화벽에서 FTP server가 passive connection에서 사용하게 될 port를 열어 정상적으로 data 전송이 가능합니다.

    FTP server를 passive connection으로 운영하기 위한 설정

    Linux에서 운영하는 대표적은 FTP server인 wu-ftpd와 proftpd에 대해서만 언급하겠습니다.

    설정 방법은 해당 파일에 passive port로 사용할 port 영역을 명시하게 됩니다. 2000개 이상의 port를 열것을 권장하며, 일반적으로10000번 이하의 포트를 사용합니다.

    wu-ftpd의 경우

    wu-ftpd에서 제공하는 /etc/ftpaccess 파일에 다음 내용을 추가합니다. standalone type server라면 반드시 restart 합니다.

    passive ports 0.0.0.0/0 15000 17000

    즉 wu-ftpd를 passive FTP로 운영하기 위해 15000~17000 포트를 사용하는 것으로 설정한 것입니다.

    proftpd의 경우

    proftpd에서 제공하는 /etc/proftpd/conf/proftpd.conf 파일에 다음 내용을 추가합니다. standalone type server라면 반드시 restart 합니다.

    PassivePorts 60000 62000

    즉 proftpd를 15000~17000 포트를 이용하여 passive FTP로 운영할 것을 설정한 것입니다.

    passive connect시 client에서 주의할 사항

    일반적으로 server를 passive connection으로 운영할 경우 client 또한 passive mode 로 사용하여야 합니다. Netscape의 경우 특별한 문제가 발생하지 않으며, ncftp의 경우 접속후 set passive on 명령어를 수행하시면 됩니다. gftp를 사용하신다면 FTP -> Options -> General -> "Passive file transfer" 를 설정하시기 바랍니다.



    참고적으로, FTP 서버 구축시 IPSec으로 필터링하는 경우 해결 방법에 대한 자료는 아래 링크를 참고하세요.

    http://www.ntfaq.co.kr/ntfaq_view.asp?faq_no=2399
    reTweet
    Posted by 문스랩닷컴
    blog comments powered by Disqus


      Web Analytics Blogs Directory