我有一台运行 Apache 的 Ubuntu Server 14.04,它位于公司防火墙后面。上个月它一直运行良好,但现在服务器无法响应来自 LAN 外部的请求(防火墙进行端口转发)。现在我最初的想法是认为 Apache 出了问题,但当我尝试使用内部地址(192.168.8.10)访问服务器时,一切正常。当我尝试从本地网络进行 telnet 时:
$ telnet 192.168.8.10 80
Trying 192.168.8.10...
Connected to 192.168.8.10.
Escape character is '^]'.
服务器上的 Netstat 显示以下输出:
$netstat -n -c | grep "192.168.8.19:80"
tcp 0 0 192.168.8.10:80 192.168.8.250:49728 SYN_RECV
tcp 0 0 192.168.8.10:80 192.168.8.250:49728 SYN_RECV
tcp 0 0 192.168.8.10:80 192.168.8.250:49728 SYN_RECV
tcp 0 0 192.168.8.10:80 192.168.8.250:49728 SYN_RECV
tcp 0 0 192.168.8.10:80 192.168.8.250:49728 SYN_RECV
当我http://192.168.8.10
在浏览器中访问时,netstat 会生成:
$netstat -n -c | grep "192.168.8.19:80"
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 ESTABLISHED
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 ESTABLISHED
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 ESTABLISHED
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 ESTABLISHED
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 ESTABLISHED
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 FIN_WAIT2
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 FIN_WAIT2
tcp6 0 0 192.168.8.10:80 192.168.8.252:63798 FIN_WAIT2
现在,当我从 LAN 外部尝试执行此操作时,telnet 无法连接并且浏览器超时。
$ telnet 78.xx.xx.245 80
Trying 78.xx.xx.245...
这只是无限期挂起,但 netstat 仍然确认SYN_RECV
数据包。
$ netstat -n -c | grep "192.168.8.19:80"
tcp 0 0 192.168.8.10:80 194.xx.xx.62:52721 SYN_RECV
tcp 0 0 192.168.8.10:80 194.xx.xx.62:52721 SYN_RECV
tcp 0 0 192.168.8.10:80 194.xx.xx.62:52721 SYN_RECV
tcp 0 0 192.168.8.10:80 194.xx.xx.62:52721 SYN_RECV
浏览器测试不会在 netstat 中产生任何输出。
这让我认为问题出在防火墙的端口转发上。但是当我尝试将端口 80 转发到 Windows 服务器时,它工作得非常好。当我将端口 80 更改为转发回 Ubuntu 服务器时,问题仍然存在。telnet 测试实际上通过防火墙到达服务器,这一事实表明防火墙不是问题所在。
我的 IT 部门告诉我,过去几天防火墙的配置没有发生任何变化,我也没有对服务器进行任何更改。事实上,尝试将端口 80 转发到其他运行 apache 的 Ubuntu 桌面机器产生了相同的结果(尽管有 netstat 输出,但浏览器挂起并且 telnet 无法连接)。
其他端口已成功转发到防火墙后面的 Windows 服务器(转发到 Windows 服务器时 80 端口也能正常工作),因此我认为问题不在于 ISP。这似乎只是 Ubuntu 的问题。
有谁知道这可能是什么原因,因为这对我们来说现在是一个大问题?
答案1
当主机可以与 LAN 通信但不能与 LAN 外部通信时,最有可能出现的配置错误是网关 IP 地址不正确。
如果网关配置错误的主机是 TCP 连接的服务器端,则症状是 SYN 数据包被接收并接受,但由于网关地址不正确,SYN-ACK 数据包无法传送。这与您的问题中描述的症状一致。
一种糟糕的解决方法是在网关处对传入连接的源 IP 进行 NAT,这似乎是您的 IT 部门所做的。这不是一个好主意,因为您会在日志文件中丢失客户端 IP 地址,并且可能会引入额外的连接跟踪。但是,它可能看起来工作正常,因为服务器不再将数据包发送到客户端 IP 地址,而是发送到网关 IP 地址,因为它位于直接连接的网段上,所以不依赖于配置错误的默认网关。
在这种情况下,正确的解决方法是在服务器上配置正确的网关 IP 地址,并恢复在防火墙上应用的解决方法。
如果您的 Ubuntu 服务器配置了静态 IP 地址,则 IP 地址和网关地址均位于 中/etc/network/interfaces
。更改该文件将在下次重启时生效。
答案2
尝试 sudo ufw disable
还请检查 conf 文件中的 Apache 配置。 /etc/apache2/apache2.conf
例如:- /var/www
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted </Directory>
答案3
这曾是防火墙的配置问题。显然,防火墙规则有启用 NAT 以使端口转发正常工作。IT 部门向我保证,这是不是之前就已打开(尽管它之前一直有效),而且这似乎只有在将端口转发到 Linux 服务器时才会出现问题(即 Windows 服务器不需要在相关防火墙规则上启用 NAT,端口转发才能成功工作)。
编辑 这仅仅是问题的冰山一角。正如 kasperd 所指出的,问题出在服务器上的网关配置上。