Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

以后会考虑支持ftp协议么? #219

Closed
jacobzeng opened this issue Jan 10, 2017 · 19 comments
Closed

以后会考虑支持ftp协议么? #219

jacobzeng opened this issue Jan 10, 2017 · 19 comments

Comments

@jacobzeng
Copy link

感谢提供这么好的工具,以后会考虑支持ftp协议么?

@wxyzh
Copy link

wxyzh commented Jan 10, 2017

ftp协议有点麻烦,因为FTP需要至少两个端口,需要在服务器上做一些设置。
以被动模式为例:

FTP客户端 打开两个非特权端口A和B
FTP服务端打开21端口和一个非特权端口C
客户端端口A连接服务器的21端口。
客户端的端口B,连接服务端的端口C

你要做的是,在frp服务端设置并转发一批端口出去用于数据传输

@jacobzeng
Copy link
Author

你说的这个我尝试过用tcp的方式来弄,无论是被动还是主动,然后可以连接上,但是无法得到数据,所以我感觉还是有些地方是不是要特殊处理

@fatedier
Copy link
Owner

都是直接用 scp,很久没用 ftp 了,我找时间测试下。

@wxyzh
Copy link

wxyzh commented Jan 10, 2017 via email

@jacobzeng
Copy link
Author

proxy server和host server完全映射相同端口我也试过,关掉ftp的对来源ip的限制等也尝试过,最终没成功,后来只有换成sftp。

@fatedier
Copy link
Owner

fatedier commented Jan 11, 2017

我研究了下,发现了问题是这样的:

FTP客户端 打开两个非特权端口A和B
FTP服务端打开21端口和一个非特权端口C
客户端端口A连接服务器的21端口。
客户端的端口B,连接服务端的端口C

@wxyzh 说的这个流程中,非特权端口 C 很关键。FTP 服务端会打开一个特权端口 C 并将这个端口告知 FTP 客户端,FTP 客户端需要连接服务端的端口 C。

但是经过 frps 中转后,frps 所在服务器并没有监听端口 C,也就是 FTP 客户端连不到真实的 FTP 服务端的端口 C。

端口 C 是随机的, 但是查了下应该可以指定被动模式使用的端口 C 的范围,比如 5000 - 5005,然后在 frps 和 FTP 服务端将这几个端口之间一一对应起来,这样可能可以。总的来说,对于 ftp 并不能很好的支持,如果有其他可选方案,还是换其他的比较好,或者采用 VPN 这样的工具。

@fatedier fatedier removed the question label Jan 11, 2017
@wxyzh
Copy link

wxyzh commented Jan 12, 2017

端口 C 是随机的, 但是查了下应该可以指定被动模式使用的端口 C 的范围,比如 5000 - 5005,然后在 frps 和 FTP 服务端将这几个端口之间一一对应起来,这样可能可以。总的来说,对于 ftp 并不能很好的支持,如果有其他可选方案,还是换其他的比较好,或者采用 VPN 这样的工具。

@fatedier 可能会比较复杂,我测试过了,在服务器端指定数据端口C的范围,比如5000-5005 然后frps也去对应5000-5005。在测试过程中又出现了另外一个问题:ftpd需要判断客户端的来源(客户端是来自lan还是来自frps?)来自lan的连接需要使用ftpd的lan ip,来自frps的连接需要使用frps 的ip。

@jacobzeng 使用代理ftp需要解决的问题是

  • ftpd使用被动模式,并且能指定数据端口的范围
  • ftpd要能够自动判断或指定被动模式使用的ip
    • 如果可以指定被动模式使用的ip,那么可以让lan内的连接也使用frps
    • 如果可以自动判断地址,那么lan内可以直接连接,lan外可以使用frps,这样比较玩美
    • 如果无法指定或判断使用的ip,就不能使用frps

@fatedier #154

@fatedier
Copy link
Owner

考虑各种应用层的协议会变的非常复杂,不打算在 frp 中支持,重点还是 tcp 和 http。

@icanoncn
Copy link

icanoncn commented Mar 1, 2018

特意注册了个账号,感谢作者的无私奉献。

最近成功实现了 vsftpd 的内网穿透。
虽然不专业,但我还是简单写一下过程吧,希望能帮到正在看这篇文章的朋友。
如有错误,还请谅解。

我一台 OpenWrt / LEDE 路由器,运行 vsftpd,作为二级路由。
主路由上没做任何端口转发。

我想从外网访问二级路由上的 FTP 服务。
有一台,VPS ,公网 IP,Debian 9 系统,可以用来转发数据。

1.vsftpd 的设置。
listen_port=10000
pasv_enable=YES
pasv_max_port=10003
pasv_min_port=10001
pasv_address=VPS公网IP

这一步似乎是关键。
我用的是被动模式,之前 Filezilla 出现过 “读取目录列表失败”的错误。是因为 FTP 被动模式 会产生随机端口,而这些随机端口无法让 frp 知道。所以需要 通过 'pasv_max_port' 和 'pasv_min_port' 设置随机端口的范围,把范围内的端口填到 frpc.ini 里。
P.S. 'pasv_max_port' 一定要比 'pasv_min_port' 大,否则无法生效,也没有错误提示,我就是因为眼花填错了,折腾了好久……

也出现过“服务器发回了不可路由的地址”,是因为 vsftp 被动模式返回的是二级路由 WAN 口的网址,192.168.1.1。所以需要 pasv_address 设置成 VPS 的公网 IP。

2.frps.ini 的设置。
设置了 bind_port,privilege_token。

3.frpc.ini 的设置。
设置好 bind_port,privilege_token,与 frps.ini 相同。
打开 10000,10001,10002,10003 端口。

4.VPS 的设置。
iptables 打开 10000,10001,10002,10003 端口,和 bind_port 端口。

