CentOS 7 웹 서버에서 실행되는 애플리케이션을 직접 노출하는 방법은 무엇입니까?

CentOS 7 웹 서버에서 실행되는 애플리케이션을 직접 노출하는 방법은 무엇입니까?

CentOS 7의 tomcat에서 실행되는 웹 애플리케이션에 포트를 열고 직접 액세스하는 방법은 무엇입니까? Tomcat은 Apache httpd 역방향 프록시 뒤에서 실행되지만 테스트를 위해 각 애플리케이션을 직접 노출하기 위해 포트를 열어 Tomcat에서 실행 중인 애플리케이션에 직접 액세스하고 싶습니다.

firewall-cmd --add-port=8080/tcp방화벽에서 포트 8080 및 8081을 사용하고 열 때 또는 또는 를 입력하면 firewall-cmd --add-port=8081/tcp해당 포트에서 실행되는 응용 프로그램에 액세스할 수 있습니다. httpd를 통해 이러한 애플리케이션에 액세스하면 해당 애플리케이션에도 액세스할 수 있습니다. server.ip.addr:8080server.ip.addr:8081anydomainontheserver.com:8080anydomainontheserver.com:8081

그러나 포트 8082, 8083 및 8084에서 실행되는 애플리케이션에 직접 액세스하려고 하면 404 오류 응답을 받습니다. 이는 포트 8082 및 8083에서 실행되는 응용 프로그램이 해당 도메인 이름을 통해 httpd를 통해 100% 액세스할 수 있는 경우에도 마찬가지입니다. 포트 8084에서 실행되는 애플리케이션은 대부분 도메인 이름을 통해 httpd를 통해 액세스할 수 있습니다. 각각의 경우에 및를 firewall-cmd --add-port=808x통해 애플리케이션에 접속하고 액세스를 시도했지만 각 경우에 404 오류가 발생했습니다. 방화벽에서 ajp 포트를 열고 브라우저에 입력을 시도했지만 오류 번호를 지정하지 않으면 페이지를 검색할 수 없다는 브라우저 오류가 발생했습니다.server.ip.addr:808xanydomainontheserver.com:808xserver.ip.addr:80xxanydomainontheserver.com:80xx

그렇다면 테스트를 위해 Tomcat을 통해 포트 8082, 8083 및 8084에서 실행되는 애플리케이션에 직접 액세스하는 방법은 무엇입니까?

입력하면 firewall-cmd --list-all다음이 제공됩니다.

public (default, active)
  interfaces: enp3s0
  sources: 
  services: dhcpv6-client http imaps openvpn smtp ssh
  ports: 8009/tcp 8083/tcp 8011/tcp 8084/tcp 8010/tcp 8080/tcp 8081/tcp 8013/tcp 8012/tcp 8082/tcp
  masquerade: yes
  forward-ports: 
  icmp-blocks: 
  rich rules:

입력하면 nano /etc/httpd/conf.d/virtualhosts.conf다음이 제공됩니다.

<VirtualHost *:443>
    ServerName www.vpndomain.com
    ServerAlias vpndomain.com
    ErrorLog /var/log/httpd/vpndomain_com_error.log
    CustomLog /var/log/httpd/vpndomain_com_requests.log combined
    SSLEngine on
    SSLProxyEngine on
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    ProxyPass / ajp://server.ip.addr:8009/
    ProxyPassReverse / ajp://server.ip.addr:8009/
</VirtualHost>

Listen 444

<VirtualHost *:444>
    ServerName www.vpndomain.com
    ServerAlias vpndomain.com
    ErrorLog /var/log/httpd/vpndomain_com_error.log
    CustomLog /var/log/httpd/vpndomain_com_requests.log combined
    SSLEngine on
    SSLProxyEngine on
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    ProxyPass / ajp://server.ip.addr:8010/
    ProxyPassReverse / ajp://server.ip.addr:8010/
</VirtualHost>

<VirtualHost www.domain1.com:80>
    ServerName www.domain1.com
    ServerAlias domain1.com
    ErrorLog /var/log/httpd/domain1_com_error.log
    CustomLog /var/log/httpd/domain1_com_requests.log combined
    ProxyPass / ajp://server.ip.addr:8011/
    ProxyPassReverse / ajp://server.ip.addr:8011/
</VirtualHost>

