動的ポートを使用して手動FTPのファイアウォールルールを作成するには?

動的ポートを使用して手動FTPのファイアウォールルールを作成するには?

次の2つのルールは手動転送を許可し、それをFTPサーバーのファイアウォールルールとして追加しました。

//The following two rules allow the inbound FTP connection
iptables -A INPUT -s $hostIP -p tcp --dport 21 -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP -p tcp --sport 21 -o eth0 -m state --state ESTABLISHED -j ACCEPT

// The following two rules allow for passive transfers
iptables -A INPUT -s $hostIP -p tcp --dport 1024:65535 -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP  -p tcp --sport 1024:65535 -o eth0 -m state --state ESTABLISHED -j ACCEPT

私のFTPサーバーは、「1024:65535」の範囲に手動ポートを割り当てることによって構成されており、上記の規則が機能します。ただし、FTP サーバーは固定ポート範囲の代わりに使用可能なポートにバインドするように構成されました。では、上記の2つのルールにどのような変更が必要ですか?

編集する 回答に記載されている手動FTP接続に3つのルールを適用した後、次の順序でルールを設定しましたが、動作が停止してクライアントが接続されましたが、リモートディレクトリを取得できませんでした。

//The following two rules allow the inbound FTP connection
iptables -A INPUT -s $hostIP -p tcp --dport 21 -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP -p tcp --sport 21 -o eth0 -m state --state ESTABLISHED -j ACCEPT

iptables  -A PREROUTING -t raw -p tcp -s $hostIP --dport 21 -j CT --helper ftp
iptables  -A INPUT -m conntrack --ctstate RELATED -m helper --helper ftp -s $hostIP -p tcp -j ACCEPT
iptables  -A OUTPUT -m conntrack --ctstate ESTABLISHED -m helper --helper ftp -d $hostIP -p tcp -j ACCEPT

作業ルール

iptables -A PREROUTING -t raw -p tcp -s $hostIP --dport 21 -j CT --helper ftp
iptables -A INPUT  -i eth0 -p tcp -s $hostIP -m conntrack --ctstate RELATED,ESTABLISHED -m helper --helper ftp -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -d $hostIP -m conntrack --ctstate ESTABLISHED -m helper --helper ftp -j ACCEPT

ベストアンサー1

$hostIPあなたのルールであなたが意味するものはFTPアクセスを許可したいホストであると仮定します。そうでなければ、あなたの既存のルールは私には理解されません。

暗号化されていないFTPを使用する場合は、完全にオープンなFTPデータ接続ルールを接続トレースに置き換える必要があります。

まず、FTP 接続追跡ヘルパーを受信 FTP に接続するルールを追加します。注文するつながる:

iptables -A PREROUTING -t raw -p tcp -s $hostIP --dport $ftpCMDport -d $ftpServerIP -j CT --helper ftp

これは$ftpCMDport、ローカルFTPサーバーがログインを許可するポートです。通常はポート21です。

(履歴:以前はTCPポート21で自動的に発生しましたが、自動割り当てを乱用する可能性があることがわかりました。Linuxカーネル3.5では、接続追跡アシスタントの自動割り当てがオプションになり、後で自動割り当て機能が削除されました。)

CTヘルパーがFTPコマンド接続を監視すると、ファイアウォールは正当なFTPデータ接続のためにどのポートが許可されるべきかを「認識」します。着信データ接続を許可するためにこの情報を実際に使用するには、さらに2つの規則が必要です。

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -m helper \
   --helper ftp -s $hostIP -d $ftpServerIP -p tcp -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -m helper \
   --helper ftp -s $ftpServerIP -d $hostIP -p tcp -j ACCEPT

これら3つの規則は、2つの既存のFTPデータ接続規則を完全に置き換える必要があります。 FTPサーバーが両方のタイプを許可する場合は、アクティブ接続と手動接続の両方に適しています。手動FTPデータ接続のみを許可するには、RELATEDOUTPUTルールを削除する必要があります。

これは以下に基づいています。https://home.regit.org/netfilter-en/secure-use-of-helpers/


SSL / TLSを使用してFTPを暗号化すると、接続追跡ヘルパーは暗号化されたFTPコマンドトラフィックを理解できないため、FTPサーバーが無料ポートのデータ接続を受け入れると、ファイアウォールトラフィック全体を効果的にブロックできません。これは、すべてのTCPポートが特定の接続に対してFTPデータポートになる可能性があるためです。もしそうなら、唯一の可能性はIPアドレスにトラフィックを制限することです。

iptables -A INPUT -s $hostIP -p tcp -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP  -p tcp -o eth0 -m state --state ESTABLISHED -j ACCEPT

--dportこれはデフォルトでオプションが削除された既存のルールです--sport

おすすめ記事