我在运行 CentOS 的 Linux 服务器上使用 SSH 时遇到了一些问题。我可以使用 PuTTY 或从 Windows cmd 使用 ssh 顺利连接到我的服务器。使用安全 FTP 也是如此。我可以连接到服务器,获取文件列表,一切正常。当我尝试通过网络发送任意数量的数据时,就会出现问题。
每当我尝试传输超过某个阈值的任何内容时,连接就会失败,并且我会看到“对等方重置连接”消息。我的主目录中有一个大约 3 MB 的 sql 文件。如果我尝试通过 FTP 传输它,它将开始传输并在传输约 48k 后终止。然后它将启动一个新连接并传输另一个 48k。如果我使用 PuTTY 并打开一个会话,我可以正常连接和登录。如果我cat file.sql
再次尝试,连接将终止,并且我会收到“对等方重置连接”消息。从我的本地工作站到服务器也是同样的情况。我有相当多的源代码需要提交到服务器上托管的 svn 存储库,但出现了相同的“对等方重置连接”消息。
我知道问题出在我的本地工作站上,因为我可以使用我妻子的 MacBook 并 ssh 到服务器,没有任何问题。我可以通过 ssh 进入朋友的 Linux 机器(使用相同的 Putty 安装)并从他们的 sftp 到我的服务器并下载文件,从他的机器打开另一个 ssh 会话到我的服务器并 cat 文件。所以,有些事情发生了,但我不确定是什么。有人有什么想法吗?
更新
我一直在尝试进一步弄清楚这一点,似乎在单个 ssh 会话中我可以传输的数据量存在硬性限制。如果我这样做,我会立即达到这个限制,cat file.sql
但我也可以继续输入ls -l
相同的次数,并且也会收到“对等方重置连接”消息。我试过:
- 生成新的 ssh 密钥
- 重启我的路由器
- 重启我的电脑
- 重新启动远程服务器
我在远程服务器上写了一个 tcpdump,但我对 TCP 的了解不够详细,因此对我来说没有多大意义。我在 ssh 中打开了调试功能,以下是导致连接重置的日志部分:
Jul 24 23:10:56 server sshd[4507]: debug1: permanently_set_uid: 500/503
Jul 24 23:10:56 server sshd[4507]: debug1: Entering interactive session for SSH2.
Jul 24 23:10:56 server sshd[4507]: debug1: server_init_dispatch_20
Jul 24 23:10:56 server sshd[4507]: debug1: server_input_channel_open: ctype session rchan 256 win 16384 max 16384
Jul 24 23:10:56 server sshd[4507]: debug1: input_session_request
Jul 24 23:10:56 server sshd[4507]: debug1: channel 0: new [server-session]
Jul 24 23:10:56 server sshd[4507]: debug1: session_new: init
Jul 24 23:10:56 server sshd[4507]: debug1: session_new: session 0
Jul 24 23:10:56 server sshd[4507]: debug1: session_open: channel 0
Jul 24 23:10:56 server sshd[4507]: debug1: session_open: session 0: link with channel 0
Jul 24 23:10:56 server sshd[4507]: debug1: server_input_channel_open: confirm session
Jul 24 23:10:56 server sshd[4507]: debug1: server_input_channel_req: channel 0 request pty-req reply 1
Jul 24 23:10:56 server sshd[4507]: debug1: session_by_channel: session 0 channel 0
Jul 24 23:10:56 server sshd[4507]: debug1: session_input_channel_req: session 0 req pty-req
Jul 24 23:10:56 server sshd[4507]: debug1: Allocating pty.
Jul 24 23:10:56 server sshd[4505]: debug1: session_new: init
Jul 24 23:10:56 server sshd[4505]: debug1: session_new: session 0
Jul 24 23:10:56 server sshd[4507]: debug1: session_pty_req: session 0 alloc /dev/pts/2
Jul 24 23:10:56 server sshd[4507]: debug1: server_input_channel_req: channel 0 request shell reply 1
Jul 24 23:10:56 server sshd[4507]: debug1: session_by_channel: session 0 channel 0
Jul 24 23:10:56 server sshd[4507]: debug1: session_input_channel_req: session 0 req shell
Jul 24 23:10:56 server sshd[4508]: debug1: Setting controlling tty using TIOCSCTTY.
Jul 24 23:10:59 server sshd[4507]: Read error from remote host <my-ip>: Connection reset by peer
Jul 24 23:10:59 server sshd[4507]: debug1: do_cleanup
Jul 24 23:10:59 server sshd[4505]: debug1: do_cleanup
Jul 24 23:10:59 server sshd[4505]: debug1: PAM: cleanup
Jul 24 23:10:59 server sshd[4505]: debug1: PAM: deleting credentials
Jul 24 23:10:59 server sshd[4505]: debug1: PAM: closing session
Jul 24 23:10:59 server sshd[4505]: pam_unix(sshd:session): session closed for user <me>
Jul 24 23:10:59 server sshd[4505]: debug1: session_pty_cleanup: session 0 release /dev/pts/2
更新2:
大约一周前,我使用这个 wiki 帖子修改了我服务器上的 ssh 设置:http://wiki.centos.org/HowTos/Network/SecuringSSH
因为我偶尔需要在工作时访问我的服务器,而且防火墙上的 21 端口是开放的,所以我将 ssh 端口更改为 21。为了进一步诊断此问题,我尝试恢复 ssh 设置并将 ssh 端口改回 22。结果,我不要当我使用端口 22 时遇到错误。将其改回 21,并且当我达到 48k 的传输数据时,就像时钟一样 - 对端重置了连接。
鉴于我可以获得初始连接,并且过去在端口 21 上建立 ftp 连接时没有遇到任何麻烦,所以问题似乎不是我的防火墙配置。
至少到目前为止,我已经将问题缩小到我服务器上的 ssh 端口。将其翻转为 21 并立即出现问题,将其改回 22,完全没有问题……
有人能想到为什么监听端口会产生影响吗?同样,它只在我的 Windows XP 机器上导致问题。如果有人知道是什么原因导致的,请告诉我。
更新 2:
问题缩小了,我终于改正了——这是一个防火墙问题,但属于 Windows 防火墙问题,而不是我的路由器问题。如果我使用端口 21 并禁用 Windows 防火墙,则不会遇到“对等方重置连接”消息。回答这个显而易见的问题,是的,Windows 防火墙上的端口 21 是打开的。
由于这台计算机位于路由器的防火墙后面,所以我现在只能禁用它,但我很想弄清楚这里发生了什么。
答案1
您可以使用此命令通过命令行解决问题(以管理员身份在 Windows 工作站上键入此命令):
netsh advfirewall set global statefulftp disable
答案2
这可能与您的路由器尝试自动处理 FTP NAT 连接跟踪有关。它只会发生在端口 21 上,而不会发生在端口 22 上。请查看http://www.faqs.org/docs/iptables/complexprotocols.html