我想更改 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
/etc/apache2/ports.conf
聽1.2.3.4:8001
/etc/apache2/conf.d/virtual.conf
名稱VirtualHost 1.2.3.4:8001
/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
當我聯繫託管人員時,這畢竟是防火牆問題。
將嘗試讓他們詳細說明他們實際上做了什麼來強制執行這一點。
最終成為一個很好的系統管理練習。感謝大家...