UNIX/유닉스 공통

FTP LINUX ( Active mode / Passive mode)

99iberty 2013. 11. 6. 14:38

http://blog.naver.com/jinu5561/30048149975

 

FTP 요놈은 파일송수신에는 엄청 편리하게 써먹는 녀석이나 방화벽과 연결되는 부분을 확인하면 개념잡기가 힘들다.
2개의 전송모드에 차이점은 무엇이며 어떠한 원리를 가지고 접속되는지 알아보자.
1. FTP
먼저 FTP 서버가 사용하는 포트는 2개 이다.
하나는 로그인과 디렉토리 검색을 하기위해 사용되는 정보포트와 실제적으로 데이터를 업다운로드하는데 쓰이는 데이터 포트 이다.

FTP 서비스는 패시브모드(Passive-mode)액티브모드(Active-mode) 2가지를 지원한다.
간단히 말하자면 연결요청을 어느누가 할것인가에 차이이다.
Active-mode 는 클라이언트 기반 접속으로 클라이언트에 선점되지 않은(1024이상)의 포트에서 웹서버쪽에 21번 포트로 FTP를 접속한다.
클라이언트에서 서버쪽으로 port 명령어를 보내는것으로 랜덤포트를 이용하여 서버 포트로 접속하는 것으로 서버포트는 항상 21번 포트로 접속된다.

따라서 Active 모드 접속시에 문제점이 발생되는 경우는 대부분이 클라이언트측에 있다.
FTP 클라이언트는 서버의 데이터포트로 실제 연결을 생성하지 않고 단지 서버에게 자신이 리스닝하는 포트를 이야기하고 서버 클라이언트가 이야기한 포트로 연결을 맺는다.
만일 자신이 공유기나 마스커레이드를 통해서 FTP를 접속을 시도하게 되면 서버로의 접속후에 클라이언트쪽으로 접속을 요청할때 사설아이피를 못찾아서 실패하는 경우이다.
이는 서버에 Passive 모드접속을 허용하지 않게끔 설정두어서 생기게되는 경우로 서버설정에 변경없이 꼭접속을 하기를 원한다면 공유기를 떼고 다이렉트로 접속해 보면 된다.
이에 공유기나 마스커레이드 같은 사설사용자들을 위해 생겨난 방식이 Passive 모드이다.
Passive-mode 는 서버쪽 21번 포트로 접속시, 클라이언트의 랜덤포트가 아니라 서버쪽 랜덤포트를 이용하게 된다.
서버는 클라언트에게 pasv 명령어를 보내며, 클라이언트는 승인하게 된다.
문제는, 패시브모드의 경우 서버쪽에 1024 에서 65535 포트 사이를 랜덤하게 할당하며, 네트워크 세션이 있을때마다 신규포트를 이용하게 된다.

