아파치는 80에서 수신 대기하지만 다른 포트에서는 수신하지 않음

아파치는 80에서 수신 대기하지만 다른 포트에서는 수신하지 않음

example.com(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
    

    </VirtualHost>

위 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을 듣는 것 같았습니다. 심지어 다음과 같은 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

이 정보를 바탕으로 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 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에서 이것을 찾았습니다.

...캡처하는 인터페이스가 스위치에 연결되어 있기 때문일 수 있습니다. 교환 네트워크에서 유니캐스트 트래픽두 포트 사이에 반드시 나타나지는 않습니다.다른 포트에서는 브로드캐스트 및 멀티캐스트 트래픽만 모든 포트로 전송됩니다.

...10Mb 포트를 스니핑하면너는 보지 못할 것이다 트래픽이 100Mb 포트로 전송되고 그 반대의 경우도 마찬가지입니다.

...컴퓨터가 교환 네트워크나 이중 속도 허브에 연결되어 있지 않거나, 교환 네트워크에 연결되어 있지만 포트가 모든 트래픽을 복제하도록 설정된 경우 네트워크 인터페이스에 문제가 있을 수 있습니다. 당신이 캡처하는 곳 "무차별" 모드를 지원하지 않습니다또는 OS가 인터페이스를 무차별 모드로 전환할 수 없기 때문에...

그래서 이 특이한 사례를 요약하자면 다음과 같습니다.

  • iptables가 -F, -X로 플러시되었습니다.
  • 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은 다음과 같아야 합니다.

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에 추가하세요. Listen 8001

apache2.conf 파일에 가상 호스트를 포함하기 전에 포함이 있는지 확인하십시오. 행을 포함하기 바로 전에 Listen 명령을 apache2.conf 파일에 직접 넣을 수도 있습니다.

건배

답변4

호스팅 담당자에게 연락했을 때 결국 방화벽 문제였습니다.

그들이 실제로 이것을 시행하기 위해 무엇을 했는지 자세히 설명하도록 노력할 것입니다.

결국 좋은 시스템 관리자 연습이 되었습니다. 모두 고마워요...

관련 정보