Centos 7 방화벽이 파일 교환을 차단합니다

Centos 7 방화벽이 파일 교환을 차단합니다

내 Centos 7 방화벽은 스크립트를 통해 연결하려고 하면 외부 FTP 클라이언트와의 파일 교환(가져오기 및 내보내기)을 차단합니다. 방화벽을 비활성화하면 모든 것이 잘 작동합니다. 파일 교환을 위해 특정 포트가 필요한지, 아니면 다른 문제가 있는지 알고 계시나요?

# sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ftp http https smtp ssh
  ports: 2222/tcp 587/tcp 25/tcp 465/tcp 21/tcp 80/tcp 40000/tcp 443/tcp 22/tcp 53/udp 53/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


# lsmod | grep nf_conntrack_ftp
nf_conntrack_ftp       18478  1 nf_nat_ftp
nf_conntrack          139264  8 nf_nat_ftp,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4,nf_conntrack_ipv6

# iptables-save -c
# Generated by iptables-save v1.4.21 on Thu Aug 13 19:59:02 2020
*nat
:PREROUTING ACCEPT [81930:11078515]
:INPUT ACCEPT [14712:902333]
:OUTPUT ACCEPT [24878:1693871]
:POSTROUTING ACCEPT [24878:1693871]
:OUTPUT_direct - [0:0]
:POSTROUTING_ZONES - [0:0]
:POSTROUTING_ZONES_SOURCE - [0:0]
:POSTROUTING_direct - [0:0]
:POST_public - [0:0]
:POST_public_allow - [0:0]
:POST_public_deny - [0:0]
:POST_public_log - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_public - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
[81930:11078515] -A PREROUTING -j PREROUTING_direct
[81930:11078515] -A PREROUTING -j PREROUTING_ZONES_SOURCE
[81930:11078515] -A PREROUTING -j PREROUTING_ZONES
[24878:1693871] -A OUTPUT -j OUTPUT_direct
[24878:1693871] -A POSTROUTING -j POSTROUTING_direct
[24878:1693871] -A POSTROUTING -j POSTROUTING_ZONES_SOURCE
[24878:1693871] -A POSTROUTING -j POSTROUTING_ZONES
[19315:1359674] -A POSTROUTING_ZONES -o eth0 -g POST_public
[5563:334197] -A POSTROUTING_ZONES -g POST_public
[24878:1693871] -A POST_public -j POST_public_log
[24878:1693871] -A POST_public -j POST_public_deny
[24878:1693871] -A POST_public -j POST_public_allow
[81930:11078515] -A PREROUTING_ZONES -i eth0 -g PRE_public
[0:0] -A PREROUTING_ZONES -g PRE_public
[81930:11078515] -A PRE_public -j PRE_public_log
[81930:11078515] -A PRE_public -j PRE_public_deny
[81930:11078515] -A PRE_public -j PRE_public_allow
COMMIT
# Completed on Thu Aug 13 19:59:02 2020
# Generated by iptables-save v1.4.21 on Thu Aug 13 19:59:02 2020
*mangle
:PREROUTING ACCEPT [477222:238129658]
:INPUT ACCEPT [447004:234240830]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [415842:656698573]
:POSTROUTING ACCEPT [415842:656698573]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:OUTPUT_direct - [0:0]
:POSTROUTING_direct - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_public - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
[477222:238129658] -A PREROUTING -j PREROUTING_direct
[477222:238129658] -A PREROUTING -j PREROUTING_ZONES_SOURCE
[477222:238129658] -A PREROUTING -j PREROUTING_ZONES
[447004:234240830] -A INPUT -j INPUT_direct
[0:0] -A FORWARD -j FORWARD_direct
[415842:656698573] -A OUTPUT -j OUTPUT_direct
[415842:656698573] -A POSTROUTING -j POSTROUTING_direct
[384088:64944119] -A PREROUTING_ZONES -i eth0 -g PRE_public
[93134:173185539] -A PREROUTING_ZONES -g PRE_public
[477222:238129658] -A PRE_public -j PRE_public_log
[477222:238129658] -A PRE_public -j PRE_public_deny
[477222:238129658] -A PRE_public -j PRE_public_allow
COMMIT
# Completed on Thu Aug 13 19:59:02 2020
# Generated by iptables-save v1.4.21 on Thu Aug 13 19:59:02 2020
*security
:INPUT ACCEPT [409931:227948926]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [415842:656698573]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:OUTPUT_direct - [0:0]
[409931:227948926] -A INPUT -j INPUT_direct
[0:0] -A FORWARD -j FORWARD_direct
[415842:656698573] -A OUTPUT -j OUTPUT_direct
COMMIT
# Completed on Thu Aug 13 19:59:02 2020
# Generated by iptables-save v1.4.21 on Thu Aug 13 19:59:02 2020
*raw
:PREROUTING ACCEPT [477222:238129658]
:OUTPUT ACCEPT [415842:656698573]
:OUTPUT_direct - [0:0]
:PREROUTING_ZONES - [0:0]
:PREROUTING_ZONES_SOURCE - [0:0]
:PREROUTING_direct - [0:0]
:PRE_public - [0:0]
:PRE_public_allow - [0:0]
:PRE_public_deny - [0:0]
:PRE_public_log - [0:0]
[477222:238129658] -A PREROUTING -j PREROUTING_direct
[477222:238129658] -A PREROUTING -j PREROUTING_ZONES_SOURCE
[477222:238129658] -A PREROUTING -j PREROUTING_ZONES
[415842:656698573] -A OUTPUT -j OUTPUT_direct
[384088:64944119] -A PREROUTING_ZONES -i eth0 -g PRE_public
[93134:173185539] -A PREROUTING_ZONES -g PRE_public
[477222:238129658] -A PRE_public -j PRE_public_log
[477222:238129658] -A PRE_public -j PRE_public_deny
[477222:238129658] -A PRE_public -j PRE_public_allow
COMMIT
# Completed on Thu Aug 13 19:59:02 2020
# Generated by iptables-save v1.4.21 on Thu Aug 13 19:59:02 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [322708:483513034]
:FORWARD_IN_ZONES - [0:0]
:FORWARD_IN_ZONES_SOURCE - [0:0]
:FORWARD_OUT_ZONES - [0:0]
:FORWARD_OUT_ZONES_SOURCE - [0:0]
:FORWARD_direct - [0:0]
:FWDI_public - [0:0]
:FWDI_public_allow - [0:0]
:FWDI_public_deny - [0:0]
:FWDI_public_log - [0:0]
:FWDO_public - [0:0]
:FWDO_public_allow - [0:0]
:FWDO_public_deny - [0:0]
:FWDO_public_log - [0:0]
:INPUT_ZONES - [0:0]
:INPUT_ZONES_SOURCE - [0:0]
:INPUT_direct - [0:0]
:IN_public - [0:0]
:IN_public_allow - [0:0]
:IN_public_deny - [0:0]
:IN_public_log - [0:0]
:OUTPUT_direct - [0:0]
[389741:226716526] -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[5566:334317] -A INPUT -i lo -j ACCEPT
[51697:7189987] -A INPUT -j INPUT_direct
[51697:7189987] -A INPUT -j INPUT_ZONES_SOURCE
[51697:7189987] -A INPUT -j INPUT_ZONES
[73:4550] -A INPUT -m conntrack --ctstate INVALID -j DROP
[37000:6287354] -A INPUT -j REJECT --reject-with icmp-host-prohibited
[0:0] -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[0:0] -A FORWARD -i lo -j ACCEPT
[0:0] -A FORWARD -j FORWARD_direct
[0:0] -A FORWARD -j FORWARD_IN_ZONES_SOURCE
[0:0] -A FORWARD -j FORWARD_IN_ZONES
[0:0] -A FORWARD -j FORWARD_OUT_ZONES_SOURCE
[0:0] -A FORWARD -j FORWARD_OUT_ZONES
[0:0] -A FORWARD -m conntrack --ctstate INVALID -j DROP
[0:0] -A FORWARD -j REJECT --reject-with icmp-host-prohibited
[93134:173185539] -A OUTPUT -o lo -j ACCEPT
[322708:483513034] -A OUTPUT -j OUTPUT_direct
[0:0] -A FORWARD_IN_ZONES -i eth0 -g FWDI_public
[0:0] -A FORWARD_IN_ZONES -g FWDI_public
[0:0] -A FORWARD_OUT_ZONES -o eth0 -g FWDO_public
[0:0] -A FORWARD_OUT_ZONES -g FWDO_public
[0:0] -A FWDI_public -j FWDI_public_log
[0:0] -A FWDI_public -j FWDI_public_deny
[0:0] -A FWDI_public -j FWDI_public_allow
[0:0] -A FWDI_public -p icmp -j ACCEPT
[0:0] -A FWDO_public -j FWDO_public_log
[0:0] -A FWDO_public -j FWDO_public_deny
[0:0] -A FWDO_public -j FWDO_public_allow
[51697:7189987] -A INPUT_ZONES -i eth0 -g IN_public
[0:0] -A INPUT_ZONES -g IN_public
[51697:7189987] -A IN_public -j IN_public_log
[51697:7189987] -A IN_public -j IN_public_deny
[51697:7189987] -A IN_public -j IN_public_allow
[2121:165216] -A IN_public -p icmp -j ACCEPT
[6239:372132] -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[760:43448] -A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[3894:222151] -A IN_public_allow -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[32:1852] -A IN_public_allow -p tcp -m tcp --dport 25 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[105:5552] -A IN_public_allow -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[88:4644] -A IN_public_allow -p tcp -m tcp --dport 2222 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[17:984] -A IN_public_allow -p tcp -m tcp --dport 587 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[0:0] -A IN_public_allow -p tcp -m tcp --dport 25 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[1337:80164] -A IN_public_allow -p tcp -m tcp --dport 465 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[0:0] -A IN_public_allow -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[0:0] -A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[0:0] -A IN_public_allow -p tcp -m tcp --dport 40000 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[0:0] -A IN_public_allow -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[0:0] -A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[27:1740] -A IN_public_allow -p udp -m udp --dport 53 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
[4:200] -A IN_public_allow -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
COMMIT
# Completed on Thu Aug 13 19:59:02 2020