이때, 서버쪽에 방화벽을 운영하거나 대량접속서비스가 운영중일때는 네트워크 자원이 부족하게 되어 접속장애가 있을수 있다.
FTP를 통한 실제세션은 어떠한지 한번 확인해보자.
아래는 FileZilla를 통해서 FTP 서버로 접속해서 특정 동영상파일을 다운로드하는 과정이다.
# Active-mode 상태로의 FTP 접속
응답: 220 (vsFTPd 2.0.5)
명령: USER mojily
응답: 331 Please specify the password.
명령: PASS **********
응답: 230 Login successful.
명령: SYST
응답: 215 UNIX Type: L8
명령: FEAT
응답: 211-Features:
응답: EPRT
응답: EPSV
응답: MDTM
응답: SIZE
응답: TVFS
응답: 211 End
상태: 접속되었습니다
상태: /DVDRip.XviD.CD1-XXXXX.avi 다운로드 시작 중
명령: PWD
응답: 257 "/"
명령: TYPE I
응답: 200 Switching to Binary mode.
명령: PORT 218,236,115,239,12,13
응답: 200 PORT command successful.
명령: RETR DVDRip.XviD.CD1-XXXXX.avi
응답: 150 Opening BINARY mode data connection for DVDRip.XviD.CD1-XXXXX.avi (162157784 bytes).
응답: 226 File send OK.
상태: 다운로드 완료
명령: PWD
응답: 257 "/"
명령: TYPE A
응답: 200 Switching to ASCII mode.
명령: REST 0
응답: 350 Restart position accepted (0).
접속과정을 통해서 보면 PORT 명령의 옵션으로 6가지의 숫자가 사용되는데 처음 4가지의 숫자는 IP주소를 의미하고 마지막 2가지의 숫자는 포트번호이다.
포트번호의 (첫번재 숫자 * 256) + 두번째 숫자를 계산해보면 실제 포트번호를 얻을수 있다.
PORT 218,236,115,239,12,13
(12 * 256) + 13 = 3085
실제 시스템에서의 포트사용번호를 비교해보면 일치한다.
[root@mojily src]# netstat -atnp |grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 21414/vsftpd
tcp 0 0 218.236.115.222:21 218.236.115.239:3082 ESTABLISHED 21461/vsftpd
tcp 0 127424 218.236.115.222:20 218.236.115.239:3085 ESTABLISHED 21472/vsftpd
tcp 0 0 218.236.115.222:21 218.236.115.239:3084 ESTABLISHED 21470/vsftpd
패시브모드를 설정하고 확인해보면 이 반대의 결과인 서버쪽에 포트가 변경되서 접속됨이 확인이 가능할 것이다.
따라서 방화벽을 사용하게 되면 접속및 데이터 송수신포트자체가 고정적이지 못할경우에는 문제점이 많다.
이럴대는 서버쪽에 포트를 고정하는 방식(패시브모드)으로 수정해서 사용하면 된다.
이제는 방화벽 설정을 사용하기 위해 패시브 포트를 고정하는 방법을 확인해 보자.
2. Passive-Mode를 사용하기 위한 포트 고정방법
1) Window 시스템
Windows 2000 Server 및 Windows Server 2003 모두 PassivePortRange 값을 이용하여 조정이 가능하다.
Windows Server 2003 의 경우는 메타베이스를 수정
1. 인터넷 정보 서비스 관리] - [로컬 컴퓨터] - [속성 ] - [메타베이스 직접 편집 허용]에 체크
2. C:\WINDOWS\system32\inetsrv 밑에 metabase.xml 을 메모장으로 연다.
3. 고정해야될 패시브 데이타 포트항목을 아래 라인과 같이 추가한다.
PassivePortRange="5001-5001"
..................................................................................
..................................................................................
..................................................................................
<IIsFtpService Location ="/LM/MSFTPSVC"
AdminACL="XXXXXXXX"
AllowAnonymous="TRUE"
AnonymousOnly="FALSE"
AnonymousUserName="IUSR_SERVER-X62W0LSZ"
AnonymousUserPass="XXXXXXXXX"
ConnectionTimeout="120"
DownlevelAdminInstance="1"
ExitMessage=" "
LogAnonymous="FALSE"
LogExtFileFlags="XXXXXXXXX"
LogFileDirectory="C:\WINDOWS\system32\LogFiles"
LogFilePeriod="1"
LogFileTruncateSize="20971520"
LogNonAnonymous="FALSE"
LogOdbcDataSource="TSLOG"
LogOdbcPassword="XXXXXXXXXX"
LogOdbcTableName="FTPLog"
LogOdbcUserName="InternetAdmin"
LogPluginClsid="{FF160663-DE82-11CF-BC0A-00AA006111E0}"
LogType="1"
MSDOSDirOutput="TRUE"
MaxClientsMessage=" "
MaxConnections="100000"
PassivePortRange="5001-5001"
>
</IIsFtpService>
..................................................................................
..................................................................................
..................................................................................
4. 편집한 metabase.xml 파일을 저장한다
5. IIS 를 다시한번 재시작한다.
6. Ipsec 이나 방화벽이 설정되어있다면 tcp 5001을 추가한다.

