首先,这是设置没有工作:

首先,这是设置没有工作:

我们办公室里有相当旧的 SUSE LINUX 10.1 (i586) 安装。

问题简要说明:我可以从同一局域网 (192.168.1.0) 中的机器成功 ssh 到它,但不能从另一个局域网 (10.23.0.0) 中的机器成功 ssh 到它。

SuSE 有 SSH 服务器 openssh-4.2p1-18.12。我已经排除了防火墙和 hosts.allow 和 hosts.deny 文件。

当我的 ssh 登录尝试失败时,日志显示以下内容:

在客户端上:

$ ssh -vvv 192.168.1.5
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to 192.168.1.5 [192.168.1.5] port 22.
debug1: Connection established.
debug1: identity file /home/nbuild/.ssh/identity type -1
debug1: identity file /home/nbuild/.ssh/identity-cert type -1
debug1: identity file /home/nbuild/.ssh/id_rsa type -1
debug1: identity file /home/nbuild/.ssh/id_rsa-cert type -1
debug1: identity file /home/nbuild/.ssh/id_dsa type -1
debug1: identity file /home/nbuild/.ssh/id_dsa-cert type -1

在服务器上:

Aug 21 16:34:25 serverhost sshd[20736]: debug3: fd 4 is not O_NONBLOCK
Aug 21 16:34:25 serverhost sshd[20736]: debug1: Forked child 20739.
Aug 21 16:34:25 serverhost sshd[20736]: debug3: send_rexec_state: entering fd = 7 config len 403
Aug 21 16:34:25 serverhost sshd[20736]: debug3: ssh_msg_send: type 0
Aug 21 16:34:25 serverhost sshd[20736]: debug3: send_rexec_state: done
Aug 21 16:34:25 serverhost sshd[20739]: debug1: rexec start in 4 out 4 newsock 4 pipe 6 sock 7
Aug 21 16:34:25 serverhost sshd[20739]: debug1: inetd sockets after dupping: 3, 3
Aug 21 16:34:25 serverhost sshd[20739]: debug3: Normalising mapped IPv4 in IPv6 address
Aug 21 16:34:25 serverhost sshd[20739]: Connection from 10.23.1.11 port 44340

服务器上的上述日志是我启用 DEBUG3 日志级别时显示的。但是,使用默认日志级别 (INFO),服务器仅记录以下内容:

Aug 21 16:38:32 serverhost sshd[20749]: Did not receive identification string from 10.23.1.11

有什么提示吗?我觉得我已经尝试了一切。

更新:如果这很重要,则无法 ssh 的机器位于另一个 VLAN 中。我尝试过 CentOS 6.5 和 Ubuntu。

答案1

听起来您还没有与服务器交换密钥。您是否尝试过使用用户名/密码进行连接?

您可以使用如下方式交换密钥:

ssh-copy-id <Username>@<RemoteHost>

答案2

我已经解决了这个问题。这似乎是某种奇怪的网络/路由问题,也就是说,两个子网之间来回传输的数据包会经过不同的路由。

192.168.1.1 是我们的办公室路由器(Cisco RV042),它将我们连接到互联网。192.168.1.200 是我们办公室的智能、可管理、支持 VLAN 的 Cisco 交换机(SG300),它将我们所有人彼此连接并连接到路由器。此交换机在系统模式 L3 下运行,这意味着它还可以充当 VLAN 之间的路由器。它配置了两个 VLAN - VLAN 1(默认)和 VLAN 2。IP 以 192.168.1.x 开头的主机位于 VLAN 1 中,而 10.23.xx 位于 VLAN 2 中。

首先,这是设置没有工作:

实际情况是,traceroute 显示来自 VLAN 1 的数据包经过 3 跳才能到达 VLAN 2:

情况1

[[email protected]]# traceroute -n 10.23.1.11
traceroute to 10.23.1.11 (10.23.1.11), 30 hops max, 40 byte packets
 1  192.168.1.1
 2  192.168.1.200
 3  10.23.1.11

