본문 바로가기
리눅스

리눅스 proftpd , 윈도우 클라이언트 ( 패시브 / 액티브 모드 )

by 혜룐 2015. 11. 10.
ftp 방식에 따라 서버쪽과 클라이언트 간의 통신이 제대로 될 수 있도록 ACL 작업이 필요하다.
ACL 작업 없이 사용하려고 passive / active 설정을 바꾸어 가면서 test 해보지만.
중요한건! 21과 20 포트에 대해서acl 확인을 먼저 하도록
한다.
단, 아래 내용은 서버와 클라이언트간 acl이 없었고. (다시 네트웍 확인해보니 20막혀 있었음)
vsftp ->proftp 데몬 바꾸면서 pass / active 모드 test
한 것이다.
1) 클라이언트는 윈도우 ftp 서버는 리눅스 (vsftpd)
vsftpd 말고 proftp로 다시 올려본다.. 아래 로그는 vsftpd로 filezila에서 확인했다.
상태: 192.168.185.31:21에 연결 중...
상태: 연결 완료. 환영 메시지를 기다리는 중...
응답: 220 
명령: USER cether
응답: 331 Please specify the password.
명령: PASS **********
응답: 230 Login successful.
명령: SYST
응답: 215 UNIX Type: L8
명령: FEAT
응답: 211-Features:
응답: EPRT
응답: MDTM
응답: REST STREAM
응답: SIZE
응답: TVFS
응답: 211 End
상태: 연결됨
상태: 디렉터리 목록 갱신 중...
명령: PWD
응답: 257 "/data/media/cer"
명령: TYPE I
응답: 200 Switching to Binary mode.
명령: PASV
응답: 550 Permission denied.
명령: PORT 192,168,140,141,118,76
응답: 200 PORT command successful. Consider using PASV.
명령: LIST
응답: 150 Here comes the directory listing.
응답: 426 Failure writing network stream.
오류: 디렉터리 목록 갱신 실패 ->다시 네트웍 확인 후
데이터통신하는 20번 포트가 막혀있었다
.
응답: 421 Timeout.
오류: 서버에 의해 연결 닫힘
통신방식때문에 패시브모드와 액티브 모드에 대해서 설명을 하고자 한다.
FTP 접속방식 에는 Port Mode(Active Mode)와 Passive Mode 두 가지가 있다.
첫번째가 control connection으로서 FTP client software에 의해 초기화(접속시도)됩니다. 이것은 client:X 에서 server:ftp (port 21)로 접속이 이루어지며 command 전송시 사용되어 집니다. 
두번째는
data connection으로서 이것은 active mode와 passive mode로 나누어지며
data(실제 전송될 파일) 전송시 사용되어 집니다. 이때 일반적인 FTP server는 active mode로 data를 전송합니다

