서 버
서버 관련하여 유익한 정보나 강좌를 게시할수 있는 공간입니다.
글 수 493
ftp문제로 고생하다가 어느 블로그에서 찼은 것을 메모장에 저장시켜보다가 이렇게 올립니다.
원본링크가 기억이 안나네요.
두 모드의 차이점이 가장 잘된 글이였습니다.
한 두 줄정도 첨언 했습니다.
제 문제는 기본적으로 방화벽에서 서버쪽 20/21밖에 열려있지 않았는데, 클라이언트(리눅스)가 자꾸 passive모드로 접속되어 20 외 다른 포트로 데이터를 받으려고 시도한다는 것이 었습니다. 방화벽에 걸려서 먹통.... ㅡㅜ
아.... 그리고 가장 쉬운 해결방법은 클라이언트의 ftp명령어중(접속후...)
passive라는 명령어로 passive/active를 토글할 수 있습니다.
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보다 큰 비사용중인 포트를 말합니다.
다음으로 ls명령어로 리스트를 보거나, 파일을 전송받는 경우, 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 전송이 가능합니다.
active connection의 경우 별다른 설정이 없습니다. 기본적으로 active connection을 사용하게 되어 있지만 방화벽이나 클라이언트의 상태에 따라 passive모드를 사용하게 됩니다.
passive로 사용을 위해서는 서버쪽에서 사용포트를 설정해 주는 것이 좋습니다. 그래야 방화벽등의 네트워크 단에서 컨트롤하기가 쉽겠죠.
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" 를 설정하시기 바랍니다.
출처 : http://kr.blog.yahoo.com/argonat/47.html
원본링크가 기억이 안나네요.
두 모드의 차이점이 가장 잘된 글이였습니다.
한 두 줄정도 첨언 했습니다.
제 문제는 기본적으로 방화벽에서 서버쪽 20/21밖에 열려있지 않았는데, 클라이언트(리눅스)가 자꾸 passive모드로 접속되어 20 외 다른 포트로 데이터를 받으려고 시도한다는 것이 었습니다. 방화벽에 걸려서 먹통.... ㅡㅜ
아.... 그리고 가장 쉬운 해결방법은 클라이언트의 ftp명령어중(접속후...)
passive라는 명령어로 passive/active를 토글할 수 있습니다.
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보다 큰 비사용중인 포트를 말합니다.
다음으로 ls명령어로 리스트를 보거나, 파일을 전송받는 경우, 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 전송이 가능합니다.
active connection의 경우 별다른 설정이 없습니다. 기본적으로 active connection을 사용하게 되어 있지만 방화벽이나 클라이언트의 상태에 따라 passive모드를 사용하게 됩니다.
passive로 사용을 위해서는 서버쪽에서 사용포트를 설정해 주는 것이 좋습니다. 그래야 방화벽등의 네트워크 단에서 컨트롤하기가 쉽겠죠.
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" 를 설정하시기 바랍니다.
출처 : http://kr.blog.yahoo.com/argonat/47.html

알찬돌삐
① 클라이언트에서 서버의 21번 포트로 접속 후 클라이언트가 사용할 두 번째 포트를 서버에 알려줍니다.
② 서버는 이에 대해 ack로 응답하고
③ 서버의 20번 포트는 클라이언트가 알려준 두 번째 포트로 접속을 시도합니다.
④ 마지막으로 클라이언트가 ack로 응답합니다. Active 모드의 문제점은 바로 3번째 단계 즉, 일반적인 TCP/IP의 특징인 ‘클라이언트가 서버에 접속을 시도하는 것’이 아니라 ‘서버가 클라이언에 접속을 시도한다’는 것입니다. 이 때문에 만약 클라이언트 PC등에 방화벽이 설치되어 있거나 FTP를 잘 이해하지 못하는 공유기 등을 사용하여 외부에서의 접속을 허용하지 않는다면 세 번째 프로세스가 작동하지 않게 되어 FTP 접속이 제대로 되지 않는 문제점이 있습니다. 이러한 경우 FTP 접속은 되지만 이후 데이터 목록을 받아오지 못하여 에러가 발생하게 됩니다.
즉, active 모드는 클라이언트에서 서버측 21번 포트로 접속시도 하고 데이터 포트는 서버에서 클라이언트로 접속 하여 데이터를 보내는 방식입니다.
Passive 모드
서버가 클라이언트에 접속시도를 하는 비정상적인 active 모드와 관련된 문제를 해결하기 위한 대안으로 passive 모드가 디자인되었습니다.
Passive 모드에서는
① 먼저 클라이언트가 command 포트로 접속을 시도하면
② 서버에서는 서버가 사용할 두 번째 포트를 알려줍니다.
③ 클라이언트는 다른 포트를 열어 서버가 알려준 이 포트로 접속을 시도하고,
④ 서버는 ack로 응답합니다. Passive 모드에서는 두 번째 data포트로서 active 모드가 사용했던 20번을 사용하지 않고 대신 1024 이후의 임의의 비 특권 포트를 사용하게 됩니다. 따라서 passive 모드는 서버에서 클라이언트로 연결을 시도하는 active 모드의 문제점을 해결하기는 했지만, 서버의 비 특권포트(1024 ~ 65535)를 방화벽에서 모두 열어 두어야 한다는 또 다른 문제점을 낳았습니다.
그러나 wu-ftp나 proftpd등 대부분의 ftp 데몬에서는 클라이언트가 passive 모드로 접속 시 사용할 수 있는 포트를 제한설정 할 수 있는 기능을 지원하므로 이의 문제점을 미봉책이나마 어느 정도는 해결할 수 있습니다.
위와 같이 passive 모드는 클라이언트에서 서버쪽 21번 포트로 접속 시도 하고 데이터 포트도 클라이언트에서 서버의 20번 포트로 접속하여 데이터를 받아오는 방식입니다.