IPTable 및 포트 리디렉션 Apache2

IPTable 및 포트 리디렉션 Apache2

나는 Apache를 사용하여 하위 도메인을 포트(,,)로 리디렉션하고 mod_proxyIP mod_proxy_http테이블 을 사용하여 mod_proxy_ajp나와 로컬 서버를 제외한 직접 포트 액세스를 제한하고 있습니다.

내 IP 테이블은 다음과 같습니다.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:tproxy
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:tproxy
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:http-alt
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:webmin
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:webmin

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

이 게시물에서 제가 사용할 컨텍스트는 다음과 같습니다.

소나타입 넥서스:nexus.example.com => example.com:8081

젠킨스 CI:jenkins.example.com => example.com:8080

웹민:webmin.example.com => example.com:10000

지금 내가 하고 있는 작업은 나 외에는 직접 포트에 액세스할 수 없습니다. 나는 또한 로컬 시스템이 현재 가지고 있는 포트에 액세스할 수 있기를 원합니다. 저는 mod_proxy_ajpJenkins CI와 Webmin, mod_proxy_httpSonatype Nexus를 사용하고 있습니다.

직접 포트를 방문하면 이러한 각 서비스가 제대로 로드됩니다. 다른 사람에게 각각 로드하도록 요청했는데 로드할 수 없으므로 작동합니다.

그러나 이제 하위 도메인 중 하나에 액세스하려고 하면 끝없는 로드가 발생합니다(무한 루프?).

하지만 하위 도메인에서 Tracert를 실행하면 정상적으로 종료되므로 무한 루프를 지울 수 있습니다.

내 Sonatype Nexus Apache 가상 호스트 구성은 다음과 같습니다.

<VirtualHost *:80>
        ServerName nexus.majornoob.com
        ServerAlias www.nexus.majornoob.com
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/
        ProxyPassReverseCookiePath / /
        ErrorLog /var/www/majornoob/error-nexus.log
        LogLevel warn
        CustomLog /var/www/majornoob/access-nexus.log combined
</VirtualHost>

여기 내 Jenkins가 있습니다.

<VirtualHost *:80>
        ServerName jenkins.majornoob.com
        ServerAlias www.jenkins.majornoob.com
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / ajp://127.0.0.1:8080/
        ProxyPassReverse / ajp://127.0.0.1:8080/
        ProxyPassReverseCookiePath / /

        ErrorLog /var/www/majornoob/error-jenkins.log

        LogLevel warn

        CustomLog /var/www/majornoob/access-jenkins.log combined
</VirtualHost>

가상 호스트의 두 가지 예는 각각 mod_proxy_ajp및를 사용하고 있습니다 mod_proxy_http.

무한 로드가 발생하는 이유를 알아내도록 도와줄 수 있는 사람이 있나요?

감사해요.

편집하다:무한 루프에 신경쓰지 마세요. 얼마 후 503 Service Unavailable 오류가 발생했습니다.

답변1

iptables 규칙은 인쇄된 대로 위에서 아래로 순서대로 평가됩니다. 문제는 프록시 연결이 다음 규칙과 일치하는 localhost에서 온다는 것입니다.

DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:tproxy

localhost가 아니므 c-24-7-...로 연결이 끊어집니다. 프록시 모듈은 결국 시간 초과됩니다. 규칙이 DROP 대신 REJECT인 경우 오류가 훨씬 더 빨리 발생합니다(연결 시도가 사라지는 대신 명시적으로 거부되기 때문입니다).

해결책은 매우 간단합니다. "다른 곳에서 거부"하기 전에 "localhost에서 승인"을 갖도록 규칙을 재정렬하는 것입니다. (IP 라우팅은 가장 구체적으로 일치하지만 iptables는 다중 요소이므로 반드시 정의되지는 않습니다.)

나는 일반적으로 모든 로컬 호스트 통신을 허용하는 첫 번째 규칙을 갖는 것을 권장합니다(누군가 이더넷을 통해 이상한 것을 시도하는 경우를 대비해 루프백 인터페이스를 통해). 추가해 보세요

iptables -I INPUT -i lo -s localhost -d localhost -j ACCEPT

-I( )를 목록 상단에 삽입합니다 .

관련 정보