Windows 2000 Server 의 경우는 레지스트리 값을 추가

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msftpsvc\Parameters\
에서 REG_SZ 타입의 PassivePortRange 값이름을 추가한다.
값으로는, 5500-5700 을 설정한다.
2) Linux 시스템
먼저 패시브 모드를 사용하기 위해서는 서버에 ip_conntrack 모듈이 있어야 한다.
ip_conntrack 은 연결추적 모듈이다. 몇번 IP 가 몇번 포트를 통해서 접속했는지에 대한 정보가 담겨있다.
정보가 담겨있는 위치는 /proc/net/ip_conntrack 이다.
[root@smileserv ~]# cat /proc/net/ip_conntrack
........................................................................................................................
........................................................................................................................
........................................................................................................................
udp 17 27 src=219.78.47.179 dst=111.111.111.241 sport=7957 dport=8630 packets=1 bytes=90 src=111.111.111.241 dst=219.78.47.179 sport=8630 dport=7957 packets=1 bytes=81 mark=0 use=1
udp 17 7 src=58.172.208.159 dst=111.111.111.241 sport=55210 dport=8630 packets=2 bytes=306 src=111.111.111.241 dst=58.172.208.159 sport=8630 dport=55210 packets=2 bytes=411 [ASSURED] mark=0 use=1
udp 17 114 src=111.111.111.1111 dst=222.222.222.22 sport=33181 dport=161 packets=34 bytes=2692 src=222.222.222.22 dst=111.111.111.236 sport=161 dport=33181 packets=34 bytes=2875 [ASSURED] mark=0 use=1
패시브 모드를 사용하기 위한 vsftp.conf 설정
[root@smileserv ~]# vi /etc/vsftpd/vsftpd.conf
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
........................................................................................................................
........................................................................................................................
## 데이터 전송을 위해서 Passive mode를 사용할 것인지 설정 (기본값 = YES)
## => Active Mode로 접근할 수 없는 사용자들을 위해 활성화
pasv_enable=YES
## 패시브 모드로 연결시 할당될 최대 및 최소 포트를 설정 (기본값 = 0)
## => 일반적으로 50000~60000 포트를 지정 (기본값 = 0)
## 기본값인 0은 well-known port를 제외한 무작위 포트를 이용하게 됩니다.
pasv_min_port=50000
pasv_max_port=50001
.......................................................................................................................
........................................................................................................................
패시브 모드를 사용하기 위한 proftpd.conf
AllowForeignAddress on
# 30000 ~ 32000 Port 를 사용해서 패시브 포트 지정
PassivePorts 50000 50001
실제로 바뀐부분이 적용되는지를 확인해 본다.
[root@smileserv ~]# netstat -atnp |grep vsftpd ==> FTP 접속전
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 21363/vsftpd

[root@mojily ~]# netstat -atnp |grep vsftpd ==> FTP 접속중
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 21363/vsftpd
tcp 0 0 218.236.115.222:21 220.90.215.4:3621 ESTABLISHED 21374/vsftpd
tcp 0 0 218.236.115.222:21 220.90.215.4:3622 ESTABLISHED 21377/vsftpd
[root@mojily ~]# netstat -atnp |grep vsftpd ==> PASV 고정전 데이타 전송중
tcp 0 0 218.236.115.222:34795 0.0.0.0:* LISTEN 21427/vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 21414/vsftpd
tcp 0 0 218.236.115.222:21 220.90.215.4:1090 ESTABLISHED 21422/vsftpd
tcp 0 0 218.236.115.222:21 220.90.215.4:1091 ESTABLISHED 21425/vsftpd
tcp 0 87765 218.236.115.222:34795 220.90.215.4:1106 ESTABLISHED 21427/vsftpd

