我正在尝试设置 openssh-server,但连接时遇到了一些问题。我将端口更改为非标准端口 (57757),然后将路由器设置为转发到该端口。在我的 LAN 上,我可以使用端口 57757 顺利通过 ssh 进入我的机器,但在 WAN 上却无法这样做。
如果我在局域网之外,并尝试通过错误的端口访问我的机器,我会立即收到“连接被拒绝”消息。但是,如果使用正确的端口,它就会挂起,然后超时。
我可以尝试什么来调试该问题?我尝试了跟踪路由,但它没有告诉我任何有用的信息。
编辑:我意识到我的问题是我的路由器不支持通过 WAN IP 内部访问它。我通过 ssh 连接到另一台服务器,然后重新连接,一切正常。
答案1
通常这意味着您已将端口转发到 LAN 上的错误 IP 地址。
你的NAT 路由器在端口 57757 上接收传入流量,并将其发送到 LAN 上的特定 IP 地址和端口。
默认情况下,Ubuntu 不会使用防火墙过滤传入的连接尝试。因此,除非您更改了 Ubuntu 中的防火墙设置,否则尝试打开与任何 TCP 端口(1 到 65535)的连接将导致以下结果:
- 如果端口开放,则接受连接
- 如果端口已关闭,则拒绝连接尝试
如果港口已过滤防火墙阻止了您的连接,那么您将看到这样的结果 — — 连接尝试没有响应。但是:
- 除非你更改了防火墙设置(例如,
ufw
)iptables
,否则不会过滤任何端口,和 - 无论如何,您都可以连接到 LAN 上的端口 22,因此它是开放的。
当你将端口转发到不存在的一台带有 NAT 路由器的机器,它会将该端口上的传入流量发送到不存在的机器,也就是说,它会将其发送到黑洞;它实际上被丢弃了。
这恰恰导致了您所描述的情况。因此,您很可能可以通过确保端口转发到 LAN 上的正确 IP 地址来修复此问题。
如果事实证明这不是问题……
...那么您必须进行一些故障排除。
LAN 端指定的端口是否正确?也就是说,假设你没有更改 SSH 服务器的配置,WAN 端的端口 57757 是否设置为转发到端口 22在 OpenSSH 服务器上?(您可能需要仔细检查这一点。)
您选择的特定端口 (57757) 可能存在问题。请尝试其他端口,看看效果是否更好。
(如果没有,并且您按照这些说明继续操作,请将其改回来或用新数字替换下面的“57757”。)
尝试重新启动 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 中断开连接并重新连接。
对于以太网连接,也请尝试拔下电缆并重新插入。对于无线连接,请尝试使用硬件开关将其关闭(如果有),然后重新打开。
这里发生了一些奇怪的事情,但这一切都不需要花费很长时间——在进行更为艰苦的故障排除步骤之前,值得进行彻底的检查。
您如何尝试从 WAN 端访问它?如果您正在使用一台机器在局域网上要执行此操作(只需从 LAN 连接到路由器的 WAN IP),只有部分路由器支持此功能。毕竟,路由器的工作是在 WAN 和 LAN 端之间路由流量,而不是将流量从一侧路由到自身。虽然许多家庭/办公室路由器确实具有此功能,但支持从 LAN 内部连接到 WAN IP 上的转发端口实际上是例外而不是规则。
因此,如果您没有在 WAN 端测试主机的端口转发,则应该这样做。您的选项包括:
从 WAN 端进行连接。如果您可以访问那里的一台机器,例如,通过 SSH 访问学校、工作场所、朋友家中或类似地方的远程机器,那么这种方法就可以奏效。
连接测试机之间路由器和任何提供它是网络连接。如果你有带以太网端口的有线/DSL/ISDN 调制解调器,并且路由器已插入该调制解调器,则可以连接转变连接到调制解调器,将路由器连接到交换机。将计算机连接到交换机。第一的看看该机器是否可以访问互联网 - 如今,许多 ISP 都提供两个或更多独立的 IP 地址。如果没有,进入路由器的设置页面,检查其 WAN IP 和广域网子网掩码,然后为交换机连接的位于同一子网内的机器静态分配一个 IP 地址。
这种方法有一些缺点。这很麻烦!此外,理论上 ISP 可能会错误地配置其网络,从而导致连接到交换机的测试机器可以访问互联网。(除非您的 ISP 有意让您使用多个 WAN IP 进行连接和如果您碰巧为测试机器选择了 ISP 分配给您的 WAN IP,则 ISP 应该会阻止/丢弃它与真正的 WAN 主机之间的流量。但有些 ISP 的做法很奇怪,所以谁知道呢?)如果发生这种情况,它可能不会给任何人带来严重问题(即使它确实如此,您也只能连接几分钟)。但是,它可能被视为试图获取超出您订阅范围的额外访问权限,而且——更重要的是——如果另一个用户拥有相同的 IP,它可能会干扰他们的连接。因此,如果你想尝试这种方法,不要尝试从测试机访问互联网,如果发现测试机可以访问互联网,请立即停止,如果您的 ISP 禁止或建议不要尝试此操作。(如果您的路由器的 WAN 端是办公室 LAN,请不要使用此功能,请先咨询您的网络管理员。这不是 ISP,也没有假设已配置资源以防止不必要的访问。)
此技术的一种变体有时更为合适。您的路由器可能会获取其连接信息——IP 地址、子网掩码、WAN 上网关(路由器)的 IP 地址它当不知道将某些东西发送到哪里时,它就会使用 DNS 服务器信息——从您的 ISP、通过 DHCP、通过电缆/DSL/ISDN 调制解调器。这就是为什么您必须将路由器插入调制解调器,为其提供必要的配置,以使 WAN 端测试的结果有意义。但只要路由器实际连接到 WAN 侧的网络,它通常会记住这些信息。这样你就可以连接路由器、调制解调器和测试机器,但随后,快速地,在对测试机器进行任何操作之前,除了确保交换机将其视为已连接之外,断开调制解调器。
使用互联网上的免费服务来测试您的端口。由于在路由器的 WAN 接口和 Internet 之间插入一台测试机器(上图)非常复杂 - 并且即使由于被 ISP 阻止而无法访问,它也会显示端口为可访问(从 LAN 端连接到路由器的 WAN IP 也是如此) - 通常最好使用基于 Web 的端口扫描服务。
有很多端口扫描服务。(有些服务打着“检查防火墙”的旗号,认为大多数人都试图堵塞而不是促进使用权。)这是一。如果您选择使用这个,请点击继续,在文本框中输入 57757,然后单击使用指定的自定义端口探测。为了运行服务器,您想将其设置为“打开”。“关闭”表示端口可以访问,但服务器未运行(因此连接尝试被拒绝)。“隐藏”表示端口不可访问 - 就像没有机器位于该位置(或者好像端口被转发到没有机器的位置)。
好的,所以您已经确定它确实无法从 Internet 访问。您可以扫描它(最好从 WAN 端)以获取详细信息,尽管这通常不会提供有用的信息。
如果您想这样做,那么在 WAN 端,您可以运行:
sudo nmap -sS -sV -p57757 -vv WAN-IP
如果端口显示为已被过滤,则证实发送到那里的数据包可能无处可去(或在途中被阻止/丢弃)。
值得检查一下问题是否是由于暴露给 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
顶部的行更改为 sayPort 57757
即可。你可以添加而不是更改端口。不过,我建议使用最简单有效的配置进行测试。
看
man sshd_config
有关配置 OpenSSH 服务器的更多详细信息。
保存文件,退出文本编辑器,然后使用以下命令重新启动 SSH 服务器:
sudo restart ssh
现在更改路由器上的端口转发,以便端口 57757 转发到 OpenSSH 服务器上的端口 57757(而不是 22),并查看是否可以从 Internet 访问。
如果仍然不起作用,请查看 Ubuntu 的防火墙是否确实阻止了来自 LAN 外部的流量。
(如果您自己没有这样配置,这种情况不太可能发生,但如果您的所有设置都正确并且上述步骤都没有发现任何有关问题的信息,则值得检查。)
跑步:
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 防火墙模块没有编译到您的内核中,您的系统的行为将与上述设置相同,尽管
iptables
查询netfilter
设置的命令当然不起作用。)如果你的配置看起来不像那样,请阅读
man iptables
弄清楚他们在做什么,和/或编辑您的问题(或者,如果您是另一个遇到类似问题的人,请发布新问题)以包括他们。请注意,您的iptables
规则可能会泄露有关您配置的敏感信息。实际上,情况通常并非如此——可能例外的是有关被阻止的特定主机的规则,或者如果您的配置非常糟糕/不安全——通常这些信息对攻击者有用,尤其是对于位于 NAT 路由器后面的家庭/办公室 LAN 上的机器,是最小的。
答案2
由于它从 LAN 内部运行,因此您的服务器设置似乎是正确的。您必须告诉路由器从港口你想使用外部前往港口你的机器上是 57757。在这种情况下
Atraceroute
将毫无用处。