@CharellKing
Copy link

@icanoncn , 我按照你的方式,用filezilla 传数据或者下载数据还是不行, 下面是我的连接信息,虽然也能传,但是中间很慢,还没有sftp快,同时经常被“服务器发回了不可路由的地址。使用服务器地址代替。”
状态: 尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败。
错误: 无法连接到服务器
状态: 正在等待重试...
错误: 尝试连接被用户终止
命令: RETR gltf-viewer-win32-ia32.zip
响应: 150 Opening BINARY mode data connection for gltf-viewer-win32-ia32.zip (57669819 bytes).
错误: 传输了 530,492 字节 (用时242 秒)后用户中止了文件传输
状态: 连接被服务器关闭
状态: 正在连接 [公网ip]:10000...
状态: 连接建立,等待欢迎消息...
响应: 220 (vsFTPd 3.0.3)
命令: AUTH TLS
响应: 530 Please login with USER and PASS.
命令: AUTH SSL
响应: 530 Please login with USER and PASS.
状态: 不安全的服务器,不支持 FTP over TLS。
命令: USER vic
响应: 331 Please specify the password.
命令: PASS *****
响应: 230 Login successful.
状态: 服务器不支持非 ASCII 字符。
状态: 已登录
状态: 读取目录列表...
状态: 列出“/”的目录成功
状态: 已从服务器断开
状态: 正在连接 [公网ip]:10000...
状态: 连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
状态: 服务器不支持非 ASCII 字符。
状态: 已登录
状态: 读取目录列表...
状态: 列出“/”的目录成功
状态: 已从服务器断开
状态: 正在连接 [公网ip]:10000...
状态: 连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
状态: 服务器不支持非 ASCII 字符。
状态: 已登录
状态: 读取目录列表...
状态: 服务器发回了不可路由的地址。被动模式失败。
命令: PORT 172,17,39,156,217,87
响应: 500 Illegal PORT command.
错误: 读取目录列表失败
状态: 已从服务器断开
状态: 正在连接 [公网ip]:10000...
状态: 连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
状态: 服务器不支持非 ASCII 字符。
状态: 已登录
状态: 读取目录列表...
状态: 列出“/”的目录成功
状态: 读取“/Software/Driver”的目录列表...
状态: 服务器发回了不可路由的地址。使用服务器地址代替。
状态: 列出“/Software/Driver”的目录成功
状态: 读取“/Software”的目录列表...
状态: 列出“/Software”的目录成功
状态: 读取“/Software/windows”的目录列表...
状态: 服务器发回了不可路由的地址。使用服务器地址代替。
状态: 列出“/Software/windows”的目录成功
状态: 正在连接 [公网ip]:10000...
状态: 连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
状态: 服务器不支持非 ASCII 字符。
状态: 已登录
状态: 开始下载 /Software/windows/clay-viewer-0.2.1-win.zip
状态: 服务器发回了不可路由的地址。使用服务器地址代替。

@icanoncn
Copy link

@CharellKing “PORT 172,17,39,156,217,87”看这个好像是 vsftp 某些配置没有生效吧,返回的
IP 是 172.17.39.156,端口 217*256+87=55639(好像是这么算的,记不清了),是内网 IP 和随机端口。但却可以传输,不知道为何。传输的时候 在 服务器端 netstat -tunap 看一下服务器打开的端口,是否跟设置的一样吧。

@sirius4gnu
Copy link

ftp只使用了tcp协议,frp是完全可以支持的,icanoncn的方法是正确的,我这边测试通过.
注意点:ftp需要使用被动模式,主动模式下ftp服务器需要穿透出本地内网,再穿透入客户端内网,成功率很低.
pasv_enable=YES
pasv_min_port=10001
pasv_max_port=10003
pasv_address=VPS公网IP

@shellus
Copy link

shellus commented Oct 8, 2018

我使用 FileZilla Server 成功了。
主要设置点在于
1、使用固定的被动模式端口
2、使用frp映射被动模式端口,本地和远程端口号需要对应
3、设置被动模式服务器地址(use the following IP)为frp服务器外网地址(可以是域名)
4、关闭安全设置里面的来源IP检查(disable IP check)

就可以了

@snowdream
Copy link

希望frp官方支持ftp协议。
我现在链接ftp,可以连接成功,但是无法列出目录。

@fatedier
Copy link
Owner

@snowdream 不会支持 FTP 这一陈旧且不安全的协议,请寻找其他支持的软件或替代协议。

@blankhang
Copy link

blankhang commented Jul 25, 2019

我参照@icanoncn @shellus
用 FileZilla Server 也成功了。
主要设置点在于
1、使用固定的被动模式端口
2、使用frp映射被动模式端口,本地和远程端口号需要对应
3、设置被动模式服务器地址(use the following IP)为frp服务器外网地址(可以是域名)
4、关闭安全设置里面的来源IP检查(disable IP check)

@snowdream
Copy link

我参照@icanoncn @shellus
用 FileZilla Server 也成功了。
主要设置点在于
1、使用固定的被动模式端口
2、使用frp映射被动模式端口,本地和远程端口号需要对应
3、设置被动模式服务器地址(use the following IP)为frp服务器外网地址(可以是域名)
4、关闭安全设置里面的来源IP检查(disable IP check)

建议走sftp,和ssh共用默认端口22.

@shellus
Copy link

shellus commented Jul 25, 2019

@snowdream 主要是某些客户端不支持啊,例如ios上的oplayer,只支持ftp,没办法

@zhaoxf4
Copy link

zhaoxf4 commented Apr 16, 2021

@snowdream 主要是某些客户端不支持啊,例如ios上的oplayer,只支持ftp,没办法

不是还有webdev和http么,非把自己捆在ftp上干嘛

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

10 participants