Openssl

Proftpd tls 內部連接有效,外部連接失敗

  • March 3, 2016

我正在嘗試保護我的 proftpd 伺服器,但我看不到我做錯了什麼。

我的 tls.conf

<IfModule mod_tls.c>
   TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             TLSv1
TLSCipherSuite AES128+EECDH:AES128+EDH
TLSOptions                 NoCertRequest AllowClientRenegotiations

TLSRSACertificateFile                   /etc/ssl/certs/mailserver.pem
TLSRSACertificateKeyFile                /etc/ssl/private/mailserver.pem
TLSCACertificateFile                     /etc/apache2/ssl.crt/1_root_bundle.crt
TLSVerifyClient                         off
TLSRequired                             on
RequireValidShell                       no
TLSRenegotiate                          none
</IfModule>

我對 https 連接使用相同的證書文件,並且一切正常。當我這樣做時:

openssl s_client -connect 127.0.0.1:21 -starttls ftp

我得到了一個執行良好的 ssl 連接。但是,當我對外部 IP 地址執行相同操作時,我會收到以下消息:

已連接(00000003)140567084144296:錯誤:140770FC:SSL 常式:SSL23_GET_SERVER_HELLO:未知協議:s23_clnt.c:774:

沒有可用的對等證書

未發送客戶端證書 CA 名稱

SSL 握手已讀取 91 個字節並寫入 300 個字節

新,(NONE),密碼是 (NONE) 不支持安全重新協商 壓縮:NONE 擴展:NONE

當我進行外部連接時,TLS 日誌中沒有消息,而 proftpd.log 中只有以下消息:

3 月 2 日 13:22:38 domain.tld proftpd

$$ 31274 $$域.tld(域.tld$$ ip.addr.es.s $$): FTP 會話打開。 3 月 2 日 13:22:38 domain.tld proftpd

$$ 31274 $$域.tld(域.tld$$ ip.addr.es.s $$): FTP 會話關閉。

我檢查了防火牆,但這不應該是問題

有人知道我能做些什麼來讓它工作嗎?

編輯

我的 proftpd.conf

Include /etc/proftpd/modules.conf
UseIPv6                         on
IdentLookups off
ServerName                      "Debian"
ServerType                      standalone
DeferWelcome off
MultilineRFC2228                on
DefaultServer on
ShowSymlinks on
TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200
DisplayLogin                    welcome.msg
DisplayChdir .message true
ListOptions "-l"
DenyFilter                      \*.*/
Port 0
<IfModule mod_dynmasq.c>
</IfModule>
MaxInstances                    30
User                            proftpd
Group                           nogroup
Umask 022 022
AllowOverwrite                  on
TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log
<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>
<IfModule mod_ratio.c>
Ratios off
</IfModule>
<IfModule mod_delay.c>
DelayEngine on
</IfModule>
<IfModule mod_ctrls.c>
ControlsEngine        off
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>
<IfModule mod_ctrls_admin.c>
AdminControlsEngine off
</IfModule>
Include /etc/proftpd/tls.conf
Include /etc/proftpd/conf.d/
<Global>
DefaultRoot ~
RootLogin off
</Global>
DefaultRoot ~
ServerIdent on "FTP Server ready."
DefaultAddress domain.tld

我的虛擬主機,它們是由 virtualmin 自動寫入 tls.conf

<VirtualHost ftp.domain1.tld>
Group domain1
User domain1
DefaultRoot ~
</VirtualHost>
<VirtualHost ftp.domain1.tld>
ServerName "domain1.tld"
<Anonymous /home/domain1/ftp>
User domain1
Group domain1
UserAlias anonymous ftp
<Limit WRITE>
DenyAll
</Limit>
ExtendedLog /home/domain1/logs/ftp.log
</Anonymous>
</VirtualHost>
<VirtualHost 1.2.3.4>
ServerName ftp.domain2.tld
<Anonymous /home/domain2/ftp>
User domain2
Group domain2
UserAlias anonymous ftp
<Limit WRITE>
DenyAll
</Limit>
RequireValidShell off
ExtendedLog /home/domain2/logs/ftp.log
<Directory />
AllowOverwrite on
</Directory>
</Anonymous>
</VirtualHost>

當然,我用假的替換了我的域和 IP 地址

看起來您的tls.conf配置指令僅適用於預設的“伺服器配置”虛擬主機,而不適用於伺服器中的所有虛擬主機。與 Apache 不同,ProFTPD 配置指令,在一個<VirtualHost>部分之外,不是全域應用的。因此,您需要mod_tls通過使用一個<Global>部分來明確地使這些配置成為全域,

<IfModule mod_tls.c>
 # Apply these configurations globally, to all vhosts
 <Global>
   TLSEngine on
   TLSLog /var/log/proftpd/tls.log
   TLSProtocol TLSv1
   TLSCipherSuite AES128+EECDH:AES128+EDH
   TLSOptions NoCertRequest AllowClientRenegotiations

   TLSRSACertificateFile /etc/ssl/certs/mailserver.pem
   TLSRSACertificateKeyFile /etc/ssl/private/mailserver.pem
   TLSCACertificateFile /etc/apache2/ssl.crt/1_root_bundle.crt
   TLSVerifyClient off
   TLSRequired on

   # Note: This particular directive is not specific to mod_tls;
   # I'm not sure why it's here, versus elsewhere.
   RequireValidShell no

   TLSRenegotiate none
 </Global>
</IfModule>

ProFTPD 的Vhost howto中更詳細地介紹了此行為。

希望這可以幫助!

引用自:https://serverfault.com/questions/760981