👌 2021-05-19 阿里云主机 EIP 致使 FTP 无法连接
上午收到了个协助工单,期间交手了两位同事都没解决掉的 ftp 奇特现象,就转到我这边了。 文中涉及到的相关 公网 IP 地址均特殊化处理
[TOC]
现象
Linux 使用自带 ftp 命令或者 Windows 使用资源管理器访问阿里云主机搭建的 ftp 服务,无论是主动模式还是被动模式均只能建立命令端口「21 端口」连接,无法创建数据端口连接,导致只能登录用户而不能展现文件夹以及上传下载数据。现场 21 端口使用 2100 替代。
- 表现 1
使用主动模式或者被动模式均无法显示目录信息
- 表现 2
使用 lftp 客户端或者 Windows 下的 WinSCP 软件可 正常使用 此云主机的 ftp 服务「奇怪之处」其实是 lftp 程序还支持 FXP,允许数据绕过客户端直接在两个 FTP 服务器之间传输。
故障排查
- 检查 系统环境「无问题」
操作系统环境、内核信息、系统防火墙、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.
- 强制修改主被动连接模式
服务端端口开放信息
[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.
- 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
云主机厂商的网络环境,还是要多加了解,对于数据流向要清楚网络的实现方式,关键时候还是要回到官方文档。