<VirtualHost www.domain2.com:80>
    ServerName www.domain2.com
    ServerAlias domain2.com
    ErrorLog /var/log/httpd/domain2_com_error.log
    CustomLog /var/log/httpd/domain2_com_requests.log combined
    ProxyPass / ajp://server.ip.addr:8012/
    ProxyPassReverse / ajp://server.ip.addr:8012/
</VirtualHost>

<VirtualHost www.domain3.com:80>
    ServerName www.domain3.com
    ServerAlias domain3.com
    ErrorLog /var/log/httpd/domain3_com_error.log
    CustomLog /var/log/httpd/domain3_com_requests.log combined
    ProxyPass / ajp://server.ip.addr:8013
    ProxyPassReverse / ajp://server.ip.addr:8013
</VirtualHost>

`nano /opt/tomcat/conf/server.xml을 입력하면 다음이 제공됩니다.

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
              <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
          </Realm>
          <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
               <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                   prefix="ermapp_access_log" suffix=".txt"
                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>
    </Engine>
  </Service>

  <Service name="Upload">
    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps_upload" unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="uploadapp_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>

  <Service name="Public">
      <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" />
      <Connector port="8011" protocol="AJP/1.3" redirectPort="8445" />
      <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
              <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
          </Realm>
          <Host name="domain1.com"  appBase="webapps_public" unpackWARs="true" autoDeploy="true">
              <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                  prefix="domain1_access_log" suffix=".txt"
                  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>
      </Engine>
  </Service>

  <Service name="domain2">
      <Connector port="8083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8446" />
      <Connector port="8012" protocol="AJP/1.3" redirectPort="8446" />
      <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
              <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
          </Realm>
          <Host name="domain2.com"  appBase="webapps_domain2" unpackWARs="true" autoDeploy="true">
              <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                  prefix="domain2_access_log" suffix=".txt"
                  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>
      </Engine>
  </Service>

  <Service name="domain3">
      <Connector port="8084" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8447" />
      <Connector port="8013" protocol="AJP/1.3" redirectPort="8447" />
      <Engine name="Catalina" defaultHost="localhost">
          <Realm className="org.apache.catalina.realm.LockOutRealm">
              <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
          </Realm>
          <Host name="domain3.com"  appBase="webapps_domain3" unpackWARs="true" autoDeploy="true">
              <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                  prefix="domain3_access_log" suffix=".txt"
                  pattern="%h %l %u %t &quot;%r&quot; %s %b" />
          </Host>
      </Engine>
  </Service>

</Server>

답변1

httpd 프록시는 AJP 포트를 사용하고 있지만 직접 액세스하려고 하면 HTTP 포트를 사용하고 있는 것입니다.

HTTP 포트를 사용하기 위해 httpd 프록시를 전환하려고 하면 계속 작동합니까, 아니면 404가 발생합니까?

  • HTTP를 사용하여 프록시할 때 httpd를 통해 404를 수신하면 Tomcat의 HTTP 커넥터에 문제가 있는 것입니다.

  • 프록시에서 HTTP 포트를 사용할 때 여전히 httpd를 통해 작동한다면 문제는 애플리케이션 자체 내부에 있을 수 있습니다.

답변2

목표를 달성하는 보다 안전한 방법은 SSH 터널링을 이용하는 것입니다. Tomcat이나 프록시에 대한 구성은 변경되지 않습니다. 클라이언트와 Tomcat 서버 사이에 SSH 터널을 생성하고 이러한 애플리케이션이 로컬 클라이언트 시스템에서 실행되는 것처럼 로컬로 포트에 액세스하기만 하면 됩니다. TCP 포트 8082, 8083 및 8084에서 Tomcat을 수신하는 세 가지 서비스가 있습니다. 따라서 3개의 SSH 터널이 생성됩니다. Tomcat의 IP 주소가 10.10.10.254이고 사용자가 bob이라고 가정합니다.

다음과 같이 클라이언트 시스템에서 3개의 SSH 터널을 만듭니다.

$ ssh -fnN -L 8082:localhost:8082 [email protected]
$ ssh -fnN -L 8083:localhost:8083 [email protected]
$ ssh -fnN -L 8084:localhost:8084 [email protected]

이 세 가지 애플리케이션이 웹 애플리케이션이라고 가정하고 클라이언트 컴퓨터에서 웹 브라우저를 열고 다음으로 이동합니다.

http://localhost:8082
http://localhost:8083
http://localhost:8084

관련 정보