3.5. FTP 구성
FTP(File Transport Protocol)는 로드 밸런서 환경에 고유한 일련의 문제를 제공하는 오래되고 복잡한 다중 포트 프로토콜입니다. 이러한 문제의 특성을 이해하려면 먼저 FTP의 작동 방식에 대한 몇 가지 핵심 사항을 이해해야 합니다.
3.5.1. FTP 작동 방식
대부분의 다른 서버 클라이언트 관계를 사용하면 클라이언트 시스템이 특정 포트에서 서버에 대한 연결을 열고 서버는 해당 포트에서 클라이언트에 응답합니다. FTP 클라이언트가 FTP 서버에 연결하면 FTP 제어 포트 21에 대한 연결이 열립니다. 그런 다음 클라이언트는 FTP 서버에 활성 또는 수동 연결을 설정할지 여부를 알려줍니다. 클라이언트에서 선택한 연결 유형에 따라 서버가 응답하는 방법과 어떤 포트 트랜잭션이 발생하는지 결정합니다.
두 가지 유형의 데이터 연결은 다음과 같습니다.
- 활성 연결
- 활성 연결이 설정되면 서버는 포트 20에서 클라이언트 시스템의 높은 범위 포트로 클라이언트에 대한 데이터 연결을 엽니다. 그런 다음 서버의 모든 데이터가 이 연결을 통해 전달됩니다.
- 수동 연결
- 수동 연결이 설정되면 클라이언트는 FTP 서버에 10,000보다 높은 모든 포트에 있을 수 있는 수동 연결 포트를 설정하도록 요청합니다. 그런 다음 서버는 이 특정 세션에 대해 이 숫자가 높은 포트에 바인딩되고 해당 포트 번호를 클라이언트로 다시 중계합니다. 그런 다음 클라이언트는 데이터 연결에 대한 새로 바인딩된 포트를 엽니다. 클라이언트의 각 데이터 요청으로 인해 별도의 데이터 연결이 생성됩니다. 대부분의 최신 FTP 클라이언트는 서버에서 데이터를 요청할 때 수동 연결을 설정하려고 합니다.
참고
클라이언트는 서버가 아닌 연결 유형을 결정합니다. 즉, FTP를 효과적으로 클러스터하려면 활성 연결 및 수동 연결을 모두 처리하도록 LVS 라우터를 구성해야 합니다.
FTP 클라이언트-서버 관계는 Keepalived에서 모르는 다수의 포트를 잠재적으로 열 수 있습니다.
3.5.2. 로드 밸런서 라우팅에 미치는 영향
IPVS 패킷 전달은 포트 번호 또는 방화벽 마크를 인식하는 것을 기반으로 클러스터 내외 연결만 허용합니다. 클러스터 외부에서 클라이언트가 포트 IPVS를 열려고 시도하지 않으면 연결이 삭제됩니다. 마찬가지로 실제 서버가 포트 IPVS에서 인터넷에 다시 연결을 열려고 하면 연결이 끊어집니다. 즉, 인터넷상의 FTP 클라이언트의 모든 연결에 동일한 방화벽 마크가 할당 되어야 하며 FTP 서버의 모든 연결이 네트워크 패킷 필터링 규칙을 사용하여 인터넷에 올바르게 전달 되어야 합니다.
참고
Passive FTP 연결을 활성화하려면
ip_vs_ftp
커널 모듈이 로드되어야 합니다. 쉘 프롬프트에서 다음 명령을 관리 사용자로 실행하여 이 모듈을 로드하고 모듈이 재부팅 시 로드되는지 확인합니다.
echo "ip_vs_ftp" >> /etc/modules-load.d/ip_vs_ftp.conf systemctl enable systemd-modules-load systemctl start systemd-modules-load
3.5.3. 네트워크 패킷 필터 규칙 생성
FTP 서비스에 iptables 규칙을 할당하기 전에 3.4절. “멀티 포트 서비스 및 로드 밸런서 ” 의 정보를 검토하여 기존 네트워크 패킷 필터링 규칙을 확인하기 위한 다중 포트 서비스 및 기술과 관련된 정보를 검토하십시오.
다음은 동일한 방화벽 마크
21
을 FTP 트래픽에 할당하는 규칙입니다.
3.5.3.1. 활성 연결에 대한 규칙
활성 연결 규칙은 커널에 포트
20
( FTP 데이터 포트)의 내부 유동 IP 주소로 연결을 수락하고 전달하도록 지시합니다.
다음 iptables 명령을 사용하면 LVS 라우터에서 IPVS에서 알 수 없는 실제 서버의 발신 연결을 허용할 수 있습니다.
/usr/sbin/iptables -t nat -A POSTROUTING -p tcp -s n.n.n.0/24 --sport 20 -j MASQUERADE
iptables 명령에서 n.n.n.n은
keepalived.conf
파일의 NAT 인터페이스의 내부 네트워크 인터페이스 virtual_server
섹션에 대해 유동 IP의 처음 세 값으로 교체해야 합니다.
3.5.3.2. Passive Connections에 대한 규칙
수동 연결 규칙은 인터넷에서 들어오는 적절한 방화벽 표시를 다양한 포트 범위에서 서비스의 유동 IP 주소로 할당합니다. 10,000에서 20,000까지입니다.
주의
수동 연결의 포트 범위를 제한하는 경우 일치하는 포트 범위를 사용하도록 FTP 서버
vsftpd
도 구성해야 합니다. 이 작업은 /etc/vsftpd.conf
에 다음 행을 추가하여 수행할 수 있습니다.
pasv_min_port=10000
pasv_max_port=20000
실제 FTP 서버 주소를 덮어쓰도록
pasv_address
를 설정하면 LVS에서 가상 IP 주소로 업데이트되므로 사용해서는 안 됩니다.
다른 FTP 서버의 구성은 해당 문서를 참조하십시오.
이 범위는 대부분의 경우 충분히 넓어야 합니다. 그러나 아래 명령에서
10000:20000
를 1024:65535
로 변경하여 사용 가능한 모든 비보안 포트를 포함하도록 이 수를 늘릴 수 있습니다.
다음 iptables 명령은 적절한 포트에서 유동 IP로 주소가 지정된 모든 트래픽을
21
의 방화벽 마크로 할당하는 효과가 있으며, 이는 IPVS로 인식되고 적절하게 전달됩니다.
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 --dport 21 -j MARK --set-mark 21
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 --dport 10000:20000 -j MARK --set-mark 21
iptables 명령에서 n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n은
keepalived.conf
파일의 virtual_server
섹션에 정의된 FTP 가상 서버의 유동 IP로 교체해야 합니다.
위의 명령은 즉시 적용되지만, 저장하지 않는 한 시스템을 재부팅하면 유지되지 않습니다. 변경 사항을 저장하려면 다음 명령을 입력합니다.
# iptables-save > /etc/sysconfig/iptables
시스템 시작 시 iptables 서비스가 시작되었는지 확인하려면 다음 명령을 입력합니다.
# systemctl enable iptables
다음 명령을 실행하고 변경 사항이 남아 있는지 확인하여 재부팅 시 변경 사항이 지속되는지 확인할 수 있습니다.
# systemctl restart iptables