web-dev-qa-db-ja.com

iptablesを使用するとFTPで接続できますが、ディレクトリリストを取得できません

重複の可能性:
IPTablesでFTPを許可する

私はftpで接続することを可能にする次のルールを持つiptablesルールのかなり制限されたセットを持っています

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

クライアントは正常に接続できますが、それだけです。問題が発生する直前のftpクライアントからの次の出力が役立つ場合があります。

Command:    MLSD
Error:  Connection timed out
Error:  Failed to retrieve directory listing

IPテーブルを停止すると、すべてが期待どおりに機能します


CentOSリリース5.5(最終版)

proftpd-1.3.3c-3

1
stew

「関連する」接続を許可するには、追加のルールが必要です。これは、FTPプロトコルがコマンド用に1つのポートを使用し、データ用に別のポートを使用しているためです。

iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

また、関連する接続を追跡するためにロードする必要があるカーネルモジュールがあります。これはip_conntrack_ftpと呼ばれますが、ロードする方法はディストリビューションによって異なります。

ヘドラっぽいシステムでは、/etc/sysconfig/iptables-configに色目があります

6
noodl

違いを打破するためだけに:

アクティブFTP:クライアントはサーバーのポート21に接続します。これが制御チャネルです。ファイルまたはディレクトリリストの取得はデータ転送であり、サーバーはクライアントに接続して送信を試みます。ほとんどのクライアントがNATされ、ファイアウォールで保護されている方法を考えると、これは最近ではほとんど機能しません。

パッシブFTP:まだデータチャネルが必要ですが、今回はサーバーがポート番号をクライアントに送り返し、クライアントがanotherそのポートでサーバーに接続し直します。

パッシブのデータ接続でタイムアウトする理由は、データポートがまだブロックされているためです。 FTPサーバーソフトウェアに応じて、通常、サーバーが送信するポートの範囲を指定できます(例:50000-50010)。次に、そのポート範囲でインバウンド接続を受け入れる必要もあります。 (同時接続の数も、使用可能なポートの数と同じに制限するようにしてください。)

私はproftpdに精通していませんが、必要なことを実行できると思います。

編集 Noodlの答えは、データ接続を許可するための最善の策ですが、追跡を容易にするために、とにかくポート範囲について具体的にしたい場合があります。

2
SmallClanger

NATを使用していると仮定して、パッシブFTPを使用するようにクライアントを設定してみてください。

Filezillaの接続設定では、コマンドラインで「パッシブ」でオンにする必要があると思います。ls/ dirコマンドの前にオンにしてください。

0
Sirex

Netfilterconntrackモジュールを使用できます。

modprobe nf_conntrack_ftp 

そして、起動時に/ etc/sysconfig/iptables-configにロードされます:

IPTABLES_MODULES="nf_conntrack_ftp"
0
silviu.h