[root@mojily ~]# netstat -atnp |grep vsftpd ==> PASV 고정후 데이타 전송중
tcp 0 0 218.236.115.222:50001 0.0.0.0:* LISTEN 21379/vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 21363/vsftpd
tcp 0 116800 218.236.115.222:50001 220.90.215.4:3666 ESTABLISHED 21379/vsftpd
tcp 0 0 218.236.115.222:21 220.90.215.4:3621 ESTABLISHED 21374/vsftpd
tcp 0 0 218.236.115.222:21 220.90.215.4:3622 ESTABLISHED 21377/vsftpd
설정된 정보가 잘 반영되는것이 확인된다.
주의 ) 익스플로러를 통해서 FTP 접속은 패시브 모드방식이다.
따라서 패시브 모드 접속이 안되는 사설아이피같은 경우는 익스플로러에서는 접속이 불가능하다. 이럴땐 FTP 클라이언트 프로그램을 이용해서 접속!!

--다른 본문

FTP 서비스는, 일반적인 인터넷 서비스와 달리 2개의 포트를 사용합니다. 명령어와 응답이 오가는 command포트(control 포트)와 실제 데이터가 오가는 data포트로 구성된 TCP기반의 서비스입니다. 흔히 알려진 21번 포트는, 서버에서 일반적으로 사용하는 command포트의 번호입니다.

FTP 클라이언트(Filezilla, WS-FTP, CuteFTP, ALFTP)command포트를 이용해 서버에 접속을 시도합니다.

command포트를 통해 명령어 및 포트 정보와 회신내용이 오갑니다. Active모드와 Passive모드 근본적인 차이는, 실제 데이터가 오가는 data포트의 접속 방식에 있습니다.


Active모드에서는 command포트를 통해 클라이언트가 보내준 정보를 바탕으로, 서버가 클라이언트의 data포트에 접속을 시도한 후, 클라이언트의 요청에 따라 데이터를 클라이언트에 전송해 줍니다.
Passive모드에서는 command포트에 접속하는 것 뿐만 아니라, 데이터 접속도 클라이언트에서 시도하여, 서버에 데이터를 요청하고 전송받는 방식을 취합니다.

방화벽이나 공유기 환경의 클라이언트에서는 Active모드의 전송이 이루어지지 않는 경우가 있습니다.

(서버) → (클라이언트 측의 방화벽 또는 공유기) → (클라이언트)

즉, 클라이언트에 설치된 방화벽 입장에서 보면, 외부로부터의 접속 요청이기 때문에 대부분 차단되는 경우가 많습니다. 또한, FTP클라이언트 프로그램에서는 문제가 없으나, 웹브라우저로 FTP접속을 시도하면 문제가 있는 경우가 있습니다. 이는, 웹브라우저가 Passive모드를 디폴트로 사용하기 때문입니다. 서버의 입장에서, Passive모드는 클라이언트에서 서버에 접속하여 데이터에 접근하는 방식이기 때문에, 보안상의 문제점이 존재하게 됩니다. 실제 FTP 서버에서 Passive모드를 사용하지 않는 경우도 많습니다. 이런 경우, Passive모드의 웹브라우저로는 데이터연결이 어렵게 됩니다.

Active FTP vs. Passive FTP, a Definitive Explanation

기본 개념 (The Basics)

FTPTCP기반이자 TCP만을 사용하는 서비스로, UDP 구성요소를 사용하지 않습니다. 일반적인 인터넷 서비스와는 달리, FTPdata포트와 command포트 (control 포트)라고 불리는 2개의 포트를 사용합니다. 전통적으로, FTP 서버에서는 21번 포트가 command포트로, 20번 포트가 data포트로 사용되고 있습니다. 여기서, FTP의 모드에 따라, data포트가 항상 20번이 아니라는 점이 혼동의 시작이 됩니다.

Active FTP

Active 모드의 FTP에서, 클라이언트는 사용되지 않는 랜덤한 포트 n(n>1023)을 통해 서버의 command 포트(21)에 접속합니다. 이때, 포트번호 n1을 더한 즉, n+1번 포트의 정보를 서버에 전송하며, 클라이언트는 n+1번 포트를 청취(listening)하기 시작합니다.
FTP 서버의 data포트(20)는 클라이언트에서 지정한 data포트(n+1)를 통해 클라이언트에 접속합니다. 서버에 설치된 방화벽의 입장에서 살펴보면, Active 모드의 FTP가 지원되려면, 다음의 통신채널이 열려있어야 합니다.

