Linux FTP 클라이언트와의 수동 FTP 연결에 사용할 포트 설정

Linux FTP 클라이언트와의 수동 FTP 연결에 사용할 포트 설정

6100-6200 범위의 수신 연결만 허용하는 방화벽 뒤의 FTP 서버에 연결하려고 합니다. 다음과 같이 서버에 성공적으로 연결했습니다 curl.

curl --ftp-port :6100-6200 --list-only ftp.server

하지만 저는 더 친숙한 Python을 통해 다른 클라이언트를 사용하여 이 컬 명령의 동작을 재현하고 싶습니다. 원칙적으로는 Linux이지만 ftp누군가가 좋은 옵션을 제안하면 다른 옵션도 열려 있습니다. 나는 ftplib를 시도했지만 그것은 것 같습니다라이브러리에서는 포트 선택을 허용하지 않습니다.;시도했어요실패하다.

현재 작동하지 않습니다 ftp.

230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (XXX,XXX,XXX,XXX,202,251).
ftp: connect: Connection refused

동일한 명령 세트가 내 랩톱에서 실행되므로 분명히 문제는 방화벽에 있습니다.

ftp6100-6200 범위의 포트에서 데이터 연결 협상을 강제하여 동작을 시뮬레이션하려면 어떻게 해야 합니까 curl?

답변1

수동 모드에서 FTP를 사용하는 경우,서버는 클라이언트에게 사용할 (서버 측) 데이터 포트를 알려줍니다.. 잘 알려진 FTP 프로토콜에서는 클라이언트가 요청에 사용할 포트 범위를 서버에 표현하는 것을 허용하지 않습니다. 이를 변경할 수 있는 확장이 있을 수 있지만 이러한 확장이 반드시 널리 지원되는 것은 아닙니다.

귀하의 예에서 메시지는

227 Entering Passive Mode (XXX,XXX,XXX,XXX,202,251).

202클라이언트에게 "귀하의 IP 주소 XXX.XXX.XXX.XXX, 포트 51683으로부터의 데이터 연결을 수신하고 있습니다"(= *256 + 251) 라고 알려주기 때문에 FTP 서버에서 직접 .

각 TCP 연결에는 로컬 포트 ​​번호와 원격 포트 번호라는 두 개의 포트 번호가 있습니다. 일반적으로 나가는 연결은 나가는 연결을 위해 운영 체제에서 지정한 포트 범위에서 첫 번째 사용 가능한 로컬 포트만 선택하며, 원격 포트는 사용 중인 서비스에 따라 지정됩니다. 수동 FTP의 경우 서버는 구성에 따라 원격 포트를 선택하고 이를 FTP 227 응답 형식으로 클라이언트에 알립니다.

일반적으로 방화벽에서 수동 FTP를 처리하는 방법에는 두 가지가 있습니다.

a) 수동 FTP 데이터 연결을 위해 특정 범위의 포트를 허용/사용하도록 방화벽과 FTP 서버를 함께 구성해야 하므로 서버는 방화벽이 허용하지 않는 포트를 선택하려고 시도하지도 않습니다.

b) 방화벽은 FTP 명령 채널 트래픽을 수신하고, 각 데이터 연결에 사용할 포트 번호를 결정하고, 명령 채널에 선언된 포트 번호를 사용하여 FTP 클라이언트와 서버 간의 수동 FTP 데이터 연결을 동적으로 허용해야 합니다.

iptablesLinux / 방화벽을 사용하는 경우 netfilter이것이 바로 FTP 프로토콜별 conntrack 확장 모듈이 수행하는 작업입니다. 방화벽 시스템을 통해 모든 FTP 제어 연결을 수신하는 이전 정책이 악의적인 행위자에 의해 악용될 수 있는 것으로 밝혀졌기 때문에 수신이 허용된 제어 연결을 알려주기만 하면 됩니다. 이제 이러한 확장은 더 이상 악용될 수 없습니다. 자동으로 사용됩니다.자세한 내용은 이 페이지를 참조하세요.또는이 질문은 U&L SE에 있습니다..


curl실제로 FTP를 사용하여패시브 모드기본적으로 이 옵션을 사용하면 --ftp-port다음으로 전환됩니다.활성 모드. 매뉴얼 페이지에서 (강조 표시):

-P, --ftp 포트

(FTP) FTP 연결을 사용할 때 기본 개시자/수신자 역할을 반대로 바꿉니다.이 옵션을 사용하면 컬이 활성 모드를 사용하게 됩니다.Curl은 클라이언트가 지정한 주소와 포트에 다시 연결하도록 서버에 지시하는 반면, 패시브 모드에서는 서버가 연결할 IP 주소와 포트를 설정해야 합니다.


Python 및 에 관해서는 ftplib참고하십시오.말씀하신 문제는10년이 넘었습니다. 이제 Marcus Müller가 새로운 답변을 추가했습니다.

Python 3.3부터 ftplib연결을 설정하는 함수는 source_addr이를 정확하게 수행할 수 있는 매개변수를 사용합니다.

관련 정보