我在配置 vsftpd 时遇到了问题。我设法让主动 FTPS 正常工作,但被动 FTPS 却很顽固。我认为问题在于 iptables 如何管理端口。当我尝试在 filezilla 上使用被动 ftps 时,一切都连接正常,但目录列表失败EHOSTUNREACH
。以下是客户端和服务器之间设置被动模式的交换
Command: PASV
Response: 227 Entering Passive Mode (192,168,0,10,169,39).
Command: LIST
Error: The data connection could not be established: EHOSTUNREACH - No route to host
以下是我的相关部分vsftpd.conf
:
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
以下是输出iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere ctstate NEW tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp ctstate NEW,ESTABLISHED /* Allow ftp connections on port 21 */
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data ctstate RELATED,ESTABLISHED /* Allow ftp connections on port 20 */
ACCEPT tcp -- anywhere anywhere tcp spts:safetynetp:50000 dpts:safetynetp:50000 ctstate ESTABLISHED /* Allow passive ftp inbound connections */
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp ctstate NEW,ESTABLISHED /* Allow ftp connections on port 21 */
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data ctstate ESTABLISHED /* Allow ftp connections on port 20 */
ACCEPT tcp -- anywhere anywhere tcp spts:safetynetp:50000 dpts:safetynetp:50000 ctstate RELATED,ESTABLISHED /* Allow passive ftp inbound connections */
这是我用来设置输出规则的命令。输入规则非常相似,但如果需要,我可以提供它。
iptables -A OUTPUT -p tcp -m tcp --sport 40000:50000 --dport 40000:50000 -m conntrack -- ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive ftp inbound connections"
我在网上找不到有关safetynetp
被动 iptables 规则的任何信息,我认为问题在于这与我设置的端口范围(40,000-50,000)相冲突,因为它看起来只是接受端口 50,000。
我不知道 iptables 可能根本不是问题。如果需要更多信息,我肯定会提供。
编辑:
以下是客户端的 iptables 规则:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
您要连接的 FTP 服务器是否位于 NAT 路由器的另一端?我看到您的 IP 中有 192.168。因此涉及一个私有网络。您的 iptables 设置非常开放,因此我认为这不是问题所在(尽管您可以尝试刷新表格并查看是否有任何不同)。
被动 FTP 要求 FTP 服务器与 FTP 客户端建立新的连接(请参阅此处了解有关被动 FTP 的更详细描述),因此这个新的返回连接很可能无法通过 NAT 路由器返回。我认为 IPTables 有一个 FTP 模块可以处理这个问题,但如果涉及 NAT,我只会使用主动 FTP(或者如其他评论所说 - 如果可能的话,使用其他东西)。
您显示的 IPTables 是您的 FTP 客户端,而不是某种路由器,对吗?
答案2
我曾遇到过这样的问题:FTP 服务器给出 NAT 地址,而 FTP 服务器的公共地址才是应该配置的地址。这会导致被动连接出现问题,因为客户端需要不同的地址。在这种情况下,初始连接通常可以正常工作,但被动模式不起作用。
看看您的 vsftpd 配置,或者随意分享。