Microsoft MVP성태의 닷넷 이야기
개발 환경 구성: 604. Azure - 윈도우 VM에서 FTP 여는 방법 [링크 복사], [링크+제목 복사],
조회: 8101
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

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

비밀번호

댓글 작성자
 




... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12325정성태9/12/20209543개발 환경 구성: 515. OpenVPN - 재부팅 후 ICS(Internet Connection Sharing) 기능이 동작 안하는 문제
12324정성태9/11/202010827개발 환경 구성: 514. smigdeploy.exe를 이용한 Windows Server 2016에서 2019로 마이그레이션 방법
12323정성태9/11/20209751오류 유형: 649. Copy Database Wizard - The job failed. Check the event log on the destination server for details.
12322정성태9/11/202010947개발 환경 구성: 513. Azure VM의 RDP 접속 위치 제한 [1]
12321정성태9/11/20208996오류 유형: 648. netsh http add urlacl - Error: 183 Cannot create a file when that file already exists.
12320정성태9/11/202010165개발 환경 구성: 512. RDP(원격 데스크톱) 접속 시 비밀 번호를 한 번 더 입력해야 하는 경우
12319정성태9/10/20209962오류 유형: 647. smigdeploy.exe를 Windows Server 2016에서 실행할 때 .NET Framework 미설치 오류 발생
12318정성태9/9/20209386오류 유형: 646. OpenVPN - "TAP-Windows Adapter V9" 어댑터의 "Network cable unplugged" 현상
12317정성태9/9/202011746개발 환경 구성: 511. Beats용 Kibana 기본 대시 보드 구성 방법
12316정성태9/8/202010133디버깅 기술: 170. WinDbg Preview 버전부터 닷넷 코어 3.0 이후의 메모리 덤프에 대해 sos.dll 자동 로드
12315정성태9/7/202012460개발 환경 구성: 510. Logstash - FileBeat을 이용한 IIS 로그 처리 [2]
12314정성태9/7/202011117오류 유형: 645. IIS HTTPERR - Timer_MinBytesPerSecond, Timer_ConnectionIdle 로그
12313정성태9/6/202012187개발 환경 구성: 509. Logstash - 사용자 정의 grok 패턴 추가를 이용한 IIS 로그 처리
12312정성태9/5/202016055개발 환경 구성: 508. Logstash 기본 사용법 [2]
12311정성태9/4/202011315.NET Framework: 937. C# - 간단하게 만들어 보는 리눅스의 nc(netcat), json_pp 프로그램 [1]
12310정성태9/3/202010584오류 유형: 644. Windows could not start the Elasticsearch 7.9.0 (elasticsearch-service-x64) service on Local Computer.
12309정성태9/3/202010324개발 환경 구성: 507. Elasticsearch 6.6부터 기본 추가된 한글 형태소 분석기 노리(nori) 사용법
12308정성태9/2/202011606개발 환경 구성: 506. Windows - 단일 머신에서 단일 바이너리로 여러 개의 ElasticSearch 노드를 실행하는 방법
12307정성태9/2/202012338오류 유형: 643. curl - json_parse_exception / Invalid UTF-8 start byte
12306정성태9/1/202010488오류 유형: 642. SQL Server 시작 오류 - error code 10013
12305정성태9/1/202011408Windows: 172. "Administered port exclusions"이 아닌 포트 범위 항목을 삭제하는 방법
12304정성태8/31/202010334개발 환경 구성: 505. 윈도우 - (네트워크 어댑터의 우선순위로 인한) 열거되는 IP 주소 순서를 조정하는 방법
12303정성태8/30/202010550개발 환경 구성: 504. ETW - 닷넷 프레임워크 기반의 응용 프로그램을 위한 명령행 도구 etrace 소개
12302정성태8/30/202010437.NET Framework: 936. C# - ETW 관련 Win32 API 사용 예제 코드 (5) - Private Logger파일 다운로드1
12301정성태8/30/202010753오류 유형: 641. error MSB4044: The "Fody.WeavingTask" task was not given a value for the required parameter "IntermediateDir".
12300정성태8/29/202010139.NET Framework: 935. C# - ETW 관련 Win32 API 사용 예제 코드 (4) CLR ETW Consumer파일 다운로드1
... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...