web-dev-qa-db-ja.com

vsftpd(ファイアウォールの後ろ)がpasvアドレスの内部IPアドレスを返すのはなぜですか?

別のDebianファイアウォールの背後にあるDebianサーバーでvsftpdを使用しています。中身は正しく、外部からftpサーバーに接続できます。ただし、クライアントがPASVコマンドを発行すると、ftpサーバーは内部IP(192.168.0.19)を返します。

pasv_addressディレクティブがconfファイル内に設定されているため、「アドレスは接続された着信ソケットから取得されます」( the manual からコピーされます)。外部クライアントがPASVを発行するとファイアウォールの外部IPアドレスが返され、内部クライアントが接続すると内部FTPサーバーのIPが返されるように思えます。

pasv_addressディレクティブをファイアウォールの外部IPに追加すると、すべてが外部で機能しますが、内部で機能しなくなります。内部IPアドレスに設定するか、pasv_address、内部クライアントは機能しますが、外部クライアントは機能しません。

誰か洞察がありますか?

編集1:以下はサーバー側のログファイルです。

Thu Sep  7 10:36:15 2017 [pid 9093] FTP command: Client "x.x.x.x", "USER yyy"
Thu Sep  7 10:36:15 2017 [pid 9093] [yyy] FTP response: Client "x.x.x.x", "331 Please specify the password."
Thu Sep  7 10:36:15 2017 [pid 9093] [yyy] FTP command: Client "x.x.x.x", "PASS <password>"
Thu Sep  7 10:36:15 2017 [pid 9092] [yyy] OK LOGIN: Client "x.x.x.x"
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "230 Login successful."
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "OPTS utf8 on"
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "200 Always in UTF8 mode."
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "PWD"
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "257 "/""
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "CWD /DownloadProduction/"
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "250 Directory successfully changed."
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "TYPE A"
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "200 Switching to ASCII mode."
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP command: Client "x.x.x.x", "PASV"
Thu Sep  7 10:36:15 2017 [pid 9094] [yyy] FTP response: Client "x.x.x.x", "227 Entering Passive Mode (192,168,0,19,192,27)."

編集2:ProFTPDを使用してこれを機能させることができました。そのためのserverfaultのケースを次に示します。 ファイアウォールの背後にあるProFTPdサーバーがWANおよびLAN接続)の内部IPアドレスを返す

3
Lifz

外部ファイアウォールの背後にいる場合、着信接続は実際には外部ファイアウォールから行われます。したがって、サーバーのIPアドレスはその内部IPアドレスです。あなたが説明するのは「正しい」動作です。 FTPサーバーは、ファイアウォールの外部IPアドレスを認識しません(認識できません)。


FTPサーバーに2つのIPアドレスを割り当てることができます。 1つはexternalを使用し、もう1つはinternalを使用します。そして、FTPサーバーがexternal IPアドレス上の接続のファイアウォール外部IPアドレスを返すように構成します。 internal IPアドレス上の接続の内部IPアドレス。

確かではありませんが、vsftpdがそのような構成を許可しているかどうか。 ProFTPDにはあります。

1
Martin Prikryl

Vsfptdを使用してこれを機能させるために、いくつかのことを行いました。

  1. 既存のvsfptdサービスのconfファイルを変更しました
    • ポート2121で待機する
    • 外部IPで応答する
  2. ファイアウォールからポート21をFTPサーバーのポート2121に転送する
  3. 2番目のvsftpdサービス(vsftpd-internalという名前)を追加しました
    • デフォルトのポート21でリッスンします
    • 内部IPで応答する

これにより、既存のサービスは外部接続のみを処理し、新しいvsftpd-internalサービスは内部接続のみを処理します。

confオプションを表示するように編集(コメントでリクエスト)

外部(/etc/vsftpd.conf):

listen_port=2121
pasv_address=x.x.x.x # External IP - port forwarded from FW to this machine

内部(/etc/vsftpd-internal.conf):

# nothing special in this one, mostly default
1
Lifz

FTPは、すでに確立されている制御接続でデータ転送を行わないため、頻繁にヘッドレイクを引き起こしますが、データ転送のために追加の接続を開く必要があります。 FTPの最初のバージョンでは、サーバーがクライアントへのこの接続を開く必要がありました。これは、NATが不明な場合がありました。NATでこれを機能させるために、PASVが発明されたため、クライアントが開くことができましたこの2番目の接続。より良いですが、-あなたが経験したように-最適ではありません。

3つのオプションが思い浮かびます。

  • 代わりにsftpを使用します。これは、1つの接続のみで制御とデータにsshを使用しているため、この問題の影響を受けません。もちろん、これは異なるプロトコルであるため、環境によってはこれがオプションにならない場合があります。
  • DebianファイアウォールでNATを実行する代わりに、「ftp-proxy」などのFTPプロキシソフトウェアを使用します。
  • 2つのvsftpサーバーをセットアップします。1つは標準ポートで内部接続をリッスンし、もう1つはたとえば2111で外部使用します。これにより、pasv_addressがファイアウォールの外部IPに構成されます。 NATは、ポート21をポート2121に変換するように調整する必要があります。
1
TomTomTom