[环境]:

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. Sleep 等待连接攻击

    Sleep The thread is waiting for the client to send a new statement to it. https://dev.mysql.com/doc/ ...

  2. ldap,openldap-docker,

    ldap basic and usage in devops: https://blog.csdn.net/weixin_42578481/article/details/80863890 maybe ...

  3. 一种比较简单的实现ping的方式

    <span style="font-family: Arial, Helvetica, sans-serif;">头文件</span> <span s ...

  4. 玩具装箱&土地购买

    今天一天8h 写了两道斜率优化的题(别问我效率为什么这么低 代码bug太多了) 关键是思考的不周全 估计是写的题少手生 以后就会熟练起来了吧. 这道题显然有一个n^2的dp方程 设f[i]表示前i件物 ...

  5. c++ 如何获取多线程的返回值?(std::thread ,std::async)

    //简单的 c++11 线程,简单方便,成员函数随便调用,非成员函数也一样,如需要获取返回时,请自行使用条件变量 std::thread run([&](){ //执行一些耗时的操作 retu ...

  6. 部署 tomcat

    解压 root@mysql soft]# ll 总用量 -rw-r--r--. root root 11月 : apache-tomcat-.tar.gz -rw-r--r--. root root ...

  7. 别让Open Sans字体拖慢wordpress后台速度

    最近打开wordpress后台是不是很慢?国内GG登不上了?这两者有没什么直接的联系?没错,WordPress后台是自动加载的谷歌Open Sans字体,据说gg服务器已经迁移到阿嘛丽可,需要一些小手 ...

  8. 在linux下一般用scp这个命令来通过ssh传输文件

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地 ...

  9. what's the python之可迭代对象、迭代器与生成器(附面试题)

    可迭代对象 字符串.列表.元祖.集合.字典都是可迭代的,数字是不可迭代的.(可以用for循环遍历取出内部元素的就是可迭代的) 如何查看一个变量是否为可迭代: from collections impo ...

  10. 0703-spring cloud config-git配置属性加解密之对称加密

    一.概述 可以使用{cipher} *格式的加密值,只要有一个有效的密钥,那么它们将在主应用程序上下文获取环境之前被解密.要在应用程序中使用加密功能,您需要在您的类路径中包含Spring Securi ...