클라이언트:X ->서버:ftp 형식이다.
Active Mode
처음 client 가 server 로 21 번 포트로 접속을 맺게 되는데 이 session 을 Command Session 이라고 하며
이 Command Session 을 통해 사용자는 server 에게 사용자 ID 와 Password 를 전달해서 인증을 받는다.
인증을 거친 client 는 pwd, dir, get, put 등의 원하는 작업에 해당하는 명령어를 전달한다.
FTP 를 통해 실제 파일을 주고 받을 때는 새로운 session 이 하나 더 연결되는데 이를 Data Session 이라고 한다.
Data Session 은 server 에서 자신의 출발지 포트를 20 번으로 하고 client 로 1024 이상의 포트로 접속을 맺는다.
이 Data Session 을 통해 client 는 server 로부터 파일을 다운로드 및 업로드를 하게된다.
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 형태로 연결됩니다. 
Passive Mode
Active Mode가 client 에서 server 로, server 에서 client 로의 접속인 반면
Passive Mode 는
client 가 server 로 Command Session 과 Data Session 을 모두 연결하는 방식이다
.
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 의 형태로 연결됩니다
vsftpd 말고 proftpd로 test 하고자 proftpd 사용법을 설명한다.
소스파일은 http://www.proftpd.org/download.html 여기서..
[root@he01:01:38 /ss]$ ll
?⑷퀎 4840
drwxr-xr-x 10 root root 4096 7??15 10:53 proftpd
drwxr-xr-x 14 1000 1000 4096 7??15 10:53 proftpd-1.3.3a
-rw-r--r-- 1 cyer cytor 4874683 7??15 10:43 proftpd-1.3.3a.tar.gz
drwxr-xr-x 2 root root 4096 7??15 10:41 src
drwxrwxrwx 2 root root 4096 7?? 5 11:37 tmp
소스컴파일 후 ..
./configure --prefix=/ss/proftpd \
--enable-autoshadow \
--enable-shadow \
make&&make install
아래와 같은 부분을 찾아 바꿔준다.
User nobody
Group nogroup
User nobody
Group nobody
nogroup라는 그룹은 없기 때문에 안바꿔주면 대몬을 실행할 수 없다.
conf 파일 안에는 DefaultRoot라는 항목의 주석을 제거하면 자신이 위치한 홈 디렉토리에서 벗어나지 못한다. FTP가 SFTP보다 좀 더 나아보이는 점이라고 볼 수 있겠다. SFTP는 자신의 홈디렉토리에서 벗어나는걸 막어 보려면 아주 삽질을 많이 해야 한다.
이러면 기본 설치 및 설정이 끝난 상태이고, 보다 싶게 서비스를 start / stop 하기 위하여 별도 스크립트를 init.d에 등록해야겠다. 풀었던 소스 디렉토리 밑에 contrib/dist/rpm/proftpd.init.d 파일을 /etc/rc.d/init.d/ 밑으로 복사한다.
그리고 vi로 열고 다음과 같이 PATH 수정하고 권한을 755로 한다.
PATH="$PATH:/usr/local/proftpd/sbin"
chmod 755 /etc/rc.d/init.d/proftpd
/etc/rc.d/init.d/proftpd start
OK라고 나오면 완료! 프로세스랑 포트 확인 한다. 
nobody 487 0.0 0.0 6532 1392 ? Ss 12:59 0:00 proftpd: (accepting connections)
[root@helpdesk-mnt1 12:59:50 /ss/proftpd/sbin]$ netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 32716/xinetd 
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 10501/mysqld 
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1214/httpd 
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 487/proftpd: (accep 
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2089/sshd 
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 10224/0 
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 4925 2043/syslog-ng /var/lib/syslog-ng/syslog-ng.ctl
unix 2 [ ACC ] STREAM LISTENING 2873238 19032/3 /tmp/ssh-hGLaU19032/agent.19032
unix 2 [ ACC ] STREAM LISTENING 4995 2071/dbus-daemon /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 2389844 4716/httpd /ss/apache/logs/cgisock.1214
unix 2 [ ACC ] STREAM LISTENING 4921 2043/syslog-ng /dev/log
unix 2 [ ACC ] STREAM LISTENING 2716471 10501/mysqld /tmp/mysql.socka
* 윈도우 클라이언트에서 proftpd로 다시 접속했다.
D:\se>ftp 192.168.185.31
Connected to 192.168.185.31.
220 ProFTPD 1.3.3a Server (ProFTPD Default Installation) [192.168.185.31]
User (192.168.185.31:(none)): cyher 
331 Password required for cyher 
Password:
230 User cyher logged in
ftp>ha
Hash mark printing On ftp: (2048 bytes/hash mark) .
ftp>bi
200 Type set to I
ftp>dir
200 PORT command successful
425 Unable to build data connection: No route to host -->ftp 서버쪽에 데이터 통신을 하는 포트가 막혀있음
* 상황결론..
처음에는 vsftp로 ftp 를 올렸다. 데이터통신하는 부분이 안되어 ACL 확인 결과 아무 문제가 없었다.
그래서 proftpd 로 다시 ftp를 올렸는데 역시나 마찬가지..
다시 네트웍단 확인 해보니 데이터통신하는 20번 포트가 막혀있었다..
이런 문제였던것을.. ;;
( 윈도우에서 패시브 : quote pasv )