- FTP서버의 21번 포트 : 클라이언트에서 접속을 시도할 수 있는 command포트가 온전히 열려있어야 함
- FTP서버의 21번 포트 → 클라이언트의 n(n>1023)번 포트 : 서버에서 클라이언트의 command포트로 응답
- FTP서버의 20번 포트 → 클라이언트의 n+1(n>1023)번 포트 : 서버에서 클라이언트의 data포트로의 접속
- FTP서버의 20번 포트 ← 클라이언트의 n+1(n>1023)번 포트 : 클라이언트에서 서버의 data포트에 응답

FTP의 접속 연결을 도식화하면, 다음의 그림과 같습니다.

[ Active mode FTP connection ]

1. 클라이언트의 command포트(1026: 랜덤값)가 서버의 command포트(21)에 접속하고, 이때 서버에 1027번 포트정보를 전송.
2. 서버는, 응답내용을 클라이언트의 command포트(1026)에 회신.
3. FTP서버는, 서버의 data포트(20)를 클라이언트의 data포트(1027: 클라이언트에서 지정한 포트)에 접속.
4. 클라이언트는 응답내용을 서버에 회신.

Active 모드의 FTP에서 접속문제는 대부분 클라이언트측에서 기인합니다. FTP클라이언트는 서버의 data포트에 직접 접속을 할 수가 없습니다. 단지, 어떤 포트를 청취(listening)하고 있으며, 서버가 데이터 전송을 위해 접속해야할 클라이언트의 포트를 서버에 알려줄 뿐입니다.
클라이언트에 설치된 방화벽의 입장에서 살펴보면, FTP 서버가 클라이언트의 특정포트에 접속하려는 시도가, 외부의 시스템이 침입으로 간주되어 방화벽에 의해 차단되는 경우가 종종있습니다.

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8

Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PORT 192,168,150,80,14,178

200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for file list.
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.

[ Acive FTP Example ]

Passive FTP

서버가 클라이언트에 접속을 시도해야하는 문제점을 해결하기 위해, 다른 방식의 FTP 연결이 개발되었으며, 이를 passive모드 또는 PASV라고 부릅니다. 서버에 접속하기 위해 클라이언트의 명령이 전송되는 점은 같으나, 그 이후의 방식이 Passive모드의 특징이 됩니다.

Active모드를 이용할 때, 클라이언트에 설치된 방화벽이 FTP서버의 접속 시도를 외부의 침입으로 간주, 차단하는 문제가 있습니다. 이러한 문제를 해결하기 위해 Passive모드에서는 두개의 포트 모두, 클라이언트에서 서버에 접속을 합니다.

FTP연결을 위해, 클라이언트는 사용되지 않는 랜덤한 포트 n(n>1023)n+1포트를 열어둡니다. n포트는 서버의 command포트인 21번 포트에 접속합니다. 그러나, 클라이언트는 (서버로 하여금 클라이언트의 data포트에 연결을 허용하기 위해) PORT명령어를 호출하지 않고, PASV명령어를 호출합니다.
그 결과, 서버는 사용되지 않는 랜덤한 포트 p(p>1023)를 열어두고, 클라이언트에 해당 포트정보를 넘겨줍니다.
최종적으로, 클라이언트는 데이터 전송을 위해, 자신의 n+1포트와 서버의 p포트의 연결을 시도합니다.

서버에 설치된 방화벽의 입장에서 살펴보면, Passive 모드의 FTP가 지원되려면, 다음의 통신채널이 열려있어야 합니다.

- FTP 서버의 21번 포트 : 클라이언트에서 접속을 시도할 수 있는 command포트가 온전히 열려있어야 함
- FTP 서버의 21번 포트 → 클라이언트의 n(n>1023)번 포트 : 서버에서 클라이언트의 command포트로 응답
- FTP 서버의 p(p>1023)번 포트 : 클라이언트의 n+1(n>1023)번 포트에서 데이터 접속
- FTP 서버의 p(p>1023)번 포트 → 클라이언트의 n+1(n>1023)포트 : 클라이언트의 요청에 대한 응답 및 실제 데이터를 전송

