更新- 解决问题的总结:修复路由器上输入错误的端口后,我收到错误“450 TLS 数据连接会话未恢复或会话与控制连接不匹配” - 这导致我取消勾选服务器设置“使用 PROT P 时要求在数据连接上恢复 TLS 会话”,从而解决了问题。不确定禁用此“功能”对安全性意味着什么。 ------
原始帖子- 我的目标是让 Explicit FTP over TLS 与 Firezilla 服务器协同工作。我已将 Firezilla 和 Windows 防火墙设置为允许相同范围的端口进入。
Firewall Ports: 21, 50000-51000
Firezilla Server: Passive Ports: 50000-51000
我的路由器也将这个范围的端口通过 TCP 转发到正确的 LAN IP。
我的服务器位于 NAT 后面,并且具有静态 IP,该 IP 也列在 Firezilla Server 的被动设置选项卡上。我成功的唯一方法是当客户端位于 NAT 的同一侧,并且仅当直接使用普通 FTP 并且仅处于主动模式时。
我使用 ftptest.net 进行了测试,这是日志
通过 TLS 进行显式 FTP
Status: Resolving address of xxx.x.xxx.xxx
Status: Connecting to xxx.x.xxx.xxx
Warning: The entered address does not resolve to an IPv6 address.
Status: Connected, waiting for welcome message...
Reply: 220-FileZilla Server 0.9.60 beta
Reply: 220 Welcome
Command: CLNT https://ftptest.net on behalf of xxx.x.xxx.xxx
Reply: 200 Don't care
Command: AUTH TLS
Reply: 234 Using authentication type TLS
Status: Performing TLS handshake...
Status: TLS handshake successful, verifying certificate...
Status: Received 1 certificates from server.
Status: cert[0]: subject='CN=xxx.x.xxx.xxx,C=US,ST=My state,L=My city' issuer='CN=xxx.x.xxx.xxx,C=US,ST=My state,L=My city'
Command: USER username
Reply: 331 Password required for username
Command: PASS *************
Reply: 230 Logged on
Command: SYST
Reply: 215 UNIX emulated by FileZilla
Command: FEAT
Reply: 211-Features:
Reply: MDTM
Reply: REST STREAM
Reply: SIZE
Reply: MLST type*;size*;modify*;
Reply: MLSD
Reply: AUTH SSL
Reply: AUTH TLS
Reply: PROT
Reply: PBSZ
Reply: UTF8
Reply: CLNT
Reply: MFMT
Reply: EPSV
Reply: EPRT
Reply: 211 End
Command: PBSZ 0
Reply: 200 PBSZ=0
Command: PROT P
Reply: 200 Protection level set to P
Command: PWD
Reply: 257 "/" is current directory.
Status: Current path is /
Command: TYPE I
Reply: 200 Type set to I
Command: PASV
Reply: 227 Entering Passive Mode (xxx,x,xxx,xxx,196,44)
Command: MLSD
Reply: 425 Can't open data connection for transfer of "/"
Error: Listing failed
允许回退到普通 FTP
Warning: Allowing fallback to plaintext FTP is insecure. You should use explicit FTP over TLS.
Status: Resolving address of xxx.x.xxx.xxx
Status: Connecting to xxx.x.xxx.xxx
Warning: The entered address does not resolve to an IPv6 address.
Status: Connected, waiting for welcome message...
Reply: 220-FileZilla Server 0.9.60 beta
Reply: 220 Welcome
Command: CLNT https://ftptest.net on behalf of xxx.x.xxx.xxx
Reply: 200 Don't care
Command: AUTH TLS
Reply: 234 Using authentication type TLS
Status: Performing TLS handshake...
Status: TLS handshake successful, verifying certificate...
Status: Received 1 certificates from server.
Status: cert[0]: subject='CN=xxx.x.xxx.xxx,C=US,ST=My state,L=My city' issuer='CN=xxx.x.xxx.xxx,C=US,ST=My state,L=My city'
Command: USER username
Reply: 331 Password required for username
Command: PASS *************
Reply: 230 Logged on
Command: SYST
Reply: 215 UNIX emulated by FileZilla
Command: FEAT
Reply: 211-Features:
Reply: MDTM
Reply: REST STREAM
Reply: SIZE
Reply: MLST type*;size*;modify*;
Reply: MLSD
Reply: AUTH SSL
Reply: AUTH TLS
Reply: PROT
Reply: PBSZ
Reply: UTF8
Reply: CLNT
Reply: MFMT
Reply: EPSV
Reply: EPRT
Reply: 211 End
Command: PBSZ 0
Reply: 200 PBSZ=0
Command: PROT P
Reply: 200 Protection level set to P
Command: PWD
Reply: 257 "/" is current directory.
Status: Current path is /
Command: TYPE I
Reply: 200 Type set to I
Command: PASV
Reply: 227 Entering Passive Mode (xxx,x,xxx,xxx,196,107)
Command: MLSD
Reply: 425 Can't open data connection for transfer of "/"
Error: Listing failed
我将非常感激任何帮助我解决这个问题的帮助。提前致谢。
答案1
防火墙和 NAT 设备在 TLS 上进行 FTP 传输时存在双重问题,既存在防火墙问题,又存在 NAT 问题。
FTP 是一种糟糕的协议,需要两个连接:
在被动 FTP 中,最初是到默认端口 TCP 21 的一个控制连接
要真正传输数据(获取目录列表也是一种数据传输),客户端需要第二个 TCP 连接, 这
data
连接。FTP
客户端使用PASV
控制字请求被动 FTP 连接后,FTP 服务器将选择一个“随机可用的临时”非默认端口,并通过响应宣布该端口PORT
。PORT
响应通常包含 6 个八位字节,例如,PORT h1,h2,h3,h4,p1,p2
其中h1.h2.h3.h4
是 FTP 服务器的 IPv4 IP 地址,TCP 端口号是,(p1*256) + p2
即xxx,x,xxx,xxx,196,107
代表端口 (196 * 256) + 107 = 50283在 FTP over TLS 中,客户端和 FTP 服务器之间的连接是加密的。这会导致受防火墙保护且位于 NAT 设备后面的服务器出现问题。
防火墙问题
通常在智能防火墙中,当您允许 FTP 时,您需要打开控制连接的端口 TCP 21,然后,在明文 FTP 协议中,防火墙可以扫描并检测 PORT 响应。然后,FTP 帮助模块将自动打开 FTP 服务器分配给该特定客户端的端口号,从而实现非常精细的访问控制。
当使用 TLS 加密连接时,防火墙无法再检测到 PORT 响应,因此不会自动打开分配的端口。
解决方案是:
- 将 FTP 服务器用于被动连接的端口范围固定到小范围
- 在防火墙中打开端口 21 和固定范围的端口以进行数据连接
NAT 问题
当 FTP 服务器位于执行网络地址转换和端口转发的设备后面时,端口 21 上的控制连接上的流量将从 NAT 设备的(外部)IP 地址转发到 FTP 服务器上的端口 21。
此外,它将运行类似的 NAT FTP 帮助程序模块,该模块在明文 FTP 协议中可以扫描和检测 PORT 响应。
看到PORT
响应后,它通常会进行两项更改:
- 在响应中,FTP 服务器的
PORT h1,h2,h3,h4,p1,p2
IP 地址将被替换为表示客户端连接到的 NAT 服务器的(外部)IP 地址。h1,h2,h3,h4
e1,e2,e3,e4
e1.e2.e3.e4
- 为该客户端制定动态端口转发规则,将定义的端口
p1,p2
从 NAT 设备转发到 FTP 服务器。
当 FTP 连接使用 TLS 加密时,NAT 设备无法检测到 PORT 响应,因此 NAT 设备既不能重写 ip 地址,也不能自动创建所需的端口转发规则。
此类 NAT 问题的典型解决方案是:
- 重新配置 FTP 服务器,以便它在响应中
h1.h2.h3.h4
使用e1.e2.e3.e4
NAT 设备的外部 IP 地址,而不是它自己的 IP 地址。PORT
- 将 FTP 服务器用于被动连接的端口范围固定到小范围
- 除了 TCP 端口 21 之外,还要为您在 FTP 服务器中配置的被动端口范围中的每个端口创建明确的端口转发(NAT)规则到 FTP 服务器上的相应端口,即
e1.e2.e3.e4 port 50000 --> h1.h2.h3.h4 port 50000
,,
e1.e2.e3.e4 port 50001 --> h1.h2.h3.h4 port 50001
等等
e1.e2.e3.e4 port 50002 --> h1.h2.h3.h4 port 50002
。...
别忽视,除了 FTP 服务器上基于主机的防火墙之外,可能还涉及其他防火墙或安全组。例如,除了端口转发规则之外,您可能还需要在 NAT 设备中创建防火墙规则。