Назад | Перейти на главную страницу

Tomcat и Java не слушают IPv6

У нас есть веб-сервер под управлением Ubuntu 12.04 LTS, Tomcat 7 и Oracle Java. До сих пор мы обслуживали веб-приложение на IPv4-адресе на портах 80 и 443 (80 перенаправляет на 443).

Я пытаюсь заставить Tomcat обслуживать одно и то же приложение на тех же портах также через IPv6. ОС настроена для IPv6 правильно, у нее есть собственные IPv6-адреса с глобальной областью действия.

Что не работает, так это то, что Tomcat / Java не прослушивает IPv6. Вот результат netstat -tlpn:

tcp        0      0 0.0.0.0:2222            0.0.0.0:*               LISTEN      957/sshd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2686/java
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN      1058/postgres
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1243/master
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      2686/java
tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN      2686/java
tcp6       0      0 :::2222                 :::*                    LISTEN      957/sshd
tcp6       0      0 :::5432                 :::*                    LISTEN      1058/postgres
tcp6       0      0 ::1:25                  :::*                    LISTEN      1243/master

Как видите, Java прослушивает только tcp-соединения, в то время как postgres и ssh принимают также tcp6-соединения на тех же портах, что и с IPv4.

Я нашел свойство java.net.preferIPv4Stack = true в сценарии запуска Tomcat, но когда я установил для него значение false, tomcat начал прослушивать ТОЛЬКО на tcp6 local, порт 8005. Мне нужно, чтобы он также прослушивал ::: 443 и: :: 80. Также он исчез из соединений IPv4, но я считаю, что ::: может связывать как IP v4, так и v6.

Должен заметить, что я не программист на Java, моя ответственность - только сам сервер. Также я не хочу много экспериментировать, так как это рабочий сервер.

Любая помощь приветствуется! Ура

--РЕДАКТИРОВАТЬ--

Вот полный файл server.xml без комментариев по умолчанию:

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

<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.core.JasperListener" />
  <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="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="443" />

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS"
       keystoreFile="/etc/tomcat7/ssl/tomcat.keystore" 
       keystorePass="secretpass"/>

<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="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

  </Host>
</Engine>

После нескольких часов исследований я обнаружил, что проблема в authbind. Он может привязать tomcat к портам ниже 1024 только для IPv4 и не работает для IPv6 (он должен работать с новыми ядрами, но на этой машине используется ядро ​​3.2).

Когда я отключил authbind в / etc / default / tomcat7 и изменил свой server.xml для прослушивания на 8080, затем перенаправил на 443 и прослушал 8443, tomcat начал прослушивать IPv6, как должен.

Перенаправление портов через iptables также возможно только для IPv4, поскольку ip6tables поставляется с поддержкой nat и перенаправлением только из ядра 3.7.

Затем я использовал демон под названием xinetd для перенаправления трафика с 80 на 8080 и с 443 на 8443. Теперь все работает как надо.