Php

無法從外部 LAN 訪問網頁

  • June 19, 2016

我有一個執行 httpd、mysql、php 和 Joomla 2.5 的 CentOS 6.0 Web 伺服器。它有一個靜態的公共 IP 地址。我可以從區域網路內部通過 IP 地址完美訪問網頁(即 Joomla 管理控制台)。

我回家嘗試從路由器後面連接,但無法訪問網頁。我可以 ping 和 ssh 到伺服器,但無法使用 http 拉取網頁。我正在為我的瀏覽器使用 Chrome。

有什麼想法嗎?

編輯:

這是的輸出iptables --list

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere            udp spt:domain
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request
ACCEPT     icmp --  anywhere             anywhere            icmp echo-reply
ACCEPT     tcp  --  anywhere             anywhere            multiport dports ftp,ssh,http,https state NEW,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request
ACCEPT     icmp --  anywhere             anywhere            icmp echo-reply
ACCEPT     tcp  --  anywhere             anywhere            multiport sports ssh,http,https state ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http

好吧,自從我在 Apache 上遇到這樣的問題已經有好幾年了,但是在網際網路的中世紀,我們不得不在這樣的情況下使用詭計。

我們遇到的基本問題是一樣的。我的網路前面有一個公共 IP,我的 Apache 伺服器在 LAN 上使用一個私有 IP,負載均衡器正在將公共 IP 的請求轉發回一系列具有私有 IP 的伺服器。

使用 tcpdump,我們可以看到我們的 HTTP 請求正在發送到 Apache,但 Apache 沒有響應,因為請求進入“公共 IP”,而 Apache 認為它不應該響應這些請求,因為該IP不在其本地介面表中。

為我們解決的問題是將公共 IP 地址作為 IP 別名提供給環回介面,並帶有 /32 網路遮罩。 ifconfig lo0:1 <IP/32> up原來如此。這讓 Apache 相信它應該響應這些請求。

您需要確定您的外部請求是否到達了您的 Apache。如果他們甚至沒有進入伺服器,那麼您需要查看防火牆/路由器/acls。如果您看到帶有 的請求tcpdump,但在 Apache 中沒有,那麼您需要查看iptables. 如果您確實在 Apache 中看到了請求,但 Apache 沒有響應它們,您應該在 access_log 和 error_log 中有資訊,這些資訊將為您提供有關正在發生的事情的線索。

一開始我想在家看看這個命令的輸出:

nmap -p 80 <public ip of webserver>

如果nmapfiltered,則某些防火牆存在問題。如果nmapclosed,那麼您的網路伺服器的配置存在問題。

除此之外,我發現輸出iptables --list不是很有用。命令

iptables --list --verbose

提供更多資訊。以第一條規則為例。似乎,所有數據包都被接受,但--verbose揭示了真相。您還可以在規則計數器的幫助下查看數據包是否被丟棄。

接下來我會在你的網路伺服器上嘗試這個命令:

tcpdump -i eth0 dst port 80

為了查看是否有任何數據包到達您的伺服器。確保在此處使用適當的設備名稱。

引用自:https://unix.stackexchange.com/questions/48946