apache 監聽 80,但不監聽任何其他端口

apache 監聽 80,但不監聽任何其他端口

我想更改 example.com 的工作 apache 配置(exampleIP = 1.2.3.4 )以從預設連接埠 80 更改為連接埠 8001,這樣http://example.com:8001應該管用。我無法這樣做,並將記錄我的嘗試。我想我可能需要有關 iptables 的幫助。

我的 /etc/hosts 首先沒問題

1.2.3.4    example.com

我開始在以下地方將連接埠 80 替換為 8001

  1. /etc/apache2/ports.conf

    聽1.2.3.4:8001

  2. /etc/apache2/conf.d/virtual.conf

    名稱VirtualHost 1.2.3.4:8001

  3. /etc/apache2/sites-enabled/example.com

    <虛擬主機 1.2.3.4:8001>

          ServerName example.com:8001
          #UPDATE: ServerName example.com doesn't make a difference either
    

    </虛擬主機>

當我將上述 3 種情況中的 8001 替換為 80 時,它可以工作。我無法與 8001 建立連線。 tcpdump 也不顯示傳入要求。

由於 apache 守護程式重新啟動時沒有拋出任何錯誤,我嘗試確認網頁伺服器是否正在偵聽 8001

$ sudo lsof -i |grep 8001
apache2     731     root    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     734 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     736 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     737 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     738 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)
apache2     739 www-data    3u  IPv4 46858730       TCP example.com:8001 (LISTEN)

它似乎在監聽 8001。

$ sudo iptables -A INPUT -p tcp --dport 8001 -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --sport 8001 -j ACCEPT
$ sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied:  " --log-level 7

我從來沒有收到拒絕的日誌。這是 iptables 詳細模式顯示的內容

$ sudo iptables -L -v -n
Chain INPUT (policy ACCEPT 3052M packets, 785G bytes)
pkts bytes target     prot opt in     out     source               destination         
   25  1690 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8001 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8001 
   92  6484 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `iptables denied:  ' 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4317M packets, 695G bytes)
 pkts bytes target     prot opt in     out     source               destination         
   20  1760 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:8001 

我不熟悉 iptable 規則,所以上面我錯過的任何規則的提示都會很棒。閱讀其他線程我也想知道這是否是一個原因。

$ cat /proc/sys/net/ipv4/conf/eth0/forwarding 
0

鑑於此信息,有什麼提示可以阻止在 8001 上運行而不是在 80 上運行的網絡伺服器嗎?

更新1: 我嘗試刷新所有 iptable 規則

$ sudo iptables -X
$ sudo iptables -F

我還嘗試看看 tcpdump 是否捕獲了任何東西

 sudo tcpdump -i eth0 port 8001 -v

它不在 8001 上,但將連接埠更改為 80(再次在 ^ 3 處),它就可以了。

我試著尋找已建立的聆聽過程

$ netstat -an
tcp        0      1.2.3.4:8001            0.0.0.0:*               LISTEN   

最後,在我的本機上,我也嘗試了curl

curl http://1.2.3.4:8001 -v
* About to connect() to 1.2.3.4 port 8001 (#0)
*   Trying 1.2.3.4... No route to host
* couldn't connect to host
* Closing connection #0
curl: (7) couldn't connect to host

更新2

另外,我捕獲 iptables 錯誤的 /etc/log/messages 似乎拋出了以下內容。但事實證明,這些都是在你進入和退出tcpdump時出現的。

Jan 22 09:30:31 node1 kernel: device eth0 entered promiscuous mode
Jan 22 09:30:31 node1 kernel: audit(1264152631.798:54): dev=eth0 prom=256 old_prom=0 auid=4294967295
Jan 22 09:30:33 node1 kernel: device eth0 left promiscuous mode

更新3 在 tcpdump 常見問題上找到了這個

....這可能是因為您正在捕獲的介面已插入交換器;在交換網路上,單播流量兩個連接埠之間不一定會出現在其他連接埠上 - 只有廣播和多播流量將發送到所有連接埠...

...這表示如果您嗅探 10Mb 端口,你不會看到 流量發送到 100Mb 端口,反之亦然...

....如果您的電腦未插入交換網路或雙速集線器,或插入交換網路但連接埠設定為將所有流量複製到其中,則問題可能是網路介面您正在捕捉的 不支援「混雜」模式,或者因為您的作業系統無法將介面置於混雜模式...

總結一下這個特殊的案例:

  • iptables 已使用 -F、-X 刷新
  • apache 在 1.2.3.4:80 監聽時請求正常
  • tcpdump 在 1.2.3.4:8001 處偵聽 apache 時沒有擷取任何內容(請參閱更新 1,3 )

答案1

在步驟 3 中您提到

/etc/apache2/sites-enabled/example.com

<VirtualHost 1.2.3.4:80>伺服器名稱 example.com:8001 ...</VirtualHost>

這是不正確的。它應該是

<VirtualHost 1.2.3.4:8001>伺服器名稱 example.com ...</VirtualHost>

答案2

如果它不打擾您,請嘗試使用以下方式綁定到任何介面:

Listen 0.0.0.0:8001

伺服器名稱應該是:

ServerName example.com

其餘的保留為您已經配置的。請注意,NameVirtualHost 和 VirtualHost 必須有相同的簽章。因為它是基於名稱的虛擬主機,所以您需要使用瀏覽器在電腦上的主機檔案中新增如下行:

1.2.3.4 example.com

並用在http://example.com:8001/作為瀏覽器中的 URL(curl、wget、MSIE、Firefox)

用於調試使用:

tshark -V -i eth0 port 8001 or port 80

看看 error.log 和 access.log 中發生了什麼

答案3

Listen 不實現虛擬主機。 http://httpd.apache.org/docs/2.0/bind.html#virtualhost

加到 /etc/apache2/ports.conf 只監聽 8001

確保該包含位於 apache2.conf 檔案中包含虛擬主機之前。您也可以在包含行之前將 Listen 命令直接放入 apache2.conf 檔案中。

乾杯

答案4

當我聯繫託管人員時,這畢竟是防火牆問題。

將嘗試讓他們詳細說明他們實際上做了什麼來強制執行這一點。

最終成為一個很好的系統管理練習。感謝大家...

相關內容