ssh服务器的连接超时

我正在尝试设置openssh-server,但我遇到了一些连接问题。 我将端口更改为非标准(57757),然后将我的路由器设置为转发到该端口。 在我的局域网上,我能够使用端口57757轻松地进入我的机器,但无法在WAN上执行此操作。

如果我在局域网外,并且我尝试通过错误的端口访问我的机器,我立即收到“连接被拒绝”消息。 但是,使用正确的端口,它只会挂起然后超时。

我可以尝试调试此问题? 我尝试过traceroute,但它并没有告诉我任何有用的东西。

编辑:我意识到我的问题是我的路由器不支持内部通过WAN IP访问它。 我ssh到一个不同的服务器并重新进入,它工作正常。

通常这意味着您已将端口转发到LAN上错误的IP地址。

您的NAT路由器接收端口57757上的传入流量,并将其发送到LAN上的特定IP地址和端口。

默认情况下,Ubuntu不会过滤使用防火墙的传入连接尝试。 因此,除非您在Ubuntu中更改了防火墙设置,否则尝试打开与任何TCP端口(1到65535)的连接将:

  • 如果端口打开,则接受连接
  • 如果端口关闭,则拒绝连接尝试

如果端口被防火墙过滤掉 ,那么你就会得到你所看到的 – 没有对连接尝试的响应。 但:

  • 除非您更改了防火墙设置(例如, ufwiptables ),否则不会过滤任何端口, 以及
  • 在任何情况下,您都可以连接到LAN上的端口22,因此它是打开的。

当您使用NAT路由器将端口转发到不存在的计算机时,它会将该端口上的传入流量发送到不存在的计算机,也就是说它将其发送到黑洞中 ; 它被有效地删除了。

这恰好导致了你所描述的情况。 因此,您最有可能通过确保将端口转发到LAN上的正确IP地址来解决此问题。

如果结果certificate不是问题……

