저는 아치 리눅스를 사용하고 있습니다. 튜토리얼에 따라 웹 서버의 기본 포트만 허용하도록 /etc/iptables/iptables.rules를 변경했습니다. 또한 /etc/modules-load.d/nf_conntrack_ftp.conf를 사용하여 모듈을 활성화하고 /etc/modprobe.d/ip_conntrack_ftp.conf에서 사용한 기본 FTP 포트를 변경했습니다. 두 가지 질문이 있습니다. "500 Illegal Port Command" 및 "ERRCONNREFUSED" 오류가 발생하여 FTP가 작동하지 않습니다. 활성 모드로 전환하고 일반 FTP를 통과하면 작동합니다. 그래서 iptables에 문제가 있습니다. 또한 iptables는 내가 허용하더라도 IPv6 연결을 허용하지 않습니다. 다른 파일을 변경해야 합니까? 감사해요. 다음은 iptables.rules의 스크린샷입니다:
물론 이 글을 게시하기 전에 FTP 포트를 변경했습니다.
답변1
핵심요약: FTP는 깨진 프로토콜이고, FTPS는 더욱 그렇습니다. 프로토콜 설계와 암호화의 조합으로 인해 방화벽에서는 매우 제대로 작동하지 않습니다. SFTP(SSH 프로토콜을 통한 파일 전송)를 사용해 보세요.
FTP는 제어 연결(보통 포트 21)과 데이터 연결로 구성됩니다. 데이터 연결에 사용되는 포트는 제어 연결 내에서 동적으로 교환됩니다. 활성 모드에서 클라이언트는 PORT 또는 EPRT 명령에 지정된 IP/포트를 수신하고 서버는 클라이언트에 연결됩니다. 패시브 모드에서는 서버가 PASV 또는 EPSV 명령에 대한 응답으로 제공된 IP/포트를 수신하고 클라이언트가 서버에 연결됩니다.
방화벽 구성에서 이러한 동적 포트를 처리하는 한 가지 방법은 광범위한 포트를 열어 두는 것입니다. 이는 방화벽을 사용하여 공격 표면을 최대한 제한한다는 아이디어와 분명히 모순됩니다. 따라서 대부분의 방화벽은 필요에 따라 일치하는 패킷 필터링 규칙을 생성할 수 있도록 제어 연결을 검사하고 동적 연결에 사용되는 포트를 찾는 "도우미"를 제공합니다. iptables의 경우 이는 ip_conntrack_ftp에서 내부적으로 수행됩니다. 이것이 지금 당신이 시도하고 있는 것입니다.
불행하게도 이러한 도우미를 사용한다는 것은 방화벽이 제어 연결 내에서 트래픽을 읽을 수 있어야 한다는 것을 의미합니다. 이는 암호화되지 않은 일반 FTP를 사용하지 않는 경우 가능합니다. 그러나 FTP+TLS를 사용하면 제어 연결이 암호화되므로 도우미는 요청 시 포트를 여는 데 필요한 정보를 추출할 수 없습니다. TLS를 사용하여 인증 부분만 전송한 다음 암호화를 다시 끄는(FTPS 명령 CCC) 이론적 방법이 있지만 이를 위해서는 클라이언트 지원 및 사용이 필요합니다.
따라서 가능하다면 FTP와 FTPS를 사용하지 말고 SFTP를 대신 사용하세요. 이는 파일 전송을 위해 SSH 프로토콜을 통해 수행되며 단일 포트만 사용하므로 제한적인 방화벽 구성이 더 쉬워집니다.