FTP 수동 모드에 포트 하나가 아닌 포트 범위가 필요한 이유는 무엇입니까?


34

들어오는 모든 데이터 채널 연결에 하나의 데이터 포트만 사용하는 대신 모든 FTP 서버가 수동 모드 데이터 채널에 포트 범위 를 사용해야 하는 이유 를 파악하기 위해 고심하고 있습니다 .

FTP 서버는 포트 21에서 동시에 연결된 많은 클라이언트를 처리합니다. 웹 서버는 포트 80에서 동시에 연결된 많은 클라이언트를 처리합니다.

그렇다면 FTP 서버가 들어오는 모든 수동 데이터 연결에 하나의 데이터 채널 포트만 사용할 수없는 이유는 무엇입니까 (포트 1024와 같이 해당 포트에서 동시에 연결된 많은 클라이언트를 계속 처리 할 수 ​​있습니까)?

아니면 할 수 있습니까?

이것이 불가능하거나 권장되지 않는 이유에 대한 기술적 세부 사항을 알고 싶습니다.


1
이것은 당신에게 관심이있을 수 있습니다 w3.org/Protocols/rfc959
매트 시몬스

1
고마워 매트. 그렇습니다. 대부분의 rfc 959를 읽었지만 실제로 궁금한 점에 대한 명확한 대답을 얻을 수 없었습니다. Karol Piczak의 답변은 내가 찾던 정보의 종류입니다.
커트

답변:


20

하나의 포트에만 데이터 포트를 잠글 때 여러 동시 FTP 세션 문제에 대한 명확하고 기술적 인 설명은 내가 가장 깊이 알고있는 것입니다. 작동 시간, 작동하지 않음, 권장되지 않는 이유 등

이것은 테스트하지 않았기 때문에 거친 추측 일 것입니다. 직접 시도해보고 놓친 다른 문제가 있는지 확인해야합니다.

수동 포트 범위를 하나의 단일 포트로 제한 할 수 있다고 가정 합니다 . 실제로이 질문 에서 작은 포트 범위가 실제로 사용됨을 알 수 있습니다 . 이론적으로 다중 동시 연결을 지원하려면 로컬 IP, 로컬 포트, 원격 IP, 원격 포트의 고유 한 4 가지 값만 필요합니다 . 이것은 서로 다른 연결을 식별하는 방법입니다.

서버의 포트를 하나의 단일 값으로 잠그면 클라이언트가 사용하는 포트만 남습니다. 클라이언트에 충분한 여유 임시 포트 풀이있는 한 문제가되지 않습니다 . 무거운 NAT를 사용하지 않는 한, 이것에 대해 걱정할 필요가 없습니다. 자, 이것이 순전히 이론적 인 것입니다 경고 : 서버에서 여러 포트를 사용하는 경우, 사용하도록 설정하여 가상의 동시 연결 수를 곱할 수 있습니다number of ports in range하나의 포트 당 클라이언트 측 연결. 그러나 실제로 지원되지 않는 FTP 클라이언트 구현이 의심 스럽기 때문에 실제로는 발생하지 않습니다. 또한 클라이언트가 이런 식으로 임시 포트를 공유해야하고 새 포트를 열 수 없다면 처리해야 할 훨씬 더 심각한 문제가 있습니다. 따라서 이러한 관점에서 단일 포트를 사용하여 완전히 안전해야합니다.

단일 포트로는 충분하지 않은 이유를 생각해 봅시다 .

우선, 정말 버그가 많은 FTP 서버 구현이 클라이언트 데이터 전송을 식별하는 방법으로 로컬 포트 ​​번호만을 사용하는 상황을 생각 해낼 수있었습니다. 다시 한번, 나는 괜찮은 FTP가 그렇게 할 것이라고 생각하지 않습니다.

실제 문제는 ( 그렇습니다. 위의 모든 것을 주요 위반으로 무시할 수 있습니다 ;-)) 수동 포트 범위는 권한이없는 범위에 있습니다.

즉, 선택한 포트 번호는 자체 예약되어 있지 않으며 실제로는 루트 권한이 필요없는 모든 사용자 프로세스가 FTP 서버보다 먼저이를 가져올 수 있습니다. 선택할 수있는 풍부한 포트 풀이있는 경우 임의의 무료 포트를 가져옵니다. 하나만 사용해야하는데 이미 사용중인 경우 전송을 제대로 처리 할 수 ​​없습니다.