…那么你将不得不做一些故障排除。

  1. 为LAN端指定的端口是否正确? 也就是说,假设您没有更改SSH服务器的配置,WAN端口上的端口57757是否设置为转发到OpenSSH服务器上的端口22 ? (您可能需要仔细检查一下。)

  2. 也许你选择的特定端口存在一些问题(57757)。 尝试不同的一个,看看它是否更好。

    (如果没有,并继续执行这些说明,请将其更改回来或用新号码替换下面的“57757”。)

  3. 尝试重新启动OpenSSH服务器。 如果存在网络问题,这可能会有所帮助。 如果这没有帮助,请尝试重新启动路由器和电缆/ DSL / ISDN调制解调器。

    如果由于某种原因你无法重启所有三个设备,我建议你尽可能重新启动。 如果您无法重新启动OpenSSH服务,至少可以重新启动该服务并且(更有可能解决此问题)将接口关闭并重新启动。

    要重新启动OpenSSH服务器:

     sudo restart ssh 

    要关闭网络接口,首先找出它所在的接口:

     ifconfig 

    通常,对于具有单个以太网卡和/或单个无线卡的机器,以太网为eth0 ,无线为wlan0

    如果有线以太网连接是您想要关闭并重新启动的,请运行:

     sudo ifdown eth0 

    然后运行:

     sudo ifup eth0 

    或者,您可以运行:

     sudo ifconfig eth0 down 

    其次是:

     sudo ifconfig eth0 up 

    如果机器使用NetworkManager来管理运行OpenSSH服务器的接口,我仍然建议尝试上述方法,但您也可以尝试在NetworkManager中断开连接并重新连接。

    对于以太网连接,也请尝试拔下电缆并将其重新插入。对于无线连接,请尝试使用硬件开关(如果有)将其关闭,然后重新打开。

    这里发生了一些奇怪的事情,而且这一切都不需要很长时间 – 在进行更加艰苦的故障排除步骤之前,彻底彻底是值得的。

  4. 您是如何尝试从WAN端访问它的? 如果您使用LAN上的计算机执行此操作(仅从LAN连接到路由器的WAN IP),则仅支持某些路由器。 毕竟,路由器的工作是在WAN和LAN端之间路由流量,而不是将流量从一端路由到自身。 尽管许多家庭/办公室路由器确实具有此function,但支持从LAN内部连接到WAN IP上的转发端口实际上是例外而不是规则。

    因此,如果您没有从WAN端的主机向前测试端口,则应该这样做。 您的选择是:

    • 从WAN端连接自己。 如果您可以访问那里的计算机,例如,SSH访问学校,工作,朋友家中的远程计算机或类似计算机,则此方法有效。

    • 在路由器和提供Internet连接的任何设备之间连接测试机器。 如果您有一个带有以太网端口的电缆/ DSL / ISDN调制解调器并且您的路由器已插入其中,您可以将交换机连接到调制解调器并将路由器连接到交换机。 将计算机连接到交换机。 首先看看该机器是否只能访问Internet – 现在,许多ISP提供两个或多个单独的IP地址。 如果没有 ,请转到路由器的设置页面并检查其WAN IP和WAN子网掩码 ,然后将IP地址静态分配给位于同一子网内的交换机连接的计算机。

      这种方法有一些缺点。 真是太痛苦了! 此外,理论上ISP可能会错误地配置其网络,以便连接到交换机的测试机器可以访问Internet。 (除非您的ISP打算让您连接多个WAN IP 并且您碰巧为您的ISP分配给您的测试机器选择了一个WAN IP,否则应该阻止/丢弃它与真正的WAN主机之间的流量但有些ISP有奇怪的做法,所以谁知道呢?)如果发生这种情况,它不会引起任何严重的问题(即使它确实存在,你只能将它连接几分钟)。 但是,它可能被视为尝试获得超出订阅范围的额外访问权限,并且 – 更重要的是 – 如果另一个用户具有相同的IP,则它可以与其连接相关。 因此, 如果您想尝试此方法 ,请不要尝试从测试计算机访问Internet,如果您发现测试计算机可以访问Internet,请立即停止,如果禁止或建议不要尝试,请不要尝试由您的ISP。 (如果您的路由器的WAN端是办公室局域网,请不要使用此function,而无需先咨询您的网络管理员。这不是ISP,并且不会假设已配置资源以防止意外访问。)

      这种技术有一种变化,有时更合适。 您的路由器可能会获取其连接信息 – IP地址,子网掩码,WAN上的网关(路由器)的IP地址,当它不知道在哪里发送内容时使用它,以及有关DNS服务器的信息 – 来自您的ISP,通过DHCP,通过有线/ DSL / ISDN调制解调器。 这就是为什么你必须将路由器插入调制解调器,为其提供必要的配置,以使WAN端测试的结果有意义。 但路由器通常会记住此信息,只要它实际连接到WAN端的网络即可。 因此,您可以连接路由器,调制解调器和测试机器,但是,然后,快速地, 在对测试机器做任何事情之前,除了确保交换机将其视为连接之外 ,断开调制解调器。

    • 使用Internet上的免费服务来测试您的端口。 由于在路由器的WAN接口和Internet(上面)之间插入测试机器非常复杂 – 因为它会显示一个端口可访问,即使它由于被ISP阻止而无法访问(连接到的也是如此)路由器来自LAN端的WAN IP) – 通常最好使用基于Web的端口扫描服务。

      有许多端口扫描服务。 (有些人认为大多数人都试图阻止而不是为了方便访问,而是“检查你的防火墙”。) 这是一个。 如果选择使用该项,请单击“ 继续” ,在文本框中键入57757,然后单击“ 使用指定的自定义端口探测” 。 为了使服务器运行,您希望它“开放”。 “已关闭”表示端口可访问但服务器未运行(因此连接尝试被拒绝)。 “Stealth”意味着端口无法访问 – 就好像没有机器位于那里(或者好像端口被转发到没有机器的地方)。

  5. 好的,所以你已经确定无法通过互联网访问它。 您可以扫描它(理想情况下从WAN端)以获取详细信息,但通常这不会提供有用的信息。

    如果您想这样做,那么在WAN端,您可以运行:

     sudo nmap -sS -sV -p57757 -vv WAN-IP 

    如果端口显示为已过滤,则确认在那里发送的数据包可能无处可去(或沿途被阻止/丢弃)。

  6. 值得检查是否问题是由于暴露给WAN的端口与服务器实际监听的端口不同而引起的。 将WAN上的端口55757转发到LAN机器上的端口22可以使事情变得很好,但也许某处(服务器,客户端)假设端口号从服务器和客户端的角度来看是相同的。

    据推测,您无法通过路由器转发端口22。 也许您的ISP会阻止该端口。 但如果你能做到这一点,那就去做吧!

    否则,您可以使OpenSSH服务器实际侦听端口57757。

    为此,请备份服务器配置文件:

     cd /etc/ssh sudo cp sshd_config sshd_config.old 

    然后编辑它:

     gksu gedit sshd_config 

    如果机器没有GUI,请使用控制台文本编辑器:

     sudo nano -w sshd_config 

    在文件顶部附近,出现以下文本块:

     # What ports, IPs and protocols we listen for Port 22 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes 

    只需更改顶部的Port 22线,即改为Port 57757

    • 您可以添加端口而不是更改它。 不过,我建议使用最简单的有效配置进行测试。

      有关配置OpenSSH服务器的更多详细信息,请参阅man sshd_config

    保存文件,退出文本编辑器,然后使用以下命令重新启动SSH服务器:

     sudo restart ssh 

    现在更改路由器上的端口,使端口57757转发到OpenSSH服务器上的端口57757(而不是22),并查看它是否可以从Internet访问。

  7. 如果它仍然无法正常工作,请查看Ubuntu的防火墙是否真的阻止了来自局域网外部的流量。

    (如果你自己没有以这种方式配置它,这是不太可能的,但是如果所有设置都正确并且上述步骤都没有显示有关问题的任何内容,则值得检查。)

    跑:

     sudo iptables -L 

    默认情况下,在Ubuntu中,输出如下所示:

     Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 

    这是一个简单的许可策略,基本上相当于不运行防火墙。 (实际上,如果netfilter防火墙模块没有编译到你的内核中,你的系统的行为方式与上面的设置相同,尽管查询netfilter设置的iptables命令当然不起作用。)

    如果您的配置看起来不那样,请阅读man iptables以了解他们正在做什么,和/或编辑您的问题(或者,如果您是一个有类似问题的其他人,请阅读此问题,发布一个新问题)包括他们。 请注意,您的iptables规则可能会泄露有关您的配置的敏感信息。 实际上,通常情况并非如此 – 可能的例外情况是关于被阻止的特定主机的规则,或者如果您的配置非常糟糕/不安全 – 通常这些信息对攻击者有用, 特别是对于机器上的NAT路由器后面的家庭/办公室局域网是最小的。

由于它在您的局域网内工作,您的服务器设置似乎是正确的。 您必须告诉路由器从您要在外部使用的端口转发到您计算机上的端口57757
在这种情况下, traceroutetraceroute