無法從外部 LAN 訪問網頁
我有一個執行 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>
如果
nmap
說filtered
,則某些防火牆存在問題。如果nmap
說closed
,那麼您的網路伺服器的配置存在問題。除此之外,我發現輸出
iptables --list
不是很有用。命令iptables --list --verbose
提供更多資訊。以第一條規則為例。似乎,所有數據包都被接受,但
--verbose
揭示了真相。您還可以在規則計數器的幫助下查看數據包是否被丟棄。接下來我會在你的網路伺服器上嘗試這個命令:
tcpdump -i eth0 dst port 80
為了查看是否有任何數據包到達您的伺服器。確保在此處使用適當的設備名稱。