Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 604. Azure - 윈도우 VM에서 FTP 여는 방법 [링크 복사], [링크+제목 복사],
조회: 15648
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 4개 있습니다.)
개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한
; https://www.sysnet.pe.kr/2/0/12322

개발 환경 구성: 575. Azure VM에 (ICMP) ping을 허용하는 방법
; https://www.sysnet.pe.kr/2/0/12703

개발 환경 구성: 576. Azure VM의 서비스를 Azure Web App Service에서만 접근하도록 NSG 설정을 제한하는 방법
; https://www.sysnet.pe.kr/2/0/12704

개발 환경 구성: 604. Azure - 윈도우 VM에서 FTP 여는 방법
; https://www.sysnet.pe.kr/2/0/12854




Azure - 윈도우 VM에서 FTP 여는 방법

당연히, 서버 관리자를 통해 FTP 서비스를 설치했어야 하고, 이후 작업은 포트를 열어야 합니다. 사실상 서비스 설치보다는 포트를 여는 작업이 주가 됩니다. ^^;

전체적인 가이드는 다음의 2개 글에서 잘 설명하고 있습니다.

Installing a secure FTP server on Windows using IIS
; https://winscp.net/eng/docs/guide_windows_ftps_server

Installing secure FTP server on Microsoft Azure using IIS
; https://winscp.net/eng/docs/guide_azure_ftps_server

근래의 환경에서 Active 모드로 FTP 접근을 할 수 있는 곳은 내부망을 제외하고는 없을 것이므로 클라우드에 위치한 Azure VM의 경우 대부분 Passive 모드를 기대하고 설정을 해야 합니다.

따라서, VM과 Azure 측의 VM 네트워크 설정에서 Control과 Data 포트에 해당하는 것을 모두 열어줘야 합니다.

일단 VM 측에서 해야 할 설정을 먼저 볼까요? ^^ 테스트의 편리함을 위해 윈도우 VM의 방화벽은 off 시킨 걸로 하겠습니다. 하지만 FTP 서버에서 FTP Data port로 사용할 범위를 지정해야 하는데요, IIS 관리자에서 다음과 같이 컴퓨터 레벨에서의 "FTP Firewall Support" 설정으로 들어가 "Data Channel Port Range"를 설정하면 됩니다.

azure_vm_ftp_server_1.png

위의 경우, FTP 서버가 Passive 모드를 위한 포트 범위로 49000~49100 사이의 번호를 사용하겠다는 것을 알립니다. 이와 함께, "External IP Address of Firewall" 란에는 해당 VM의 공용 IP를 적어야 합니다. 이 IP 주솟값은 Azure Portal에서 VM 설정의 "Networking" / "Public IP address" 항목을 통해 알 수 있습니다.

자, 그럼 이제 VM 측의 설정은 끝났고, Azure Portal에서의 VM 네트워킹 설정이 남았습니다. 당연히 여기서도 Control/Data 포트를 개방해야 하는데요, "Settings" / "Networking"으로 들어가 "Add Inbound port rule" 버튼을 이용해 다음의 2개 항목을 새롭게 추가합니다.

Destination: Any
Service: FTP 

Service: Custom
Destination port ranges: 49000-49100

끝입니다, 이제 외부에서 Passive 모드로 FTP 연결을 하면 정상적으로 연결이 될 것입니다.




일단, 이론상 저렇게 해서 해결이 되어야 하는데... 경우에 따라 오류가 발생할 수 있습니다.

Status: Connecting to 100.10.5.1:21...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Logged in
Status: Retrieving directory listing...
Command:    PWD
Response:   257 "/" is current directory.
Command:    TYPE I
Response:   200 Type set to I.
Command:    PASV
Response:   227 Entering Passive Mode (100,10,5,1,199,125).
Command:    LIST
Response:   150 Opening BINARY mode data connection.
Error:  Connection timed out after 20 seconds of inactivity
Error:  Failed to retrieve directory listing
Status: Disconnected from server

