FTP Passive mode 와Active mode
FTP 서버의Passive 모드는명령어연결(Control connection)과데이터연결(Data Connection)을분리해서접속하는방식이다.
1. Active 모드
Active 모드는클라이언트가보내준정보를기준으로서버에서클라이언트의Data 포트에접속을시도한후클라이언트의요청에따라데이터를전송하는방식이다.
하지만Ip 공유기등사설IP에서접속을시도할경우클라이언트의Data 포트가막힐가능성이있기때문에500 Illegal PORT command 와같은오류를출력할수있다.
즉명령은전달이되었지만실제적으로전송을담당하는데이터포트가막혀서데이터를전송못할가능성이있다.
▪연결과정
1. FTP 클라이언트에서-> FTP서버IP xxx.xxx.xxx.xxx 포트21 번으로접속
2. FTP서버의21 포트-> FTP클라이언트1023(n) 이상의Command 포트로응답(서버에서클라이언트의Command 포트로응답. FTP클라이언트Command 포트는random 할당된것.)
※여기까지는Passive 모드와동일함
3. FTP서버의20번FTP-data포트-> 클라이언트n+1 번FTP-data포트로접속요청(서버에서클라이언트의data포트로접속요청), 서버ftp-data포트(20) -> 클라이언트ftp-data포트(n+1)로접속요청, syn 요청
4. FTP클라이언트n+1 번FTP-data포트에서-> FTP서버의20번FTP-data포트로응답(클라이언트에서서버의data포트로응답), 클라이언트ftp-data(n+1) 에서서버ftp-data(20)으로응답syn+ack
5. 서버ftp-data(20) -> 클라이언트ftp-data(n+1) 로수신응답, ack, data 전송.
*실제로포트번호는정해진것이아닌1023포트이상에서서버나클라이언트가정함
연결과정에있어서클라이언트는서버에접속할때PORT xxx,xxx,xxx,xxx,yy,nn 이런식의메세지를전달한다. 여기서xxx 는IP Address를나타내고포트는마지막부분yy,nn 부분이다.
포트번호는(yy * 256) + nn 으로결정이되어클라이언트의포트를서버에알려준다.
2. Passive 모드
Passive 모드는데이터포트와명령포트전부클라이언트에서서버로연결을하는방식이다.즉클라이언트의공유기의간섭없이서버와의통신이가능하다. 하지만클라이언트에서접속하는데있어서열어둔포트가서버의방화벽에서막혀있지않아야한다.
▪연결과정
1. FTP 클라이언트에서-> FTP 서버IP xxx.xxx.xxx.xxx 포트21번에접속
2. FTP 서버의21포트-> 클라이언트1023(n) 이상의포트(서버에서클라이언트의Command 포트로응답). ※여기까지는Active 모드와동일함
3. 클라이언트ftp-data n+1 포트-> FTP서버의Passive 설정된범위의포트로접속요청(클라이언트에서접속), 클라이언트ftp-data포트(n+1) -> 서버ftp-data포트(passive port range)로접속요청, syn 요청
4. FTP서버의Passive 설정된범위의포트-> 클라이언트n+1 포트로수신응답. syn+ack
5. 클라이언트ftp-data n+1 포트-> 서버의Passive 설정된범위의포트로응답. ack
Connection 이루어지고, data 전송.
포트의범위는서버의서비스에간섭이없는범위내에서적당히설정한다. 여기서적당히는클라이언트의접속량에따라다르다. 또웹서비스의경우8080포트등으로운영이될수있고또IRC 나기타서비스의간섭이없는범위내에서포트를설정해야한다. 보통1000~2000 사이의범위를정해서포트를열어둔다.
3. 설정방법
* 아래설정방법에서시작끝은포트범위를나태낸다.
▪LINUX 서버
- wu-ftpd
/etc/ftpaccess
passive ports 0.0.0.0/0 시작끝
proftpd
/etc/proftpd/conf/proftpd.conf
PassivePorts 시작끝
- vsftpd
/etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=시작
pasv_max_port=끝
* 리눅스서버의Passive 모드설정할때는ip_conntrack 모듈이필요하다. 이모듈은열려있는포트가몇번포트에의해서연결이되었는지정보를담고있다.
그정보를담고있는부분은/proc/net/ip_contrack 에존재한다. 커널모듈을등록시켜줘야한다.
modprobe ip_conntrack
modprobe ip_conntrack_ftp
Iptable 설정
/etc/sysconfig/iptable-config 파일내의IPTABLES_MODULES 항목을추가하거나주석을제거한다.
IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"
iptables -A INPUT -p tcp --sport 1024:65535 --dport [포트시작]:[포트끝] -m state --state ESTABLISHED,RELATED -j ACCEPT
Windows 서버
1. 시작- 제어판- 관리도구- 인터넷정보서비스- 로컬컴퓨터- 속성- 메타베이스직접편집허용체크
2. C:\%SystemRoot%\system32\inetsrv\metabase.xml 열기
3. PassivePortRange="시작-끝" 으로수정
4. metabase.xml 저장
5. IIS 재시작
6. Ipsec, 또는방화벽에설정한포트번호추가
* Windows 2000 에서는HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msftpsvc\Parameters\ 에REG_SZ 값으로PassivePortRange 값을추가한다.