我有一台使用 Ubuntu 12.04 设置的服务器。我已经安装了 OpenSSH,并且尝试使用此命令(已修改为正确的值)从另一个网络上的另一台计算机访问它:
ssh [email protected]
我是当我在同一个网络中的任何其他计算机上时能够连接,但是当我尝试从不同的网络 ping 我的服务器 IP 时,我得到的只是:
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
ping: sendto: No route to host
Request timeout for icmp_seq 4
ping: sendto: Host is down
Request timeout for icmp_seq 5
ping: sendto: Host is down
Request timeout for icmp_seq 6
ping: sendto: Host is down
Request timeout for icmp_seq 7
ping: sendto: Host is down
Request timeout for icmp_seq 8
ping: sendto: Host is down
Request timeout for icmp_seq 9
ping: sendto: Host is down
Request timeout for icmp_seq 10
通过我的搜索,我发现ping
有时并不可靠,所以我尝试了一下telnet my_ip
,但仍然无法连接。
我假设这是路由器的问题,也可能是防火墙的问题,但我不确定是什么问题。
我确保端口 22 已打开,使用http://www.yougetsignal.com/tools/open-ports/
服务器所在的网络由 Netgear 路由器运行。ifconfig(Ubuntu 终端):
eth0 Link encap:Ethernet HWaddr 6c:3b:e5:b8:64:3e
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::6e3b:e5ff:feb8:643e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:83734 errors:0 dropped:0 overruns:0 frame:0
TX packets:47851 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35300099 (35.3 MB) TX bytes:6103273 (6.1 MB)
Interrupt:16
eth1 Link encap:Ethernet HWaddr 6c:3b:e5:b8:64:3f
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:17
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:456 errors:0 dropped:0 overruns:0 frame:0
TX packets:456 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:49255 (49.2 KB) TX bytes:49255 (49.2 KB)
我尝试访问的网络由 Verizon 路由器运行。ifconfig(Mac 终端):
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=2b<RXCSUM,TXCSUM,VLAN_HWTAGGING,TSO4>
ether a8:20:66:07:eb:a4
media: autoselect (none)
status: inactive
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 20:c9:d0:32:05:02
inet6 fe80::22c9:d0ff:fe32:502%en1 prefixlen 64 scopeid 0x5
inet 192.168.1.69 netmask 0xffffff00 broadcast 192.168.1.255
media: autoselect
status: active
fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 4078
lladdr 00:3e:e1:ff:fe:7a:36:b0
media: autoselect <full-duplex>
还有什么原因可能导致该问题?
答案1
总结:您需要在路由器上配置端口转发,或将 SSH 服务器设置在 DMZ 之外,或类似操作。然后,使用路由器的 IP 地址,而不是服务器的 IP 地址。
根据您的评论,您正在使用ssh [user]@192.168.0.[some number]
。仅当您连接到同一网络时,此功能才有效。
为什么?因为(据我所知,可能是)您的路由器有一个公共 IP,而您网络内的每台计算机都有一个私有 IP。您的公共 IP 如下所示:71.32.87.80
。它非常随机,偶尔会更改。您的私有 IP 看起来像您在 SSH 命令中输入的 IP;它是在您连接时由路由器分配给您的计算机的。使用给定路由器的每台计算机都分配有一个私有 IP。
但是,由于流量经过路由器,因此流量就像来自路由器一样,因此也是来自您的公共 IP。这就是为什么如果网站使用基于 IP 地址的逻辑,网络内的每台计算机看起来都会一样。这也是私有 IP 和公共 IP 概念的来源:您的公共 IP 是每个人都能看到的 IP。除了您的路由器之外,没有人能看到您的私有 IP。
假设您的服务器已连接到路由器 A。当您在路由器 A 上并连接到 时192.168.0.x
,您正在连接到一台也连接到路由器 A 的计算机 - 您的服务器。当您不在路由器 A 上时 - 假设您在路由器 B 上 - 并连接到 时192.168.0.x
,您正在连接到连接到路由器 B 的某台计算机 -不是你的服务器。您的连接甚至从未离开路由器 B 的网络。
因此,您需要连接到路由器 A 的公共 IP,而不是服务器的私有 IP。然后,您需要配置路由器 A 以将入站流量转发到您的服务器。这实际上使路由器 A 的 IP 充当您的服务器的入站流量 IP。
注意:我意识到这个解释在易懂性方面不是最好的。请告诉我我可以做些什么来改进它。
答案2
我觉得这可能是 netfilter 问题。你检查过你的 Netgear 是否将端口 22 转发到你的服务器了吗?
如果您安装了 GUI,请添加包 gufw,如果没有,我相信有一种方法可以通过命令行,只是我不是 Ubuntu 用户。
然后确保允许从端口 22 上的“所有”进行访问,或者如果您知道远程 IP,则最好将它们添加为允许规则以保证您的安全。