[环境]:

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. 解决pathForResource返回nil, 无法读取plist文件问题

    有很多人在设置plist文件的时候, 会发现读取不了plist文件里面的内容, 返回值为nil, 下面我们来解决一下这个问题. 首先我们打开工程并且按照下面的步骤来设置: 设置好后, 我们来写一段代码 ...

  2. LeetCode 824 Goat Latin 解题报告

    题目要求 A sentence S is given, composed of words separated by spaces. Each word consists of lowercase a ...

  3. Java之旅_高级教程_网络编程

    摘自:http://www.runoob.com/java/java-networking.html JAVA网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. j ...

  4. 20165225《Java程序设计》第四周学习总结

    20165225<Java程序设计>第四周学习总结 1.视频与课本中的学习: 继承(extends) 重写 对象的上转型对象 super final instanceof运算符 abstr ...

  5. 洛谷P4198 楼房重建 单调栈+线段树

    正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...

  6. 三、Spring Boot 日志

    1.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...

  7. 【JMeter】基础元件

    测试计划(Test Plan) 它用来描述一个测试方案,包含与本次性能测试所有相关的功能.也就说本次测试的所有内容是于基于一个计划的. “函数测试模式”复选框,如果被选择,它会使Jmeter记录来自服 ...

  8. 【JMeter】前置处理器

     BeanShell PreProcessor  使用BeanShell在请求进行之前进行操作.语法使用与BeanShell Sampler是一样的.但可使用的内置变量稍有不同    JDBC Pre ...

  9. 【托业】【新托业TOEIC新题型真题】学习笔记3-题库二->P5-6

    --------------------------------------单词-------------------------------------- oppose vt. 反对:对抗,抗争 v ...

  10. 如何注册Navicat for MySQL软件

    https://jingyan.baidu.com/article/6181c3e061ca18152ef153b6.html 给力的经验 在注册界面里面输入信息 名:随便输入 组织:随便输入 注册码 ...