阿里云主机 EIP 致使 FTP 无法连接

👌 2021-05-19 阿里云主机 EIP 致使 FTP 无法连接

上午收到了个协助工单,期间交手了两位同事都没解决掉的 ftp 奇特现象,就转到我这边了。 文中涉及到的相关 公网 IP 地址均特殊化处理

[TOC]

现象

Linux 使用自带 ftp 命令或者 Windows 使用资源管理器访问阿里云主机搭建的 ftp 服务,无论是主动模式还是被动模式均只能建立命令端口「21 端口」连接,无法创建数据端口连接,导致只能登录用户而不能展现文件夹以及上传下载数据。现场 21 端口使用 2100 替代。

  • 表现 1

使用主动模式或者被动模式均无法显示目录信息

  • 表现 2

使用 lftp 客户端或者 Windows 下的 WinSCP 软件可 正常使用 此云主机的 ftp 服务「奇怪之处」其实是 lftp 程序还支持 FXP,允许数据绕过客户端直接在两个 FTP 服务器之间传输。

故障排查

  1. 检查 系统环境「无问题」

操作系统环境、内核信息、系统防火墙、SELinux 状态

[root@aliyun ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@aliyun ~]# uname -a
Linux aliyun 2.6.32-696.28.1.el6.i686 #1 SMP Wed May 9 23:34:25 UTC 2018 i686 i686 i386 GNU/Linux
[root@aliyun ~]# getenforce
Disabled
[root@aliyun ~]# service iptables status
iptables: Firewall is not running.
  1. 强制修改主被动连接模式

服务端端口开放信息

[root@aliyun ~]# netstat -antpl | grep ftp
tcp        0      0 172.17.9.135:21485          0.0.0.0:*                   LISTEN      3756/vsftpd
tcp        0      0 0.0.0.0:2100                0.0.0.0:*                   LISTEN      1671/vsftpd
tcp        0      0 172.17.9.135:2100           125.120.45.15:54654         ESTABLISHED 3756/vsftpd

客户端端口开放信息

 >root ~
[Node1]# netstat -antlp | grep ftp
tcp        0      0 192.168.0.130:60330     0.0.0.0:*               LISTEN      3415/ftp
tcp        0      0 192.168.0.130:54654     123.56.241.199:2100     ESTABLISHED 3415/ftp

此时 切换 ftp 主被动模式出现如下状态

 >root ~
[Node1]# ftp
ftp> open 123.56.241.199 2100
Connected to 123.56.241.199 (123.56.241.199).
220 (vsFTPd 2.2.2)
Name (123.56.241.199:root): ftpuser_1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (172,17,9,135,83,237).
ftp: connect: 没有到主机的路由
ftp> pass
Passive mode off.
ftp> ls
500 Illegal PORT command.
ftp: bind: 地址已在使用
ftp> ls
500 Illegal PORT command.
  1. tcpdump 抓包分析
17:01:02.917229 IP 172.17.9.135.ftp > 60.191.16.170.25460: Flags [P.], seq 78:97, ack 44, win 227, options [nop,nop,TS val 6760674 ecr 4083902134], length 19

简而言之,就是本地开放了 ftp 的数据端口,但是一直在侦听状态,于 第二步 出现的情况一致。

原因分析

按照故障排查,基本可以确定问题出现在网络访问层面,且本地 ftp 工作正常「例如能够打开命令端口正常登录,正常打开数据传输接口监听连接」,只有在打开数据传输接口监听连接时,没有客户端去与其建立连接。

所以能确定故障在 客户端无法访问服务端的数据接口

查看云主机的 IP 信息,发现在云主机上并没有 公网 IP 地址,只有一个内网 IP 地址。所以能够确定导致此现象的原因在于阿里云内部映射公网的 NAT 机制。