대답이 너무 추론적인 것 같으면 죄송합니다. 솔직히 말해서, 나는 당신이 단일 포트를 사용해서는 안되는 이유를 찾기 위해 열심히 노력 했으며 마지막 비트를 제외하고는 그에 대한 확실한 증거를 생각할 수 없었습니다. 그럼에도 불구하고 흥미롭고 도전적인 질문입니다.


BTW, 누락 된 포인트와 불일치에 대해서는 언제든지 의견을 말하십시오. 나 자신도, 나는 간단한 대답으로 nitpicking하는 것처럼 느낍니다. 그렇습니다. ;-)
Karol J. Piczak

카롤 감사합니다! 이것은 내가 찾고있는 정보의 종류에 있습니다 (그리고 실제로 다른 곳에서는 찾지 못했습니다). 이 질문을 한 주된 이유는 Windows Azure에서 FTP 서버를 설정하고 수동 모드를 1 포트로만 잠그는 것이 안전한지 알고 싶기 때문입니다 (Azure는 끝점을 제한하기 때문에). 나는 그것을 시도하고 작동하며 귀하의 정보로도 안전하다고 생각합니다. 그러나 유일하게 남아있는 문제는 파일 전송 중 1 분 후에 Azure로드 밸런서가 제어 연결을 끊어 (유휴 상태이기 때문에) 연결을 유지하기 위해 TCP 터널에서 작업하고 있다는 것입니다.
커트

1
실제 이유는 데이터 채널 프로토콜에 식별 정보가 없기 때문이라고 생각합니다. 서버는 포트 번호를 기준으로 어떤 클라이언트에서 어떤 파일이 전송되는지 알 수 있습니다.
Monstieur

4

FTP는 제어 또는 명령 스트림 용과 데이터 파일 및 디렉토리 목록과 같은 기타 정보를 전달하기위한 두 개의 개별 연결에 의존합니다. 제어 스트림은 기존 TCP 연결을 통해 전달됩니다. 클라이언트는 권한이없는 높은 포트에 바인딩하고 포트 21에 바인딩 된 FTP 서버로 연결 요청을 보냅니다.이 연결은 명령을 전달하는 데 사용됩니다.

포트 또는 활성 모드에서 클라이언트는 수신 할 2 차 비 권한 포트를 서버에 알려줍니다. 그런 다음 서버는 포트 20에서 클라이언트가 지정한 권한이없는 포트로 데이터 연결을 시작합니다.

클라이언트가 웹 브라우저 인 경우 최신 메커니즘 인 수동 모드가 기본값입니다. 서버는 포트 20에 묶이지 않고 클라이언트에게 데이터 전송에 사용할 높은 포트를 알려줍니다. 그런 다음 클라이언트와 서버간에 권한이없는 포트를 통해 데이터가 전송됩니다.

자세한 내용은 다음을 참조하십시오.

http://tools.ietf.org/html/rfc959

편집하다

서버를 특정 단일 포트로 잠그는 것과 관련하여 일부 서버에서 가능할 수 있습니다. 예를 들어 vsftpd에는 다음 구성 옵션이 있습니다.

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

두 포트를 모두 동일하게 설정하면 (예 : pasv_max_port = 12345, pasv_min_port = 12345), 이후의 것을 얻을 수 있습니다. 이것이 서버가 지원하는 동시 FTP 세션 수를 제한한다고 생각합니다. 테스트하여 확인하십시오.


1
답장을 보내 주셔서 감사합니다. 그러나 내가 알고 싶은 것은 수동 모드에서 ftp 서버가 모든 클라이언트에게 데이터 포트 (예 : 포트 1024)에 동일한 포트를 사용하여 각 클라이언트에 임의의 포트를 제공하는 것과 반대로 지정된 포트 범위? FTP 서버 포트 범위 구성에서 단일 데이터 포트를 하나만 지정하는 것이 불가능하거나 권장되지 않는 기술적 이유는 무엇입니까? FTP 서버가 하나의 데이터 채널 포트에서만 많은 / 많은 동시 연결을 처리 할 수 ​​있다고 생각합니다.
커트

