Apache は 80 番ポートで listen していますが、他のポートでは listen していません

Apache は 80 番ポートで listen していますが、他のポートでは listen していません

私は、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. ポート

    1.2.3.4:8001を聴く

  2. 仮想ファイル

    名前仮想ホスト 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デーモンを再起動してもエラーが発生しなかったため、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

ホスティング担当者に連絡したところ、結局ファイアウォールの問題であることがわかりました。

これを強制するために実際に何をしたのかを詳しく説明してもらおうと思います。

最終的には、システム管理者にとって良い練習になりました。皆さん、ありがとう...

関連情報