FTP 수동 모드에 포트 하나가 아닌 포트 범위가 필요한 이유는 무엇입니까? 들어오는 모든 데이터 채널 연결에 하나의

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

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

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

아니면 할 수 있습니까?

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



답변

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

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

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

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

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

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

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

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

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


답변

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 세션 수를 제한한다고 생각합니다. 테스트하여 확인하십시오.


답변

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

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

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

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


답변

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

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

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

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

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

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


답변

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


답변

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

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


답변