1
FTP는 악마이기 때문에 결국 죽어야합니다. : D

1
서버를 특정 단일 포트로 잠그는 것과 관련하여 편집 해 주셔서 감사합니다. 나는 실제로 그 방법에 대해 생각했지만 (그리고 이것이 달성하고자하는 것입니다), 내가 이해하지 못하는 것은 서버가 지원할 수있는 동시 FTP 세션의 수를 제한하는 이유입니다. 이 경우 서버가 여러 개의 동시 FTP 세션을 지원하지 못하게하는 것은 정확히 무엇입니까? 모든 FTP 서버는 포트 21에서 여러 개의 동시 연결을 지원하므로 포트 12345에서도 왜 그렇지 않습니까? 나는 이것을 더 깊이 시험해야 할 것이다.
Kurt

동시 연결 수를 제한하지 않을 수 있습니다. 서버가 여러 세션의 연결을 어떻게 추적하는지에 달려 있습니다. 기회를 줘!
dmourati

btw 하나의 포트에만 데이터 포트를 잠글 때 다중 동시 FTP 세션 문제와 관련하여 명확하고 기술적 인 설명이 내가 가장 깊이 알고있는 것이므로 응답을 허용 된 답변으로 표시하는 것을 기다려야합니다. 언제 작동, 언제 작동하지 않는지, 왜 권장되지 않는지 등
Kurt

1

FTP 서버 사용 된 포트 번호가 아닌 소스 IP만을 기반으로 클라이언트의 데이터 포트 연결을 제어 포트 연결에 일치시킬 있습니다.

이로 인해 클라이언트가 두 서버 (하나는 패시브 모드)에 연결 한 다음 수동 서버의 PORT 정보를 수신 한 후이를 활성 모드 서버에 PORT 명령으로 전달하여 FXP (나쁜 것은 아닐 수도 있음) 가 중단 됩니다. 모드 서버는 수동 모드 서버에 연결합니다.

나는 의심 클라이언트가 수동 모드를 요청할 때까지 많은 서버가 데이터 소켓을 생성하지 않습니다. 이 경우 두 클라이언트가 동시에 수동 모드를 요청한 경우 생성 된 소켓에는 고유 한 포트 번호가 필요합니다.

편집 : FTP 서버가 이것을하지 않는 또 다른 이유를 생각했습니다. 서버는 동일한 IP 주소를 가진 여러 사용자에게 말할 수 없었습니다.


감사. 내가 이해하지 못하는 것은 두 개 이상의 클라이언트가 동시에 수동 모드를 요청한 경우 해당 데이터 채널 소켓에 서버의 고유 포트가 필요한 이유는 무엇입니까? 내가 생각하기 때문에 두 개 이상의 클라이언트가 분명히 동시에 포트 21에 연결 될 수 있으므로 동시에 포트 1024 (데이터 채널 용)를 말하지 않는 이유는 무엇입니까? 나는 이것이 어리석은 질문이라고 생각하지만, 나의 면책은 이미 너무 오래 깨어 있었다는 것입니다 :)
Kurt

소켓 자체는 고유해야합니다. 포트에서 수신 대기하는 하나의 소켓을 작성하고 해당 소켓에서 원하는만큼의 연결을 수락하거나 다른 포트에서 사용자 당 하나의 소켓을 작성하고 각 소켓에서 하나의 연결을 승인 할 수 있습니다. 서버가 사용자 당 하나의 소켓을 작동하도록 설계했다면 본질적으로 다른 방법으로 변경하기 위해 모든 것을 다시 작성해야하며 결국 공유 호스트에 있거나 같은 IP 주소 뒤에있는 사람들은 데이터 연결을 구분할 방법이 없으므로 동시에 연결하십시오.
DerfK

감사. 나는 주제에 대해받은 모든 답변에 감사하며 지금은 그것에 대해 잘 다루기 시작하고 있다고 생각합니다.
커트

0

포트 21 또는 80 (잘 알려진 모든 포트에서와 같이)에는 클라이언트가 무엇을 원하는지 알려주는 프로토콜이 있습니다. 이렇게하면 서버가 무엇을 연결하고 있는지 알 수 있습니다. 데이터 연결 포트에는 프로토콜이 없습니다. 서버가 알고있는 모든 것 (연결에 고유 한 것)은 연결하는 포트 번호입니다.