위의 내용을 보면 분명히 Control 포트(21)를 이용한 FTP 서버로의 연결은 정상적으로 되었습니다. 하지만, Passive 모드 정보를 구하는 PASV에 이어 "LIST" 명령을 Control 연결로 보낸 후 응답을 받지 못하고 있는 것입니다. 그리고 그 응답은 "Connection timed out"으로 보아 Data Port로의 연결을 할 수 없었던 것입니다.

아니... 모든 설정이 완벽했는데 왜 passive 모드의 데이터 포트 연결이 안 되었을까요? 원인 분석을 위해 우선 PASV의 응답을 살펴보겠습니다.

Command:    PASV
Response:   227 Entering Passive Mode (100,10,5,1,199,125).

PASV 명령에 대해 FTP 서버는 100,10,5,1,199,125를 내려주고 있는데, 이것의 의미는 앞의 4자리가 IIS FTP에서 설정했던 "External IP Address of Firewall" 값에 해당하는 "100.10.5.1"로 서버의 공용 IP에 해당하고 뒤의 2자리는 포트 번호입니다. 포트 번호의 해석은 다음과 같이 첫 번째 숫자에 대해 256을 곱하고 두 번째 숫자를 더하면 됩니다.

199 * 256 + 125 = 51,069

이상하군요, 우리는 분명 IIS FTP의 "Data Channel Port Range"에 "49000~49100"을 설정해 두었는데 그것을 무시하고 서버는 51069 포트 번호를 내려주고 있는 것입니다. 당연히 이 번호는 Azure VM의 네트워크 설정에서 열어주지 않은 포트라서 클라이언트가 접속할 수 없습니다.

이후, 몇 번의 FTP 연결 로그에서도 5만 번대의 포트 번호가 내려왔고 테스트를 위해 Azure 네트워크 설정의 "Add Inbound port rule"에서 "50000-60000"으로 지정해 열었더니 FTP 연결이 정상적으로 되었습니다. ^^;

아마도 FTP 서버는 dynamic port 범위 내에서,

PS C:\windows\system32>  netsh int ipv4 show dynamicport tcp

Protocol tcp Dynamic Port Range
---------------------------------
Start Port      : 49152
Number of Ports : 16384

데이터 포트를 결정해 내려주는 것 같았습니다. 오호... 그렇다면 혹시 FTP 서버가 "Data Channel Port Range" 설정을 아직 반영하지 못한 것이 아닐까요? 그래서 아예 VM을 재부팅하고 다시 테스트했더니,

Command:    PASV
Response:   227 Entering Passive Mode (100,10,5,1,191,104)

191 * 256 + 104 = 49,000이니까, 정상적으로 49000부터 시작하는 포트를 내려주었습니다. ^^;




만약 FTP 클라이언트 측에서 다음과 같은 오류가 발생한다면?

C:\temp> ftp
ftp> open localhost
> ftp: connect :Connection refused

아마도 VM에 FTP 서비스만 설치하고 IIS 관리자에서 "Add FTP Site..."를 이용해 실제 FTP 사이트를 등록하지 않은 상태일 것입니다. FTP 사이트를 설치하면 다음과 같은 식으로 진행하는 것을 확인할 수 있습니다.

ftp> open localhost
Connected to testvm.
220 Microsoft FTP Service
200 OPTS UTF8 command successful - UTF8 encoding now ON.
User (testvm:(none)):




만약 user 로그인 시 다음과 같은 오류가 발생한다면?

User (testvm:(none)): testusr
534 Policy requires SSL.
Login failed.

윈도우의 기본 ftp.exe 클라이언트는 FTP over SSL을 지원하지 않으므로 저런 경우 접속할 수 없습니다. 만약 서버 관리자이면서 보안이 중요하지 않다면 IIS의 "FTP SSL Settings"를 통해 "Require SSL connections"로 지정된 기본값을 "Allow SSL connection"으로 낮출 수는 있습니다.