而来自 VLAN 2 的数据包要经过 2 跳才能到达 VLAN 1:

案例 2

[[email protected]]# traceroute -n 192.168.1.5
traceroute to 192.168.1.5 (192.168.1.5), 30 hops max, 60 byte packets
 1  10.23.1.1
 2  192.168.1.5

案例 1

主机 192.168.1.5 的默认网关为 192.168.1.1(我们的办公室路由器)。因此,数据包首先到达路由器,然后路由器将其转发到 192.168.1.200(我们的智能交换机),因为我已为路由器明确配置了静态规则,否则什么也不会发生(我猜是因为默认情况下 10.0.0.0 网络是私有的且不可路由,或者其他原因,我不是网络专家)。从那里,我们的智能交换机充当路由器(还记得 L3 吗?),将数据包转发到其最终目的地 10.23.1.11。

案例 2

主机 10.23.1.11 的默认网关为 10.23.1.1。这又是交换机,但这次在 VLAN 2 中还有另一个接口。因此数据包首先到达交换机,然后交换机就像上面一样充当路由器,并通过其另一个接口将数据包定向到 VLAN 1 中的正确主机 192.168.1.5。这次我们有一条绕过路由器的捷径。

现在,这是解决我最初帖子中的 SSH 问题的方法(尽管我仍然不知道为什么):

我的一位同事建议我们让 CASE 1 和 CASE 2 的行为相似,看看会发生什么,即消除 CASE 1 中的多余跳跃并完全跳过路由器。所以,我更改了 CASE 1 中的默认网关。169.254.0.0 和 127.0.0.0 的条目已经存在,不知道为什么,这是一个遗留系统:

[[email protected]]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
[[email protected]]# route add default gw 192.168.1.200
[[email protected]]# route del default gw 192.168.1.1
[[email protected]]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.200   0.0.0.0         UG    0      0        0 eth0

因此现在默认网关从 192.168.1.1(路由器)更改为 192.168.1.200(交换机),并且发往 VLAN 2 中主机的数据包不必先到路由器然后再返回交换机,而是像情况 2 中那样走捷径。现在我们有:

[[email protected]]# traceroute -n 10.23.1.11    
traceroute to 10.23.1.11 (10.23.1.11), 30 hops max, 40 byte packets
 1  192.168.1.200
 2  10.23.1.11

最重要的是(同时也令人惊讶),SSH 问题自行解决了!现在我可以通过 SSH 从 192.168.1.5 连接到 10.23.1.11。不过,我仍然认为 SSH 不应该关心数据包经过哪里,但想想看...

对于上面的路由设置,缺点是如果主机 192.168.1.5 想要访问互联网,它必须先通过交换机,然后通过路由器,最后才能出去。这增加了一个不必要的跳数,而我未能对其进行优化(请参阅下面的注释)。

注1:

我已尝试添加网关 192.168.1.200,专门用于目的地 10.23.0.0没有像这样删除 192.168.1.1:

[[email protected]]# route add 10.23.0.0 gw 192.168.1.200
[[email protected]]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.23.0.0       192.168.1.200   255.255.255.255 UGH   0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

目的是让只有发往 VLAN 2 的数据包通过 192.168.1.200,发往 Internet 的数据包通过 192.168.1.1,但这样做没有奏效。发往 LAN 10.23.0.0 的数据包仍然通过 192.168.1.1,SSH 仍然不起作用。

笔记2:

我尝试使用另一个命令添加 192.168.1.200:

[[email protected]]# route add 10.23.0.0 gw 192.168.1.200 netmask 255.255.0.0
route: netmask 0000ffff doesn't make sense with host route

还是没有运气。

注3:

最后,我尝试同时保留 2 个默认网关,即添加 .200 而不删除 .1。

[[email protected]]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         192.168.1.200   0.0.0.0         UG    0      0        0 eth0

我不知道这样做是否健康。我不知道操作系统每次如何决定将数据包发送到哪里,因为路由表中的最后两个条目似乎相同。行为似乎是随机的。请网络专家解释一下。

相关内容