답변1

사용되는 포트는 FTP 연결에 사용되는 "모드"에 따라 달라질 수 있습니다.

활성 모드에서 클라이언트는 명령 포트(21)를 통해 서버에 연결됩니다. 또한 서버에 권한이 없는 무작위 포트(>1023)를 제공합니다. 서버는 해당 임의의 포트를 대상으로 사용하여 클라이언트에 다시 연결합니다.

패시브 모드에서는 클라이언트가 명령 포트(21)를 통해 서버에 연결합니다. 그런 다음 서버는 권한이 없는 임의의 포트를 열고 해당 정보를 클라이언트에 보냅니다. 클라이언트는 이 무작위 포트를 대상으로 사용하여 서버에 다시 연결합니다.

자세한 설명은 다음 문서를 참조하세요.액티브 FTP와 패시브 FTP, 권위 있는 설명.


오류 설명에 따르면 FTP 클라이언트는 수동 모드로 연결되어야 합니다. 위에서 언급했듯이 서버는 자신의 측면에서 권한이 없는 임의의 포트를 열고 클라이언트가 해당 포트에 다시 연결되기를 기대합니다. 그런 다음 방화벽은 들어오는 연결을 차단하여 전체 프로세스가 실패하게 만듭니다.

수동 모드를 지원하기 위해 권장되는 접근 방식은 특정 범위의 포트를 사용하도록 FTP 서버를 구성한 다음 방화벽에서 동일한 범위를 여는 것입니다. 열어야 하는 포트 수는 지원하려는 클라이언트 수에 따라 다릅니다.


