Proftpd tls 內部連接有效,外部連接失敗
我正在嘗試保護我的 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中更詳細地介紹了此行為。
希望這可以幫助!