我有一台服务器,从 Ubuntu 12.04 升级到了 14.04。现在我遇到了一些非常奇怪的行为(我相信这些行为在升级后不会立即出现,但不能确定):我无法(通过主机名或 IP)ping、ssh、nslookup、curl 或 telnet 任何东西,甚至无法访问路由器 NAT 后面的地址。我甚至无法 ping 网关,我知道网关正在接受 ping,因为我从物理上位于同一网络上的盒子 ping 了它。
但奇怪的是:这个盒子在世界的另一端,而我仍然可以 ssh在更奇怪?我运行了 ipsec 和 xl2tpd,这样我就可以通过 VPN 进入。这也很好用。更奇怪?如果我通过 VPN 将 http 流量从世界另一端的计算机路由到此框,我就可以正常浏览互联网。是的,我关闭了这两项服务,但问题并没有解决。
目前我的所有防火墙规则均被禁用:
$ sudo ufw status
Status: inactive
和 iptables:
$ sudo iptables -L
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
我的路线看起来正常(192.168.0.1 是正确的网关):
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
ifconfig 也没有错误(IP 正确并且已分配 DHCP):
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.0.12 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::5246:5dff:fe53:975d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12600 errors:0 dropped:0 overruns:0 frame:0
TX packets:13748 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2727272 (2.7 MB) TX bytes:11775785 (11.7 MB)
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:65536 Metric:1
RX packets:350 errors:0 dropped:0 overruns:0 frame:0
TX packets:350 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:33067 (33.0 KB) TX bytes:33067 (33.0 KB)
我……说实话,我对此一无所知。有人能告诉我这怎么可能吗?或者我可以检查其他什么?syslog 和 dmesg 也没有提供任何线索。
编辑:断开连接的情况如下:
nslookup:
$ nslookup google.com
;; connection timed out; no servers could be reached
$
ping:
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
<... hangs forever>
^C
--- 8.8.8.8 ping statistics ---
195 packets transmitted, 0 received, 100% packet loss, time 195553ms
$
ping 网关:
$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
<... hangs forever>
^C
--- 192.168.0.1 ping statistics ---
47 packets transmitted, 0 received, 100% packet loss, time 46361ms
$
stackoverflow.com 上的 curl:
$ curl 198.252.206.16
<... hangs forever>
^C
$
答案1
感谢上面评论中的 Hrvoje Špoljar,我找到了解决方案。事实证明,在遵循以下方法后本指南,我的 rc.local 中有以下命令:
iptables -t nat -A POSTROUTING -j SNAT --to-source %SERVERIP% -o eth+
但 %SERVERIP% 是错误的 IP 地址。所以我的 iptables 中存在错误规则。不幸的是,ubuntu 上的 ufw “保护”您不看到这些更高级的规则,如您在上面的 iptables 输出中看到的那样。另一方面,如果您运行 iptables-save 命令,您将得到以下内容:
# Generated by iptables-save v1.4.21 on Fri Nov 14 21:19:16 2014
*nat
:PREROUTING ACCEPT [318:73010]
:INPUT ACCEPT [64:6615]
:OUTPUT ACCEPT [100:7122]
:POSTROUTING ACCEPT [48:2941]
-A POSTROUTING -s XX.XX.XX.XX/24 -o eth0 -j MASQUERADE
-A POSTROUTING -o eth+ -j SNAT --to-source YY.YY.YY.YY
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Fri Nov 14 21:19:16 2014
YY.YY.YY.YY
错误的 IP 地址在哪里。解决方法是使用以下命令删除此规则
iptables -t nat -D POSTROUTING -o eth+ -j SNAT --to-source YY.YY.YY.YY
并使用更加 DHCP 友好的:
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
其中 10.1.1.0/24 是给予 VPN 客户端的 IP 地址范围。