我在连接 AWS VPC 子网时遇到严重的误导性错误。该错误确实发生在B->A连接中,而在A->B连接中没有发生,所以一开始我认为这是库错误。
它恰好是由 AWS 系统的“双层路由”和子网中的 NAT 实例引起的,该实例确实将数据包重定向到错误的网络通道,导致 ssh 断开连接。
下面是我的带有“案例研究”的帖子的副本,该帖子已从原始线程中删除:
据我所知,这甚至不是试图回答这个问题,所以我将其删除。如果您有一个单独的问题,请随时将其作为一个问题发布 |@michael-mrozek
就我而言:
正如@patrick建议的那样(ssh_exchange_identification:读取:连接被对等方重置):
客户端(子网B 172.16.3.76)ssh 172.16.0.141 -vvv -p23
OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to 172.16.0.141 [172.16.0.141] port 23.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: identity file /root/.ssh/id_ed25519 type -1
debug1: identity file /root/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
ssh_exchange_identification: read: Connection reset by peer
服务器(子网 A 172.16.0.141)
$(which sshd) -d -p 23
debug1: sshd version OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type ECDSA
debug1: private host key: #2 type 3 ECDSA
debug1: could not open key file '/etc/ssh/ssh_host_ed25519_key': No such file or directory
Could not load host key: /etc/ssh/ssh_host_ed25519_key
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
debug1: rexec_argv[2]='-p'
debug1: rexec_argv[3]='23'
Set /proc/self/oom_score_adj from 0 to -1000
debug1: Bind to port 23 on 0.0.0.0.
Server listening on 0.0.0.0 port 23.
debug1: Bind to port 23 on ::.
Server listening on :: port 23.
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 5 out 5 newsock 5 pipe -1 sock 8
debug1: inetd sockets after dupping: 3, 3
debug1: getpeername failed: Transport endpoint is not connected
debug1: get_remote_port failed
VPC设置及案例说明:
我确实有在 VPC 中运行的 AWS EC2 Amazon 实例 (172.16.0.0/16)
- 有公有子网 A (172.16.0.0/24),NAT 实例 A (172.16.0.200) 具有附加的弹性 IP
- subnetA 中的其他实例通过 instanceA 与互联网通信(默认通过 172.16.0.200 dev eth0)
- subnetB (172.16.3.0/24) 中有实例
- 路由表类似于https://stackoverflow.com/questions/10243833/how-to-connect-to-outside-world-from-amazon-vpc
问题:
- 子网 A 和子网 B 的主机均能 ping 通。
- 子网 A 中的主机可以 ssh 到子网 B 中的主机
- 子网 B 中的主机可以 ssh 到子网 A 中的实例 A
- 子网 B 中的主机都无法 ssh 到子网 A 中的其他实例(实例 A 除外),出现错误:ssh_exchange_identification:读取:连接由对等方重置 IF_AND_ONLY_IF 子网 A 中的实例将默认网关设置为 NAT-InstanceA(示例“默认通过172.16.0.200 dev eth0')。如果存在带有 not_changed 默认网关的 instance_in_subnetA (例如“default via 172.16.0.1 dev eth0”),那么您可以从 SubnetBhosts ssh 到该实例
- 注释:如果subnetA中没有NAT,则subnetA中的实例将不会有传出互联网连接
所以...
该问题可能是由 Amazon AWS 路由器和/或 NAT 配置引起的。
就目前而言,我想,尽管事实上,VPC路由表被设定为:
Destination Target
172.16.0.0/16 local
0.0.0.0/0 igw-nnnnn
子网A实例位于
172.16.0.0/24
(编辑:问题的根源:路由表通过 NAT 实例重定向 172.16.0.0/24 以外的流量,覆盖 AWS 端路由:172.16.0.0/16)
default via 172.16.0.200 dev eth0
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.60
子网B实例位于
172.16.3.0/24
当子网 B 中的主机连接到子网 A 中的实例(NAT 实例 A 除外)时,流量如下所示:
172.16.3.X/24 --> 172.16.3.1 --> 172.16.0.Y
V
??? <-- 172.16.3.200 (NAT)
这就是问题所在。我必须tcpdump
验证这一点,它可能可以通过 NAT 规则修复,尽管它比应有的更复杂。
实际上,AWS路由器中的规则
Destination Target
172.16.0.0/16 local
理论上应该覆盖 VPC/16 子网,但实例/24 子网 + NAT 网关隐藏了“system_level”上的功能。
答案1
在subnetA 中的实例(NAT 实例为172.16.0.200)上,路由表如下所示:
default via 172.16.0.200 dev eth0
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.141
实际上,还有一项补充:
$ ip r a 172.16.3.0/24 via 172.16.0.1
(or ip r a 172.16.3.0/16 via 172.16.0.1)
修复系统路由表:
default via 172.16.0.200 dev eth0
172.16.0.0/24 dev eth0 proto kernel scope link src 172.16.0.141
172.16.3.0/24 via 172.16.0.1 dev eth0
并将 VPC 子网路由转移到 AWS 路由器
Destination Target
172.16.0.0/16 local
0.0.0.0/0 igw-nnnnn