혹은, 기본 ftp.exe 이외에 FTP over SSL을 지원하는 FileZilla같은 별도의 FTP 클라이언트를 이용하면 됩니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/14/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  [123]  124  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10848정성태9/8/201527464VS.NET IDE: 103. Visual Studio의 Ctrl + F5 실행 동작파일 다운로드1
10847정성태9/8/201523504VS.NET IDE: 102. 목록(List) 타입의 값을 디버깅 중 Watch 창에서 확인하는 방법 [1]파일 다운로드1
10846정성태9/8/201520884오류 유형: 306. "query user" 명령어에 공백 문자가 포함된 계정을 전달하는 경우
10845정성태9/3/201521990오류 유형: 305. 윈도우 백업 시 오류 - 0x80780166
10844정성태9/2/201523183.NET Framework: 528. C# - 상호 참조하는 경우의 정적 생성자 동작 방식 [4]파일 다운로드1
10843정성태9/1/201523956VS.NET IDE: 101. Visual Studio 2015의 솔루션 탐색기가 클래스 뷰 정보로 인해 느려지는 현상
10842정성태9/1/201520937.NET Framework: 527. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 - 세 번째 이야기
10841정성태8/31/201530276개발 환경 구성: 276. Visual Studio 2013에서 C# 6과 닷넷 4.6 기능을 사용하려면?
10839정성태8/22/201528821Windows: 112. 윈도우 10에서 터치 키보드를 안 뜨게 할 수 있는 방법 [4]
10838정성태8/22/201539112오류 유형: 304. Windows 10에서 VPN 연결이 실패한다면? [3]
10837정성태8/21/201519401오류 유형: 303. Your computer is low on memory. Save your files and close these programs...
10836정성태8/21/201520373오류 유형: 302. 설치 파일 실행 시 "This app can't run on your PC" 오류가 뜬다면?
10835정성태8/21/201528849웹: 31. Microsoft Edge 브라우저를 명령행에서 띄우는 방법 [1]
10834정성태8/19/201520988.NET Framework: 526. 닷넷 - 값 형식을 new 없이 생성하면 0으로 초기화되지 않는다?
10833정성태8/18/201525634.NET Framework: 525. C# - 닷넷에서 프로세스가 열고 있는 파일 목록을 구하는 방법파일 다운로드1
10832정성태8/17/201530013디버깅 기술: 74. x64 콜 스택 인자 추적과 windbg의 Child-SP, RetAddr, Args to Child 값 확인 [8]파일 다운로드2
10831정성태8/13/201529980.NET Framework: 524. .NET 4.0과 .NET 4.5의 컴파일 결과 차이점 [1]파일 다운로드1
10830정성태8/12/201524027개발 환경 구성: 275. Web.config이 적용되지 않는 프로젝트에서 Razor 템플릿 파일의 C# 컴파일러 버전 제어 [1]
10829정성태8/10/201526133개발 환경 구성: 274. PowerShell/명령행에서 JDK/JRE를 무인(unattended)/자동 설치를 하는 방법 [3]
10828정성태8/10/201531711웹: 30. Edge 브라우저에서 "이 웹 사이트에는 Internet Explorer가 필요함" 단계를 없애는 방법 [1]
10827정성태7/8/201533042개발 환경 구성: 273. Visual Studio 2015에서 Github와 연동하는 방법 [3]
10826정성태7/8/201522673오류 유형: 301. The trust relationship between this workstation and the primary domain failed. - 두 번째 이야기
10825정성태7/8/201522255개발 환경 구성: 272. Visual Studio IDE 설치 없이 Visual Studio SDK 설치하는 방법
10824정성태7/7/201527442개발 환경 구성: 271. Team Foundation Server 2015 설치 방법 [1]
10823정성태7/7/201527941오류 유형: 300. SqlException (0x80131904): Unable to open the physical file
10822정성태7/7/201527287오류 유형: 299. The 'Visual C++ Project System Package' package did not load correctly.
... 121  122  [123]  124  125  126  127  128  129  130  131  132  133  134  135  ...