가능하다면 SFTP를 대안으로 고려해 볼 수도 있습니다. SFTP는 SSH 위에 구축된 완전히 다른 프로토콜입니다. 방화벽 수준에서 처리하기 쉬운 단일 표준 SSH 포트(22)를 사용하여 실행됩니다. SFTP는 또한 기존 FTP에서는 불가능했던 모든 통신을 암호화합니다.

답변2

이것은 Haxiel의 답변에 대한 또 다른 답변입니다. 암호화가 사용되는 경우(예:AUTH TLS) 그런 다음 Haxiel의 답변을 계속 사용해야 합니다. FTP 서버 구성을 방화벽 구성과 일치시켜 예약된 포트 범위를 사용하세요.


특정 프로토콜(보통 오래된 프로토콜)은 방화벽 친화적이지 않습니다. FTP는 그 중 하나입니다. 전송된 모든 명령에 대해 클라이언트와 서버 간에 추가 동적 임시 포트를 협상하여 데이터를 보냅니다. 이 데이터 연결에 대한 명령, 응답 및 연결 방향은 활성 또는 수동 FTP 모드에 따라 다릅니다.

Linux 커널 Netfilter의 conntrack 하위 시스템은 이러한 프로토콜 중 일부를 처리하기 위한 프로토콜별 도우미를 제공합니다. 물론 FTP에 대한 도우미를 제공합니다.nf_conntrack_ftp:

도움말 텍스트

FTP 연결을 추적하는 것은 문제가 있습니다. 이를 추적하고 가장 및 기타 형태의 네트워크 주소 변환을 수행하려면 특별한 도우미가 필요합니다.

이는 레이어 3 독립적 연결 추적을 위한 FTP 지원입니다.

모듈이 로드되면 nf_conntrack_ftpFTP가 암호화되지 않은 한(즉, 암호화되지 않음 AUTH TLS: 암호화로 스누핑이 방지됨) 커널의 Netfilter conntrack 하위 시스템은 TCP 포트 21에서 수신 대기하고 모든 명령을 분석하여 필요한 포트를 미리 파악하고 이를 사전 허용합니다. 다음 명령 클래스 포트를 사용하여iptables'-m conntrack --ctstate RELATED(또는nftables' ct state related):

RELATED

이 패킷은 새 연결을 시작하지만 FTP 데이터 전송이나 ICMP 오류와 같은 기존 연결과 연관되어 있습니다.

틀림없이방화벽애플리케이션이 ICMP 오류 등을 다시 수신할 수도 있으므로 규칙 세트에 이 유형의 규칙을 사용하십시오.

시스템이 NAT를 수행하는 경우 nf_nat_ftp추가 모듈이 확장됩니다.연결하다클라이언트와 서버에 투명하게 작동하도록 데이터를 가로채고 협상된 포트를 변경하는 것도 가능합니다.

간단히 말해서:

modprobe nf_conntrack_ftp

이렇게 하면 OP의 문제가 해결됩니다. 모든 FTP 상황(클라이언트 또는 서버, 활성 또는 수동 FTP)에서 작동합니다. CentOS7에서 부팅 시 이 모듈을 로드하려면 파일을 추가 /etc/modules-load.d/하고 systemd에서 처리되도록 할 수 있습니다. 예를 들어, 루트로서:

# echo nf_conntrack_ftp > /etc/modules-load.d/local-nfhelpers.conf
# systemctl enable systemd-modules-load
# systemctl restart systemd-modules-load

서버가 어떤 방식으로든(FTP 포트를 다른 포트로 리디렉션, 개인 LAN 라우팅, VM 또는 컨테이너 호스팅 등) NAT를 수행하는 경우 nf_nat_ftpNAT도 올바르게 처리되도록 이 모듈을 추가하는 것을 고려할 수도 있습니다.

기본적으로 이는 CentOS 7 커널 3.10에 모두 필요합니다.


노트:

최신 커널, 특히 4.7 이상의 커널에서는 자동 프로토콜 포트 할당이 기본적으로 비활성화되어 있습니다(예: FTP의 경우 포트 21 추적).iptables특정 프로세스에 대해 도우미가 활성화되어야 하는 정확한 상황을 선택하려면 규칙을 추가해야 합니다. 지금 사용 가능방화벽작업이 더 복잡해질 수 있습니다. 물론 이전 방법을 다시 활성화할 수도 있지만 스누핑을 활성화할 조건을 선택하는 것이 더 안전한 것으로 간주됩니다.

이에 대한 자세한 내용은 다음 블로그(일부 netfilter 관리자가 만든)를 참조하세요.리눅스 이상! iptables 및 연결 추적 도우미의 안전한 사용.

관련 정보