매번 같은 포트에 연결하면 서버가 어떤 파일을 연결하고 있는지 알 수 없습니다. 포트 번호는 제어 연결의 전송 요청과 데이터 연결 간의 링크 역할을합니다.

두 클라이언트가 동시에 전송을 요청한 경우 서버가 단일 포트에서 연결을 허용하면 서버는 전송할 파일을 말할 수 없습니다. 물론 서버는 결정을 위해 클라이언트 IP를 사용할 수 있습니다 (실제로 많은 FTP 서버는 클라이언트 IP가 보안을 위해 제어 연결에 사용 된 IP와 일치하는지 확인합니다).

그러나 이것은 작동하지 않습니다.

  • 동일한 시스템에서 여러 연결 (대부분의 FTP 클라이언트는 병렬 전송 / 큐를 지원합니다).
  • 동일한 외부 IP를 가지므로 동일한 (기업) 네트워크 내의 다른 컴퓨터에서 연결

FTP 데이터 연결 재사용 도 참조하십시오 .


-1

여기에 언급 된 내용을 보지 못했기 때문에 던질 것입니다. 포트 범위 할당은 일종의 보안 기능으로, 데이터 트래픽에 대해 하나의 포트를 모니터링 할 수 없었으며, 데이터는 임의의 포트로 전송되었습니다. 쉽게 결정될 수없는 범위. 모호함을 통한 보안.


1
이 주장에 대한 언급이 있습니까?
Martin Prikryl

-2

제어 포트와 데이터 포트에 대해 이미 알고있는 것처럼 들리므로 바로 추적하겠습니다. 제어 포트는 웹 사이트의 포트 80과 마찬가지로 본질적으로 버스트 통신입니다. 그들은 여러 가지 다른 요청을 처리 할 수 ​​있습니다 (동시에는 아니지만 완료하기가 너무 빠르기 때문에 닫힙니다). 반면에 데이터 포트는 FTP로 마술이 일어나는 곳입니다. 단일 데이터 포트로 자신을 제한하면 한 번에 하나의 데이터 전송 만 발생합니다. 큰 파일 전송을 고려하십시오. 단일 데이터 포트가 열려 있으면 전송이 완료 될 때까지 다른 데이터를 이동할 수 없습니다. 즉, 전송하는 동안 두 번째 사용자는 ftp 폴더의 디렉토리 내용을 나열 할 수도 없습니다. 물론 성공적으로 로그인 할 수 있지만 데이터 포트가 전혀 열려 있지 않은 것처럼 동작이 동일합니다. 이것으로 괜찮다면 단일 포트가 당신을 위해 잘 작동합니다. 일부 ftp 클라이언트 (기본적으로 1 개만 생각할 수 있음)는 기본적으로 단일 세션 내에서 다운로드를 위해 여러 연결을 설정합니다. 따라서이 클라이언트의 경우 단일 포트 시나리오에서 1 개의 큰 파일과 4 개의 작은 파일의 일괄 전송을 고려하십시오.

클라이언트는 첫 번째 큰 파일의 전송을 시작합니다. 그런 다음 전송이 진행되는 동안 두 번째 파일이 시작됩니다. 주사위가 없습니다. 그런 다음 세 번째는 기술 용어입니다. 결국, 로그에는 1 번의 성공과 4 번의 실패한 전송이 표시되어야합니다. 해결 방법은 클라이언트를 세션 당 단일 연결로 제한하는 것입니다. 다른 사람이 전송이 완료되고 다른 전송이 아직 시작되지 않은 것으로 가정하면 다른 사람이 문에 발을 들지 않았다고 가정합니다. )


2
뭐? 이것은 완전히 틀립니다. TCP 소켓은 4 개의 튜플 (소스 IP, 소스 포트, 대상 포트, 대상 IP)로 정의됩니다. 동일한 대상 포트 : IP 매핑에서 많은 TCP 소켓을 동시에 만들고 제공 할 수 있습니다. FTP 서버 프로세스는 동시에 두 개의 네트워크 클라이언트로부터 데이터를 제공 할 수 있습니다.
EEAA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.