[环境]:

linux主机:华为企业云

ftp服务端:vsftpd

客户端:ftp命令行工具,安卓端ES文件浏览器

[现象]:

在ES文件浏览器中,使用被动方式没法连接,使用主动方式可以连接,但是没法列出文件(图形界面的工具有一些细节没法看到,反正就是不正常)。

使用ftp的命令行连接时也不正常,主动方式时:ls命令提示 Failed to establish connection。被动方式时:ls命令执行后卡在 Entering Passive Mode,最后提示Connnection timed out。

[解决]:

1. 尝试在server端执行ftp命令,发现能正常使用。考虑到是vsftp的配置问题,通过查看手册,将pasv_enable 和 port_enable 都设置为YES,重试,问题依旧。

2. 查看file transfer protocol 的wiki,重新梳理了一下主动方式和被动方式的区别。感觉问题出在防火墙或者nat上。

3. 发现在华为企业云的管理控制台中,有个安全组的设置,里面可以控制出站和入站流量。

4. 分析,因为我用的client大部分都是在nat里边的,所以主动方式不可取,因为就算我告诉了server我client的端口号,由于我在nat里,server还是无法与我建立连接。

so,应该选择被动方式。但是我怎么知道server端会监听哪个端口呢?允许所有端口的入站流量肯定不可取。vsftpd配置文件中提供了 pasv_max_port 和 pasv_min_port 这两个配置命令。然后,用这两个配置命令限制一下端口的范围,然后在华为企业云的管理控制台中配置一下这些端口的入站规则。

5. client尝试使用passive的方式连接server,成功。

[进一步验证]

1. 在华为企业云的管理控制台中关闭之前开启的用于数据连接的端口入站规则。

2. 使用telnet连接server的21端口,输入user 和 pass命令登录。

3. 发送port命令,发现然后就卡住了,(这个可能是两个原因,nat或者我没监听我用port命令发送的端口。不过我猜测还是nat的原因)

4. 关闭后重新进行第1步和第2步。

5. 发送pasv命令,服务端返回一个六元组,重新开启一个终端(假设叫做终端2),在终端2中使用telnet登录 server,端口为六元组中的端口。

6. 连接建立不了,因为我们在第1步中拒绝了这个端口的入站流量。

7. 在华为企业云的管理控制台中打开用于数据连接的端口入站规则。

8. 重复第2步和第5步,发现数据连接能成功建立。

9. 在控制连接的终端上发送LIST命令,发现在终端2中,server端返回了LIST命令的执行结果。

10. 通过验证,可以知道之前出现的问题源自server端不让数据连接的流量入站。

[总结]

现在复习一下主动方式(active)和被动方式(passive)的区别:

先要知道,ftp协议分为控制连接和数据连接,对于控制连接的建立,这两种方式是一致的,client用本机的某个端口,连接server的21端口(ftp server端的默认端口,该端口在server端可修改)。

对于数据连接:

在active方式中,client通过控制连接发送 PORT M 命令,其中,M是端口号。表示client监听了M端口,由server主动与该端口建立数据连接。

在passive方式中,client通过控制连接发送 PASV 命令,server端收到该命令之后,会返回一个六元组,类似(192,168,1,1,4,20)。表示了服务端的ip和监听端口号,ip地址由前四个数确定,在本例中,端口号=4*256+20。感觉该六元组中的ip应该会被 client忽略,client与server建立数据连接使用的是控制连接中server的ip和六元组中的端口号。

