2016-12-08 8 views
3

パッシブモード(PASV)でAWS EC2(Ubuntu16.04)でFTPサーバーをセットアップしましたが、機能しません。しかし、それはEPSVで動作しますが、理由はわかりません。私は周りを検索したが、答えが見つからない、どのような体はこれで私を助けることができますか?vsftpdがPASVへの応答で0,0,0,0を返します

1 vsftpdのコンフィグ

anonymous_enable=NO 
local_enable=YES 
write_enable=YES 
chroot_local_user=YES 
pasv_enable=YES 
pasv_min_port=13000 
pasv_max_port=13100 
port_enable=YES 
pasv_address=[public ip address of AWS EC2 instance] 
allow_writeable_chroot=YES 
seccomp_sandbox=NO 

2. AWS EC2ファイアウォール

security groups (Inbound) setting

3.テストFireFTPスルー

Without IPV6 selected

220 (vsFTPd 3.0.3) 
USER sensor 
331 Please specify the password. 
PASS (password not shown) 
230 Login successful. 
PWD 
257 "/" is the current directory 
TYPE A 
200 Switching to ASCII mode. 
EPSV 
229 Entering Extended Passive Mode (|||13082|) 
LIST 
150 Here comes the directory listing. 
226 Directory send OK. 
:以下のようにログ、

220 (vsFTPd 3.0.3) 
USER sensor 
331 Please specify the password. 
PASS (password not shown) 
230 Login successful. 
CWD/
250 Directory successfully changed. 
TYPE A 
200 Switching to ASCII mode. 
PASV 
QUIT 

しかし、それは(IPV6]チェックボックスを選択して)EPSVで動作して:PASVモードでは

、私はログがあり、FTPサーバーに接続できません

from ftplib import FTP 
contents = [] 
ftp = FTP(host=xxx, timeout=3000) 
ftp.login(user=xxx, passwd=xxx) 
ftp.set_debuglevel(2) 
ftp.retrlines("NLST", contents.append) 
ftp.quit() 
ftplibのパイソンを介してテスト

ログ、次のように:

*cmd* 'TYPE A' 
*put* 'TYPE A\r\n' 
*get* '200 Switching to ASCII mode.\n' 
*resp* '200 Switching to ASCII mode.' 
*cmd* 'PASV' 
*put* 'PASV\r\n' 
*get* '227 Entering Passive Mode (0,0,0,0,50,245).\n' 
*resp* '227 Entering Passive Mode (0,0,0,0,50,245).' 
ConnectionRefusedError: [Errno 111] Connection refused 
+0

本当に 'PASV'レスポンスで' 0,0,0,0'を返しますか? –

+0

マーティンありがとう! ftplibのログに示されているように、PASVモードが適用されている間は(0、0、0、0、..)を返します。 – codefluxer

+0

次に、 'pasv_address'にIPv6アドレスを指定したと思います。 'PASV'が動作するためにはIPv4アドレスでなければなりません。 'PASV'はIPv6をサポートしていません。 –

答えて

2

それは私にはvsftpdのバグのように見えます。

公開pasv_addressが設定されていてもサーバーに(ローカル)IPv6アドレスがある場合は、常に0,0,0,0が送信されます。

postlogin.c

handle_pasv

int is_ipv6 = vsf_sysutil_sockaddr_is_ipv6(p_sess->p_local_addr); 

... 

if (tunable_pasv_address != 0) 
{ 
    vsf_sysutil_sockaddr_alloc_ipv4(&s_p_sockaddr); 
    /* Report passive address as specified in configuration */ 
    if (vsf_sysutil_inet_aton(tunable_pasv_address, s_p_sockaddr) == 0) 
    { 
    die("invalid pasv_address"); 
    } 
} 
else 
{ 
    vsf_sysutil_sockaddr_clone(&s_p_sockaddr, p_sess->p_local_addr); 
} 
str_alloc_text(&s_pasv_res_str, "Entering Passive Mode ("); 
if (!is_ipv6) 
{ 
    str_append_text(&s_pasv_res_str, vsf_sysutil_inet_ntop(s_p_sockaddr)); 
} 
else 
{ 
    const void* p_v4addr = vsf_sysutil_sockaddr_ipv6_v4(s_p_sockaddr); 
    if (p_v4addr) 
    { 
    str_append_text(&s_pasv_res_str, vsf_sysutil_inet_ntoa(p_v4addr)); 
    } 
    else 
    { 
    str_append_text(&s_pasv_res_str, "0,0,0,0"); 
    } 
} 

vsf_sysutil_sockaddr_ipv6_v4 0を返し、s_p_sockaddrpasv_addressが設定されている場合、それは、ある決して何か、IPv6のではない場合。

sysutil.c

const void* 
vsf_sysutil_sockaddr_ipv6_v4(const struct vsf_sysutil_sockaddr* p_addr) 
{ 
    static unsigned char pattern[12] = 
     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF }; 
    const unsigned char* p_addr_start; 
    if (p_addr->u.u_sockaddr.sa_family != AF_INET6) 
    { 
    return 0; 
    } 
    if (vsf_sysutil_memcmp(pattern, &p_addr->u.u_sockaddr_in6.sin6_addr, 12)) 
    { 
    return 0; 
    } 
    p_addr_start = (const unsigned char*)&p_addr->u.u_sockaddr_in6.sin6_addr; 
    return &p_addr_start[12]; 
} 

私見では、コードが間違っています。 IPアドレスがp_sess->p_local_addrから "自動検出"されているが、アドレスがpasv_addressのアドレスが使用されているときに失敗したときに動作します(意味があります)。

これはvsftpdの作者に報告することを検討してください。


私が見る唯一の解決策は、EC2で可能であれば、プライベートIPv6アドレスを削除することです。

他のFTPサーバーを使用してください。 ProFTPD

PASVEPSVの元説明維持

PASV戻り応じてIPアドレス:ちょうどPASVEPSVの違いを説明するために

を。その情報は99.9%冗長です。また、サーバーが外部IPアドレスを認識していない場合、一般的に問題が発生します。

EPSVは、応答のIPアドレスの存在が問題であることが明らかなときに、PASVより後で導入されました。したがって、EPSVでは、ポート番号だけが含まれています。クライアントは暗黙的にFTPサーバーのIPアドレスに接続します。

PASVを使用すると、サーバーが実際にPASVコマンドの応答で0,0,0,0を返した場合、クライアントがサーバーに接続できない理由がわかります。

+0

大きな説明、感謝! EC2のプライベートIPv6アドレスについては何もできません。変更して別のFTPサーバーを試してみる必要があります。 – codefluxer

+0

思い出してくれてありがとう、それを受け入れてください。 – codefluxer

関連する問題