저는 집에서 메인컴 1대와 파일서버 1대를 사용하고 있습니다. 파일서버는 WWW, FTP, 토런트 등의 용도로 사용하고 있는데, 외부에서 FTP Passive 모드로 접속을 시도하면 접속은 되지만 파일은 보이지 않습니다. 그 이유에 대해 간단히 설명드리고 해결책을 알려드리겠습니다.

FTP에는 2가지 모드가 있습니다. 바로 Active 모드와 Passive 모드인데, 간단히 설명하자면

Active 모드 - 클라이언트가 서버에 접속하면서 DataChannel로 사용할 포트를 서버에 알려주면, 서버가 클라이언트의 해당 포트로 접속하는 방식

Passive 모드 - 클라이언트가 서버에 접속하면, 서버가 DataChannel로 사용할 포트를 클라이언트에 알려주고, 클라이언트는 다시 서버의 해당 포트로 접속하는 방식

설명이 허접해서 이해가 잘 안 되실 수도 있는데, 어쨌든 Active 모드는 서버가 클라이언트로 접속하는 조금 어색한 구조로 되어 있어서 여러가지 문제가 많으므로(특히 방화벽), 일반적으로 Passive 모드를 많이들 사용하실 것입니다.

그런데 이 Passive 모드에도 문제가 있습니다. 바로 NAT 환경일 때 문제가 발생합니다.(Active도 마찬가지) 그러니까 서버가 내부에서 사용하는 사설 IP와 실제로 외부에서 접속하는 공인 IP가 따로 존재하는 경우 문제가 발생합니다. 예를 들어 공유기를 사용하는 환경이라면 그렇고, 회사에서도(특히 클라우드 환경이라면) 비슷한 상황이 많이 발생할 것입니다.

무슨 말인지 잘 이해가 안 되실 수도 있으니, 실제 제 환경을 가지고 설명드리겠습니다.

회사에서 집에 있는 파일 서버로 FTP Passive 모드 접속을 시도한 경우

1. 회사 노트북에서 윈도우 탐색기 주소창에 ftp://175.197.xxx.xxx 를 입력했다.
2. 그랬더니 집에 있는 파일 서버가 반응을 하고 계정 정보를 묻는 창을 띄웠다.
3. 계정 정보를 입력했다.
4. 집에 있는 파일 서버가 192.168.0.3 IP의 55246 포트로 접속하라는 정보를 보냈다.
5. 하지만 회사 노트북은 192.168.0.3 IP의 55246 포트로 접속할 수 없다. 그래서 아무것도 안 보인다.

문제의 원인이 어디에 있는지 아시겠죠? 문제는 두가지입니다.

첫째는 집에 있는 파일 서버가 192.168.0.3 이라는 사설 IP를 알려줬다는 점이고
둘째는 55246 포트로 접속하라고 알려줬다는 점입니다.

첫번째 문제는 파일 서버가 회사 노트북한테 공인 IP를 알려주도록 설정해주면 해결될 것이고
두번째 문제는 공유기에서 55246 포트를 파일 서버로 포트포워딩 해주면 해결될 것입니다.

그런데 55246 포트는 1024 - 65535 사이에서 랜덤하게 생성된 포트입니다. 그러니까 Passive 모드로 접속시 서버는 DataChannel로 사용할 포트를 랜덤하게 정해서 알려줍니다. 따라서 공유기에서 파일 서버에 DMZ 설정을 걸어주든지, 아니면 Passive 모드에서 사용할 DataChannel의 특정 포트 범위를 한정해주고, 해당 범위를 공유기에서 포트포워딩 해주시면 되겠습니다.

이제 실전에 들어가겠습니다.

IIS에서 FTP 방화벽 지원 설정으로 들어가보시면


데이터 채널 포트 범위와 방화벽의 외부 IP 주소 설정하는 부분이 있습니다. 데이터 채널 포트 범위는 기본값 0-0으로 그냥 두신다면 1024 - 65535 범위를 사용하게 되므로, 공유기에서 DMZ 설정을 하시거나 또는 1024 - 65535 포트를 전부 포트포워딩 시켜줘야 합니다. 보안상 별로 안 좋으니 특정 범위를 지정해봅시다. 저는 예로 나온 5000-6000 범위를 지정하겠습니다.

그리고 방화벽의 외부 IP 주소 부분에 공인 IP 주소를 넣어주세요. 가장 중요한 부분이라 할 수 있습니다. Passive 모드에서 사설 IP를 알려주면 클라이언트가 접속을 못 하니까요.

값을 넣으셨다면 오른쪽에 있는 적용 버튼 눌러주시면 되구요.


그런데 이놈의 FTP 방화벽 지원 설정이 좀 거시기합니다. 방화벽의 외부 IP 주소 부분은 바로 적용이 되는데, 데이터 채널 포트 범위는 바로 적용되지 않습니다. FTP 서비스를 한번 재시작 해줘야 적용이 됩니다.

services.msc 들어가서 Microsoft FTP Service를 재시작 한번 해주시거나 아니면 관리자 권한으로 커맨드 창을 띄워서 아래 명령어로 서비스를 재기동 해주시면 되겠습니다.

net stop ftpsvc
net start ftpsvc



다음은 공유기의 포트포워딩 설정 부분인데 이 부분은 각자 사용하는 기종이 다르니 제가 설명하기 좀 그렇겠죠? 아무튼 저는 파일 서버에 5000-6000 포트를 포워딩 시켜주겠습니다. (21번 포트는 당연히 포워딩 해주셨겠죠 ^^;;)


마지막으로 윈도우 방화벽 부분을 생각해볼 필요가 있는데, 그냥 FTP 자체를 예외처리 해주시면 됩니다.


명령어로 하시려면 아래와 같이 하시면 됩니다.

netsh advfirewall firewall add rule name="FTP" service=ftpsvc action=allow protocol=TCP dir=in



이상입니다. 다시 과정을 정리하자면

1. IIS에서 FTP 방화벽 지원 설정
2. FTP 서비스 재기동하기
3. 공유기에서 포트포워딩 설정
4. 윈도우 방화벽 예외 처리

이렇게 작업해주시면 FTP Passive 모드 문제는 해결될 것입니다.