FTP의 접속 연결을 도식화하면, 다음의 그림과 같습니다.

[ Passive mode(PASV) FTP connection ]

1. 클라이언트의 command포트(1026)가 서버의 command포트(21)에 접속하고, PASV명령어를 호출합니다.
2. 서버는, 응답내용과 함께 데이터 연결을 위해 청취(listening)되는 포트(2024)정보를 클라이언트에 전송합니다.
3. FTP 클라이언트는, 데이터 연결을 위해 자신의 data포트(1027)를 서버의 특정포트(2024 : 서버에서 지정한 포트)에 연결합니다.
4. 서버는 최종접으로 응답내용을 클라이언트의 data포트(1027)에 회신합니다.

Passive모드의 FTP가 클라이언트 입장의 문제점을 해결했다면, 서버 입장에서는 포트 전체를 열어두어야 하는 문제점을 낳았습니다. FTP접속을 위해, 서버의 많은 수의 포트가 필요하다는 점이 가장 큰 문제점이기도 합니다.
다행히도, WU-FTPD를 포함한, 많은 FTP 서버 프로그램에는 FTP 서버가 사용할 포트 범위를 지정할 수 있는 기능을 내장하고 있습니다. 좀 더 자세한 내용은 다음의 링크를 참고하도록 합니다.


두 번째 문제는 클라이언트가 Passive모드를 지원하느냐와 그렇지 않느냐에 따른 문제가 있습니다. 일 예로, Solaris에 제공되어지는 커멘드라인 FTPPassive모드를 지원하지 않기 때문에 ncftp와 같은 프로그램이 필요로 하게 됩니다. 웹(World Wide Web)의 선풍적인 인기와 함께, 많은 사람들이 웹브라우저를 FTP클라이언트로 이용하곤 합니다. 대부분의 웹브라우저는 ftp://URLs을 이용하여 FTP에 접속할 때, Passive모드만을 지원합니다.
서버의 Passive모드 지원 여부 및 방화벽 설정에 따라, 웹브라우저를 이용한 FTP접속은 좋은 방법일 수도 아닐 수도 있습니다.

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8

Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV

227 Entering Passive Mode (192,168,150,90,195,149).
---> LIST
150 Opening ASCII mode data connection for file list
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.
[ Passive FTP Example ]

(작성중)

Other Notes

A reader, Maarten Sjouw, pointed out that active FTP will not function when used in conjunction with a client-side NAT (Network Address Translation) device which is not smart enough to alter the IP address info in FTP packets.

Summary

The following chart should help admins remember how each FTP mode works:

Active FTP :
command : client >1023 -> server 21
data : client >1023 <- server 20

Passive FTP :
command : client >1023 -> server 21
data : client >1023 -> server >1023

A quick summary of the pros and cons of active vs. passive FTP is also in order:

Active FTP is beneficial to the FTP server admin, but detrimental to the client side admin. The FTP server attempts to make connections to random high ports on the client, which would almost certainly be blocked by a firewall on the client side. Passive FTP is beneficial to the client, but detrimental to the FTP server admin. The client will make both connections to the server, but one of them will be to a random high port, which would almost certainly be blocked by a firewall on the server side.

Luckily, there is somewhat of a compromise. Since admins running FTP servers will need to make their servers accessible to the greatest number of clients, they will almost certainly need to support passive FTP. The exposure of high level ports on the server can be minimized by specifying a limited port range for the FTP server to use. Thus, everything except for this range of ports can be firewalled on the server side. While this doesn't eliminate all risk to the server, it decreases it tremendously. See Appendix 1 for more information.
References

An excellent reference on how various internet protocols work and the issues involved in firewalling them can be found in the O'Reilly and Associates book, Building Internet Firewalls, 2nd Ed, by Brent Chapman and Elizabeth Zwicky.

Finally, the definitive reference on FTP would be RFC 959, which sets forth the official specifications of the FTP protocol. RFCs can be downloaded from numerous locations, including http://www.faqs.org/rfcs/rfc959.html.