记无法用被动方式登录远程linux主机的原因的更多相关文章

  1. ssh-keygen+ssh-copy-id无密码登录远程LINUX主机(转载)

    From:http://blog.163.com/lgh_2002/blog/static/44017526201011333227161/ 1.创建公钥和私钥 ligh@local-host$ ss ...

  2. ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机

    ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机 使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linu ...

  3. linux_ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机

    使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机. ssh-keygen 创建公钥和密钥. ssh-copy-id 把本地主 ...

  4. ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机【OK】

    ssky-keygen + ssh-copy-id 无密码登陆远程LINUX主机[OK]     使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能 ...

  5. SSH服务搭建、账号密码登录远程Linux虚拟机、基于密钥的安全验证(Windows_Xshell,Linux)

    问题1:如果是两台虚拟机ping不同且其中一个虚拟机是克隆的另一个,需要更改一下MAC地址,关机状态下 一> "编辑虚拟机设置" 一>" 网络适配器" ...

  6. Xming + PuTTY 在Windows下远程Linux主机

    Xming + PuTTY 在Windows下远程Linux主机 一.原理     Linux/Unix的X Window具有网络透明性.X Window系统里有一个统一的Server来负责各个程序与 ...

  7. Nagios学习笔记四:基于NRPE监控远程Linux主机

    1.NRPE简介 Nagios监控远程主机的方法有多种,其方式包括SNMP.NRPE.SSH和NCSA等.这里介绍其通过NRPE监控远程Linux主机的方式. NRPE(Nagios Remote P ...

  8. Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序

    自:http://blog.csdn.net/neofung/article/details/6574002 Ubuntu上安装和使用SSH  网上有很多介绍在Ubuntu下开启SSH服务的文章,但大 ...

  9. 通过SecureCRT向远程Linux主机上传和下载文件

    有时候直接在Linux服务器上通过 wget 或 curl 工具下截比较大的网络文件时会比较慢,这时我们通常会改用在Windows平台通过迅雷等更加现代化的下载功具下好目标文件(迅雷开会员才能更高速的 ...

随机推荐

  1. VS在解决方案中添加一个别人给的项目,我自己的项目主窗体中不能调用

    提示缺少Using引用,我在主窗体中已经写了Using XX,还是提示“未能找到类型或命名空间名“ XX”(是否缺少Using指令或程序集引用?)”,以前只要Using 一下就好了,后来想了一下,要在 ...

  2. Xcode工程编译错误:“Cannot assign to 'self' outside of a method in the init family”

    #import <Foundation/Foundation.h> @interface EOCRectangle : NSObject<NSCoding> @property ...

  3. iOS 修改TabBar的item间距

    @interface HPTabBarController ()<UITabBarControllerDelegate>//继承自UITabBarController @property ...

  4. 转:el表达式获取map对象的内容 & js中使用el表达式 & js 中使用jstl 实现 session.removeattribute

    原文链接: ①EL表达式取Map,List值的总结 ②在jsp中使用el表达式通过键获得后台的一个map<Long,String>的值 ③在javascript中使用el表达式(有图有真相 ...

  5. day1_接口测试基础

    一.什么是接口: 接口:一般分为两种,程序内部接口和程序对外接口 系统对外接口:系统与外部沟通,比如我们平时用的app,网站进行数据处理的时候都是通过接口调用后端服务器的数据. 程序内部接口:程序内部 ...

  6. python_flask 注册,登陆,退出思路 ---纯个人观点

    1注册逻辑首先查询数据库用户名 并判断用户是否存在,如不存在就插入数据 并返回响应给前端2前端模板获取注册信息 判断 用户名不能为空及密码不能为空,和密码不一致 拼接注册url 组成get获取对象 响 ...

  7. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  8. 去除字符串中的html代码

    public static String Html2Text(String inputString) { String htmlStr = inputString; // 含html标签的字符串 St ...

  9. Entity Framework学习 - 5.DB First执行时提示model没有key

    原因:自动生成的类中有关联主键,没有自动生成Key及Column 解决方法:在xxx.tt的66行左右修改为 var simpleProperties = typeMapper.GetSimplePr ...

  10. chrome版本与对应的谷歌驱动(chromedriver)

    chrome版本与对应的谷歌驱动(chromedriver) 1.下载chromedriver:http://chromedriver.storage.googleapis.com/index.htm ...