[root@aliyun ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:14:47:0f brd ff:ff:ff:ff:ff:ff
    inet 172.17.9.135/20 brd 172.17.15.255 scope global eth0

也就是说整体数据流思路为

  • 客户端请求服务端 21 命令端口「用户可登录」
  • 客户端请求下载文件或者展示目录信息: 客户端通过 21 端口将请求发送至服务端,服务端收到后打开本地随机端口「例如21423」作为数据端口,并把此 IP:端口 信息通过命令端口 21 发送至客户端

问题就出现在这里,这里的 IP:端口 信息,由于云主机只有内网 IP ,所以这里返回给客户端的 IP:端口信息 为 172.17.9.135:21423 而不是 123.56.241.199:21423 所以客户端当然无法访问 一个内网 IP 啦

解决方案

阿里云对于 公网 IP 有产品叫做 EIP 弹性公网IP(Elastic IP Address,简称 EIP)支持绑定弹性网卡 ENI(Elastic Network Interface)。通过绑定弹性网卡,您可以构造出更健壮、更灵活、扩展性更强的IT解决方案,同时让单台服务器具备多个公网IP的能力。

按照 产品设计 EIP 有以下工作模式

  • 普通模式「云主机上只有一个内网 IP,通过 NAT 方式映射到公网」
  • EIP 网卡可见模式「云主机上能看到公网 IP,相当于直接一台公网机器」
比较点 普通模式 EIP网卡可见模式
EIP在操作系统内部的弹性网卡上是否可见 是「通过ifconfig或ipconfig获取网卡的公网IP地址。」
EIP 支持绑定弹性网卡的类型 主弹性网卡和辅助弹性网卡 仅支持绑定辅助弹性网卡
主弹性网卡允许绑定的 EIP 数量 1个 不支持绑定主弹性网卡
辅助弹性网卡允许绑定的EIP数量 取决于辅助弹性网卡的私网IP数量「EIP和辅助弹性网卡的私网IP地址一一映射,如辅助弹性网卡上共有10个私网IP地址,最多可为此弹性网卡绑定10个EIP。」 1个「网卡可见模式下,EIP只能绑定辅助弹性网卡上的主私网IP。」
EIP 绑定辅助弹性网卡,辅助弹性网卡的私网功能是否可用
支持的协议类型 EIP作为NAT ALG(NAT应用层网关)部署时,不支持如H.323、SIP、DNS、RTSP等协议 EIP可支持全部IP协议类型,支持FTP、H.323、SIP、DNS、RTSP、TFTP等协议

https://help.aliyun.com/document_detail/88991.htm?spm=a2c4g.11186623.2.8.26a81689kaKLht https://help.aliyun.com/knowledge_detail/185319.html?spm=5176.11065259.1996646101.searchclickresult.502375a7WG8E4C

所以

问题就出在 EIP 工作模式为「普通模式」,普通模式不支持 FTP 协议,也只有「网卡可见模式」能实现返回命令端口信息 IP:端口 为 123.56.241.199:21423

EIP 网卡可见模式功能使 EIP 在网卡上可见,解决了上述问题。在 EIP 网卡可见模式下:

  • EIP 替换辅助弹性网卡的私网 IP,辅助弹性网卡将变为一个纯公网网卡,私网功能不再可用。
  • EIP 在操作系统内部的弹性网卡上可见,可直接通过 ifconfig 或 ipconfig 获取网卡上的公网 IP 地址。
  • EIP 可支持全部 IP 协议类型,支持 FTP、H.323、SIP、DNS、RTSP、TFTP 等协议。
  • 一个辅助弹性网卡仅支持绑定一个 EIP。

总结

最终更换 EIP 工作模式为「网卡可见模式」就解决了此次原本可以不存在的故障……

修改完「网卡可见模式」后在操作系统内可见公网 IP 如下「eth1」

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3f:00:79:8e brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.161/24 brd 192.168.11.255 scope global dynamic eth0
       valid_lft 315084196sec preferred_lft 315084196sec
    inet6 fe80::216:3fff:fe00:798e/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:13:10:f7 brd ff:ff:ff:ff:ff:ff
    inet 123.56.241.199/22 brd 121.196.247.255 scope global dynamic eth1
       valid_lft 315084199sec preferred_lft 315084199sec
    inet6 fe80::216:3eff:fe13:10f7/64 scope link
       valid_lft forever preferred_lft forever

https://help.aliyun.com/document_detail/98641.htm?spm=a2c4g.11186623.2.6.26a81689kaKLht

云主机厂商的网络环境,还是要多加了解,对于数据流向要清楚网络的实现方式,关键时候还是要回到官方文档。