无法从本地家庭网络访问 Apache Web 服务器

无法从本地家庭网络访问 Apache Web 服务器

我正在运行 Trisquel 8(基于 Ubuntu)的桌面计算机上运行 Apache Web 服务器。我想让本地网络上的其他机器/设备可以访问服务器,但我不知道如何实现。

当我尝试使用 Apache 服务器的本地 IP 地址从另一台设备进行连接时,我在浏览器中收到错误消息,例如:在 Mac 上的 Firefox 中,我收到“无法连接”。 Firefox 无法建立与本地主机服务器的连接。'。如果我尝试在 Android 手机上使用 DuckDuckGo 浏览器进行连接,则会收到“网页不可用”的消息。网页位于http://本地主机/无法加载,因为:net::ERR_CONNECTION_REFUSED'。

nmap建议使用查看哪些端口打开的答案之一,它返回以下结果:

$ nmap [LOCAL IP ADDRESS]

Starting Nmap 7.01 ( https://nmap.org ) at 2019-10-12 09:25 EDT
Nmap scan report for [LOCAL IP ADDRESS]
Host is up (0.00013s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds

因此,它表明端口 80 对 http 开放。也许还值得一提的是,我可以从本地网络上的另一台机器 ping 通该机器,并且如 nmap 输出所示,我有另一个为 ssh 打开的端口。我已经通过 ssh 连接到这台机器几个月了,效果很好。为此,我刚刚安装了 ssh-server,它几乎开箱即用。

那么,考虑到 ssh 工作没有问题,这是否意味着 Apache2 设置(相对于 iptables/防火墙)有问题?

iptables的内容:

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http ctstate NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

apache2.conf 的内容:

# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.

# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
#       /etc/apache2/
#       |-- apache2.conf
#       |       `--  ports.conf
#       |-- mods-enabled
#       |       |-- *.load
#       |       `-- *.conf
#       |-- conf-enabled
#       |       `-- *.conf
#       `-- sites-enabled
#               `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
#   together by including all remaining configuration files when starting up the
#   web server.
#
# * ports.conf is always included from the main configuration file. It is
#   supposed to determine listening ports for incoming connections which can be
#   customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
#   directories contain particular configuration snippets which manage modules,
#   global configuration fragments, or virtual host configurations,
#   respectively.
#
#   They are activated by symlinking available configuration files from their
#   respective *-available/ counterparts. These should be managed by using our
#   helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
#   their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
#   the default configuration, apache2 needs to be started/stopped with
#   /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
#   work with the default configuration.


# Global configuration
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
Mutex file:${APACHE_LOCK_DIR} default

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5


# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log

#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn

# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# Include list of ports to listen on
Include ports.conf


# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
#       Require local
#       Require ip 192.168.1
        Require all granted
</Directory>

#<Directory /srv/>
#       Options Indexes FollowSymLinks
#       AllowOverride None
#       Require all granted
#</Directory>




# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#
AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>


#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我需要AllowOverride All下面的文件,/var/www因为我正在尝试运行 Wordpress 的实例,并且它需要能够写入 Apache 服务器。

Apache2 肯定正在运行,因为我可以从本地计算机上的浏览器使用“localhost”访问 Web 内容。另外,systemctl status apache2显示它正在运行:

~$ systemctl status apache2
● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Thu 2019-10-10 20:01:44 EDT; 5min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1562 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/apache2.service
           ├─1621 /usr/sbin/apache2 -k start
           ├─1624 /usr/sbin/apache2 -k start
           ├─1625 /usr/sbin/apache2 -k start
           ├─1626 /usr/sbin/apache2 -k start
           ├─1627 /usr/sbin/apache2 -k start
           ├─1628 /usr/sbin/apache2 -k start
           └─2102 /usr/sbin/apache2 -k start

Oct 10 20:01:42 lee-Desktop systemd[1]: Starting LSB: Apache2 web server...
Oct 10 20:01:42 lee-Desktop apache2[1562]:  * Starting Apache httpd web server apache2
Oct 10 20:01:43 lee-Desktop apache2[1562]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Oct 10 20:01:44 lee-Desktop apache2[1562]:  *
Oct 10 20:01:44 lee-Desktop systemd[1]: Started LSB: Apache2 web server.

正如评论中所建议的,我尝试过netstat --inet -a | grep apache2,但没有返回任何结果。显然,如果 apache2 正在运行,这是不寻常的,因为它应该在端口 80 上侦听。我运行netstat -plunt | grep :80并得到以下输出:

$ sudo netstat -plunt | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      1557/apache2    

这是否意味着 Apache 正在监听,但没有听到任何声音?

就同​​样请求的虚拟主机配置而言,唯一的文件/etc/apache2/sites-enabled/是 000-default.conf,其内容是:

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我也尝试过运行tail -f /var/log/apache2/*.log,但是当我尝试从远程计算机连接时,没有任何内容打印到日志中。

那么,如何排除阻止连接的原因呢?是否有任何地方的日志可以帮助我了解连接被拒绝的原因以及原因?

我尝试了雅各布在他的回答中提出的建议,但不幸的是它没有解决问题。任何其他建议或指导将不胜感激!

答案1

当我尝试从另一台设备连接时,使用本地IP地址Apache 服务器的

  • 请发布在服务器上以 root 身份运行的ip addr(或) 命令的输出ifconfig
  • 请指出具体是哪个本地IP地址您尝试从以下位置连接其他设备当时。
  • 请注明每个设备的 LAN IP 地址其他设备您在连接时使用。

原因如下,另见后记有关路由器和服务器配置的其他遥不可及的可能性


我确实在浏览器中输入了apache服务器的本地IP,但由于某种原因,在尝试连接并给出错误后,它显示http://localhost/在地址栏中

这闻起来真的很腥,它说本地IP地址你用来连接的方法是非常非常错误的。

  • 另一种解释:请求成功通过,但导致了无意义的 HTTP 重定向——请跳过阅读后记3号。

如果说本地IP地址有问题的是非常类似于127.0.0.1或 的内容::1,地址本身可能是问题的根本原因。因为这不是“真实”IP 地址...

  • IPv4 地址127.0.0.1或缩写 IPv6 地址::1 方法这个设备,并且主机名localhost始终在本地定义为该地址的同义词。

    • 当您尝试从服务器本身以外的任何设备连接到此地址时,您正在指示它连接到端口 80本身(不是服务器机器的80端口)。

    • 自从你的其他设备本身没有运行 HTTP 服务器,连接尝试肯定会以 TCPRST失败结束,即“连接被拒绝“您的浏览器出现错误。

补救措施:您必须使用正确的方法局域网IP地址从其他机器连接时:当然不是localhost,不是127.0.0.1,并且不是::1......

  1. ifconfig以 root 身份运行命令在服务器上,并查找未命名的块loIP 地址将是一个名为 的字段inet addr:

    • 如果服务器通过以下方式连接到本地网络金属丝,要使用的块将被命名,eth后跟数字,例如eth0
    • 如果服务器连接到本地网络无线地,要使用的块将被命名,wlan后跟数字,例如wlan0
    • 您使用的块必须还包含RUNNING状态(显示 LAN 连接已启用且可用)。
    • 有问题的地址应该是这样的192.168.xx、10.xxx 或范围从 172.16.xx 到 172.31.xx
  2. 尝试启动浏览器在服务器上,然后在地址栏中输入您在步骤 1 中找到的 IP 地址,然后按Enter

  3. 如果您的网页显示正确,请继续执行下一步。
  4. 另一个设备,确保它们连接到同一 LAN (不是蜂窝互联网)。
  5. 启动浏览器另一个设备,然后输入您在步骤 1 中找到的 IP 地址,按“Go”。
  6. 您的网页应该正确显示。

后记

如果您使用的 IP 地址正确,则可能还有其他不太明显的原因导致此问题,例如:

  1. 您的家庭路由器可能配置有“虚拟 LAN”或端口隔离— 这会将每个 LAN 端口和每个无线 LAN 设备隔离在自己的小网络中。每个设备都受到限制并且无法互相连接(并且只允许直接访问互联网)。

    • 在此配置中,理论上可以在每个虚拟 LAN 中,每个设备都已分配同一个 IP 地址。因此,当您在另一台设备中输入“服务器的 IP 地址”时,结果“巧合”地与设备自己的 LAN IP 地址相同——指示它连接到本身它不运行 HTTP 服务器 — 导致“连接被拒绝“ 错误。
    • 如果是这种情况,请禁用路由器上的端口隔离和虚拟 LAN 选项。
  2. 您的家庭路由器可能包含三层交换机功能并配置访问控制列表(即防火墙)以拒绝到任何专用 LAN IP 地址的任何“传入连接”,无论流量来源如何

    因此,当您的设备尝试连接到服务器时,路由器(或更确切地说,交换机)会拦截并使用 TCP 进行回复,RST从而导致“连接被拒绝“ 错误。

    • 如果是这种情况,请更改路由器的访问控制列表,使其仅适用于源自 Internet/PPPoE 的流量;或为本地 IP 地址范围提供适当的例外。
  3. 您的服务器上可能有某些东西会产生 HTTP 301/302 重定向到http://localhost/.这可以解释为什么你的其他设备localhost即使您输入真实的 LAN IP 地址,也会显示在地址栏中。

    即,第一个请求顺利;但由于服务器或服务器端脚本上发生了一些错误配置/误解,客户端被重定向到http://localhost/,这是一个不正确的地址,原因已在答案的主要部分中列出......

    最终结果是“连接被拒绝“第二个请求中出现错误,并且http://localhost/位于地址栏中。

    不要用浏览器调试这个,因为 HTTP 301 重定向已被缓存。使用GNUwget或类似的工具来发出请求其他设备,并仔细查看其输出。如果您看到重定向状态出现在“连接被拒绝“错误——那么这不是网络问题,而是服务器问题。

    如果发生这种情况,您将需要找出导致服务器产生重定向的原因并修复它。

    • 如果您从其他地方获得此 Web 根目录,它可能包含一个配置,当发现客户端使用非规范主机名访问它时,该配置会产生重定向。 (这很常见,就像当你去www.stackexchange.com,它会产生一个 HTTP 301 重定向到stackexchange.com

      如果您的 Web 应用程序认为其规范主机名是公正的localhost,那么它会无意中产生到 的有问题的重定向http://localhost/

      在这种情况下,请特别检查您.htaccess和应用程序的配置;然后禁用所述重定向。

答案2

首先,检查 httpd 是否正在运行sudo systemctl status httpd。在我们不小心添加重复规则之前,让我们检查一下 iptables 规则:iptables -L

为了确保我们接受所有传入的 http,让我们在表中添加一个 ACCEPT

sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

如果这不能解决问题,请务必检查 中找到的 apache 设置/etc/apache2/apache2.conf。我们应该在conf文件的底部有一个基本的安全模型。例如,这是在我的中找到的

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>

        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

在 ports.conf 中,确保我们正在所有设备上侦听端口 80(目前直到我们完成设置为止)Listen *:80

如果这些都没有引起问题,请检查 apache2 是否也在运行

答案3

当我尝试使用 Apache 服务器的本地 IP 地址从另一台设备进行连接时,我在浏览器中收到错误消息,例如:在 Mac 上的 Firefox 中,我收到“无法连接”。 Firefox 无法与服务器建立连接本地主机.'.如果我尝试在 Android 手机上使用 DuckDuckGo 浏览器进行连接,则会收到“网页不可用”的消息。网页位于http://本地主机/ 无法加载,因为:net::ERR_CONNECTION_REFUSED'。

如果你使用本地主机作为其他计算机的主机名,它们尝试连接到自己...在其他计算机上,您必须使用服务器的实际地址。所以

  • 在您的服务器上执行以下操作:ip address show这将列出您的所有网络接口和地址(inet如下所示的行inet 192.168.0.44/24 brd 192.168.0.255 scope global dynamic enp0s31f6:)。忽略该lo接口(即地址 127.0.0.1 处的接口),并使用enp*wlp*。这些地址可能以以下开头192.168...
  • inet使用Mac/或 Android 上的线路中的地址:http://192.168.0.44/

直接使用地址有两个不方便的地方:

  1. 它可能会改变(尽管通常,只要地址比计算机多,计算机就会被重新分配相同的地址)
  2. 这并不是真正的助记符。

在 Mac 上,您可以通过在文件中添加服务器名称和地址/etc/hosts(或 OSX 上的任何等效项)来解决问题#2。这在 Android 上可能不可行。

对于#1,如果您非常幸运,您的所有设备都支持 NETBIOS 名称解析,并且您可以使用它们的 NETBIOS 名称(通常是它们的主机名)。

答案4

我曾经遇到过同样的问题,我认为您正在使用虚拟机设置本地网络服务器。如果您正在这样做,请检查您的网络服务器的防火墙配置。

如果您能够从同一台计算机访问 Apache 服务器,并且在从远程计算机访问该服务器时出现错误,那么请允许 apache 在防火墙中在网络服务器中。

运行下面提到的命令(它在 CentOS-7 上有效)

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

让我们知道您是否仍然面临同样的问题。

相关内容