私は、example.com(exampleIP = 1.2.3.4)の稼働中のApache構成を、デフォルトのポート80からポート8001に変更したいと考えていました。http://example.com:8001動作するはずです。私はそれができなかったので、私が試みたことを文書化します。iptables に関する支援が必要かもしれないと思います。
私の/etc/hostsはまず大丈夫です
1.2.3.4 example.com
まず、以下の場所でポート80を8001に置き換えました。
ポート
1.2.3.4:8001を聴く
仮想ファイル
名前仮想ホスト 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デーモンを再起動してもエラーが発生しなかったため、Webサーバーが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 で listen しているようでした。次の iptable ルールをターミナルに適用しようとしました。
$ 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 verbose モードで表示される内容は次のとおりです。
$ 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
この情報を踏まえると、Web サーバーが 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 の FAQ で見つけた
...これは、キャプチャしているインターフェースがスイッチに接続されているためかもしれません。スイッチネットワークでは、ユニキャストトラフィック2つのポート間の接続は必ずしもその他のポートでは、ブロードキャストおよびマルチキャスト トラフィックのみがすべてのポートに送信されます...
...つまり、10Mbのポートをスニッフィングすると、あなたは見ないでしょう 着信トラフィックは 100Mb ポートに送信され、その逆も同様です...
...マシンがスイッチドネットワークやデュアルスピードハブに接続されていない場合、またはスイッチドネットワークに接続されているが、ポートがすべてのトラフィックを複製するように設定されている場合は、キャプチャしているネットワークインターフェイスに問題がある可能性があります。 「無差別」モードをサポートしていませんまたは、OS がインターフェイスを無差別モードに設定できないためです...
この特異なケースを要約すると次のようになります。
- iptablesは-F、-Xでフラッシュされました
- 1.2.3.4:80 で Apache がリッスンするとリクエストは正常です
- tcpdump は 1.2.3.4:8001 で apache を listen している状態では何もキャッチしません (UPDATE 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 は次のようになります。
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#仮想ホスト
/etc/apache2/ports.confにListen 8001を追加する
apache2.conf ファイル内の仮想ホストの include の前に include があることを確認してください。また、include 行の直前に、Listen コマンドを apache2.conf ファイルに直接配置することもできます。
乾杯
答え4
ホスティング担当者に連絡したところ、結局ファイアウォールの問題であることがわかりました。
これを強制するために実際に何をしたのかを詳しく説明してもらおうと思います。
最終的には、システム管理者にとって良い練習になりました。皆さん、ありがとう...