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管理者が作成したもの)を参照してください。Linux以上! iptablesと接続追跡ヘルパーの安全な使用

関連情報