수동 서버 모드(PASV 명령 사용)를 지원하는 FTP 서버가 있습니다. 이것은 Windows XP에서 잘 작동합니다. 방화벽이 활성화된 Windows Vista 또는 Windows 7에서 이 서버에 액세스하려고 하면 연결이 즉시 종료됩니다. 재설정 패킷이 서버로 전송되고 서버가 연결을 재설정했다는 신호가 소켓에 전달됩니다(사실이 아님).
방화벽을 비활성화하면 문제가 사라집니다.
다른 FTP 서버에 대한 연결이 올바르게 작동합니다. 차이점은 PASV에 대한 서버의 응답이 주소 필드를 괄호로 묶지 않는다는 것입니다. 이는 RFC-959 및 RFC-1132에 문서화된 대로 합법적입니다.
이러한 나쁜 동작을 중지하려면 방화벽을 어떻게 구성해야 합니까?
답변1
나는 괄호가 비난받을 것이라고 생각하지 않습니다.
오히려 해당 서버가 할당한 동적 포트 범위가 Vista/7과 일치하지 않는다고 생각합니다.
주제에 대한 토론은 다음 문서를 참조하세요.
Windows Vista 및 Windows Server 2008에서는 TCP/IP의 기본 동적 포트 범위가 변경되었습니다.
컴퓨터에서 ipv4에 대한 동적 포트 범위를 보려면 다음 명령을 사용하십시오.
netsh int ipv4 show dynamicport tcp
TCP의 동적 포트 범위를 설정하려면 다음 예를 사용하십시오.
netsh int ipv4 set dynamicport tcp start=1024 num=30000
위 문서에 더 많은 명령이 설명되어 있습니다.
편집: Windows 방화벽은 PASV 응답에 지정된 동적 포트를 열 만큼 충분히 지능적일 수 있습니다. 이 포트가 동적 포트의 기본 범위에 속하지 않더라도 마찬가지입니다. 그러나 괄호 없이 응답을 이해할 만큼 지능이 아직 부족할 수도 있습니다. 동적 포트의 기본 범위를 확장할 수 있는 가능성을 살펴보는 것이 좋습니다.
답변2
이는 Windows 7에서 실행되는 Java 및 FTP에서 발생한 문제를 생각나게 합니다.
이는 결국 FTP, 패시브 모드 및 IPv6 연결이 포함된 Microsoft 방화벽의 버그였습니다(주소는 IPv6 주소일 필요는 없으며 연결을 만든 소프트웨어만 IPv6 스택을 사용하여 그렇게 합니다).
귀하의 질문에 설명된 증상은 이 문제와 매우 유사하므로 여기에 링크하고 요약하겠습니다(이 질문은 Java와 관련이 없더라도 수정 사항은 동일할 수 있음).
거기에 언급된 몇 가지 솔루션 요약:
- 마이크로소프트 핫픽스:http://support.microsoft.com/kb/2754804
- Vista/7에서 실행되는 FTP 클라이언트를 IPv4 스택으로 실행해 보십시오(가능할 수도 있고 그렇지 않을 수도 있음).
- 다음을 사용하여 Windows 방화벽의 상태 저장 FTP를 비활성화합니다.
netsh advfirewall set global StatefulFTP disable
그러나 이렇게 하면 방화벽을 통과하는 비수동 모드 FTP 연결이 비활성화됩니다.
답변3
단지 버그가 있기 때문에 방화벽을 구성할 수 없습니다.
현장의 오래된 장치에 내장되어 있기 때문에 괄호 안의 포트 정보를 보내도록 FTP 서버를 변경할 수 없는 한, 다음과 같은 동작을 하는 특수 클라이언트가 필요합니다.
이 클라이언트는 방화벽을 정상적인 상태로 유지하기 위해 TYPE I
각 명령 직전에 명령을 보내야 합니다. PASV
바이너리가 아닌 전송이 필요한 경우 TYPE 명령의 매개변수를 변경할 수 있습니다.